【线段树】 HDOJ 4027 Can you answer these queries?

来源:互联网 发布:王啸坤 长白山 知乎 编辑:程序博客网 时间:2024/06/02 08:51

想了好久的线段树,用到的思想好巧妙,因为最大是2的63次方,所以开了个6,7次的平方就全变成一了。。。。比较好写的一种方法是直接用不加lazy的线段树更新区间,然后加一个当sum=R-L+1就不更新的剪枝。。。。我的代码是每加一次开根就pushdown,达到7次以后就不更新了。。。

#include <iostream>#include <sstream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <climits>#define maxn 400005#define eps 1e-7#define mod 1000000007#define INF 99999999#define lowbit(x) (x&(-x))typedef long long LL;using namespace std;struct node{int mark, cnt;LL v;}segtree[maxn];LL num[maxn];int n, m;LL ans;int ql, qr;void build(int o, int L, int R){segtree[o].mark=0;segtree[o].cnt=0;if(L==R){segtree[o].v=num[L];return;}int mid=(R+L)/2;build(2*o, L, mid);build(2*o+1, mid+1, R);segtree[o].v=segtree[2*o].v+segtree[2*o+1].v;}void pushdown(int o, int L, int R){if(!segtree[o].mark || segtree[o].cnt>=6) return;if(L==R){segtree[o].cnt+=segtree[o].mark;segtree[o].v=sqrt(segtree[o].v);segtree[o].mark=0;return;}segtree[2*o].mark+=segtree[o].mark;segtree[2*o+1].mark+=segtree[o].mark;segtree[o].cnt+=segtree[o].mark;segtree[o].mark=0;int mid=(R+L)/2;pushdown(2*o, L, mid);pushdown(2*o+1, mid+1, R);segtree[o].v=segtree[2*o].v+segtree[2*o+1].v;}void query(int o, int L, int R){if(ql<=L && qr>=R){ans+=segtree[o].v;return;}int mid=(L+R)/2;if(ql<=mid) query(2*o, L, mid);if(qr>mid) query(2*o+1, mid+1, R);}void updata(int o, int L, int R){if(ql<=L && qr>=R){segtree[o].mark++;pushdown(o, L, R);return;}int mid=(L+R)/2;if(ql<=mid) updata(2*o, L, mid);if(qr>mid) updata(2*o+1, mid+1, R);segtree[o].v=segtree[2*o].v+segtree[2*o+1].v;}void solve(void){int k;while(m--){scanf("%d%d%d",&k,&ql,&qr);if(qr<ql) swap(qr, ql);if(k){ans=0;query(1, 1, n);printf("%I64d\n", ans);}else updata(1, 1, n);}}int main(void){int i, _=0;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++) scanf("%I64d",&num[i]);scanf("%d",&m);build(1, 1, n);printf("Case #%d:\n", ++_);solve();printf("\n");}return 0;}

0 0
原创粉丝点击