线段树嘛。。。很基本的一种数据结构啦
lazytag优化能不错的提高效率
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX=1000000; 4 struct pr { 5 int sum; 6 int lazy; 7 int left,right; 8 }tr[MAX+10]; 9 int n; 10 inline int ll(int k) {return 2*k;} 11 inline int rr(int k) {return 2*k+1;} 12 inline int mid(int kk1,int kk2) {return (kk1+kk2)>>1;} 13 void pushdown(int k) { 14 if (tr[k].lazy) { 15 tr[ll(k)].sum=tr[k].lazy*(tr[ll(k)].right-tr[ll(k)].left+1); 16 tr[rr(k)].sum=tr[k].lazy*(tr[rr(k)].right-tr[rr(k)].left+1); 17 tr[ll(k)].lazy=tr[rr(k)].lazy=tr[k].lazy; 18 tr[k].lazy=0; 19 } 20 } 21 22 void build(int k,int s,int t) { 23 tr[k].left=s;tr[k].right=t; 24 if(s==t) {tr[k].sum=1;return;} 25 build(ll(k),s,mid(s,t)); 26 build(rr(k),mid(s,t)+1,t); 27 tr[k].sum=tr[ll(k)].sum+tr[rr(k)].sum; 28 } 29 30 void modify(int k,int s,int t,int x) { 31 int l=tr[k].left,r=tr[k].right; 32 if(t<l||r<s) { 33 tr[k].lazy=x; 34 tr[k].sum=x*(r-l+1); 35 return ; 36 } 37 pushdown(k); 38 int mi=mid(l,r); 39 if(t<=mi) modify(ll(k),s,t,x); 40 else if(s>mi) modify(rr(k),s,t,x); 41 else { 42 modify(ll(k),s,mi,x); 43 modify(rr(k),mi+1,t,x); 44 } 45 tr[k].sum=tr[ll(k)].sum+tr[rr(k)].sum; 46 } 47 int query(int k,int s,int t) { 48 int l=tr[k].left,r=tr[k].right; 49 if(l==s&&r==t) return tr[k].sum; 50 pushdown(k); 51 int mi=mid(l,r); 52 int res=0; 53 if (t<=mi) res+=query(ll(k),s,t); 54 else if(s>mi) res+=query(rr(k),s,t); 55 else res+=query(ll(k),s,mi)+query(rr(k),mi+1,t); 56 return res; 57 }