HDU 4027 线段树 Can you answer these queries?
2017-06-24 19:35
211 查看
这个意思就是给你n个数,然后有两种操作
0 x y 表示从x到y,每个数都开根号
1 x y 表示输出x到y的和
这个题的话,是区间更新,如果我们直接更新到点的话,时间复杂度是n^2,然后n可以到10^5,就会超时,用lazy,不更新到点?可是我们查询的时候还是要更新到点的啊,因为我们查的是和,他们每个数具体的值可能都是不相同的。
因为每个 数都不会超过2^63,然后我们发现,用不了几次,他们就会变成1。所以,还是更新到点,然后加一个判断就行了,如果那个区间的值都为1了,我们就不用继续向下更新了。
其中有个坑点。。就是他说,在x ,y之间,并没有说x与y的相对大小关系。。
0 x y 表示从x到y,每个数都开根号
1 x y 表示输出x到y的和
这个题的话,是区间更新,如果我们直接更新到点的话,时间复杂度是n^2,然后n可以到10^5,就会超时,用lazy,不更新到点?可是我们查询的时候还是要更新到点的啊,因为我们查的是和,他们每个数具体的值可能都是不相同的。
因为每个 数都不会超过2^63,然后我们发现,用不了几次,他们就会变成1。所以,还是更新到点,然后加一个判断就行了,如果那个区间的值都为1了,我们就不用继续向下更新了。
其中有个坑点。。就是他说,在x ,y之间,并没有说x与y的相对大小关系。。
#include <iostream> #include <cstring> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1e5+5; long long v[maxn<<2],lazy[maxn<<2]; void build(int i,int l,int r) { v[i]=0,lazy[i]=0; if(l==r) { scanf("%I64d",&v[i]); return ; } int mid=(l+r)>>1; build(i<<1,l,mid); build(i<<1|1,mid+1,r); v[i]=v[i<<1]+v[i<<1|1]; } void sert(int i,int x,int y,int l,int r) { if(v[i]==(r-l+1)) return ; if(l==r) { v[i]=floor(sqrt(v[i])); return ; } int mid=(l+r)>>1; if(lazy[i]) { lazy[i<<1]=lazy[i],lazy[i<<1|1]=lazy[i]; } if(y<=mid) sert(i<<1,x,y,l,mid); else if(x>=(mid+1)) sert(i<<1|1,x,y,mid+1,r); else { sert(i<<1,x,mid,l,mid); sert(i<<1|1,mid+1,y,mid+1,r); } v[i]=v[i<<1]+v[i<<1|1]; } long long sum=0; void query(int i,int x,int y,int l,int r) { if(x==l&&y==r) { sum+=v[i]; return ; } int mid=(l+r)>>1; if(y<=mid) query(i<<1,x,y,l,mid); else if(x>=(mid+1)) query(i<<1|1,x,y,mid+ a85e 1,r); else { query(i<<1,x,mid,l,mid); query(i<<1|1,mid+1,y,mid+1,r); } } int main() { // freopen("E:\\input.txt","r",stdin); int n; int case1=1; while(scanf("%d",&n)!=EOF) { build(1,1,n); int m; printf("Case #%d:\n",case1++); scanf("%d",&m); for(int i=0;i<m;i++) { int a,x,y; scanf("%d %d %d",&a,&x,&y); if(x>y) swap(x,y); if(a==0) sert(1,x,y,1,n); else { sum=0; query(1,x,y,1,n); printf("%I64d\n",sum); } } printf("\n"); } return 0; }
相关文章推荐
- HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)
- HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
- HDU 4027 Can you answer these queries?(线段树)
- hdu 4027 Can you answer these queries? 线段树
- HDU 4027 Can you answer these queries? 线段树 区间修改 区间查询
- 【HDU】4027 Can you answer these queries? (线段树)
- hdu 4027 Can you answer these queries? 线段树特殊更新节点
- HDU 4027 Can you answer these queries?(线段树)
- HDU 4027 Can you answer these queries(线段树 成段更新)
- hdu-4027-Can you answer these queries?-线段树
- HDU 4027 Can you answer these queries? (线段树)
- HDU 4027 Can you answer these queries ? ( 线段树 )
- HDU 4027 Can you answer these queries? (线段树+区间点修改)
- HDU 4027 Can you answer these queries (线段树求和)
- hdu 4027 Can you answer these queries? 线段树
- HDU 4027 Can you answer these queries? 线段树
- hdu 4027 Can you answer these queries? 线段树
- HDU 4027 Can you answer these queries(线段树)
- HDU 4027 —— Can you answer these queries?(线段树)
- Hdu 4027 Can you answer these queries?(线段树)