线段树嘛。。。很基本的一种数据结构啦

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 }
View Code

相关文章: