标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25414 Accepted Submission(s):
12686
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define M 100010 5 using namespace std; 6 struct node 7 { 8 int l,r,s; 9 }ss[M*3]; 10 11 void build(int l,int r,int k) 12 { 13 ss[k].l=l; 14 ss[k].r=r; 15 ss[k].s=1; 16 if(l==r) return; 17 int mid=(l+r)/2; 18 build(l,mid,k*2); 19 build(mid+1,r,k*2+1); 20 } 21 22 void insert(int l,int r,int x,int k) 23 { 24 if(ss[k].s==x) return; //颜色相同,则不用修改 25 if(ss[k].l==l&&ss[k].r==r) 26 { 27 ss[k].s=x; 28 return; 29 } 30 if(ss[k].s!=-1) //如果只有一种颜色,又与添加的颜色不同,则此区间的颜色变为杂色 31 { 32 ss[k*2].s=ss[k*2+1].s=ss[k].s; //所有子节点变为父节点的颜色 33 ss[k].s=-1; 34 } 35 int mid=(ss[k].l+ss[k].r)/2; 36 if(mid>=r) insert(l,r,x,2*k); 37 else if(mid<l) insert(l,r,x,2*k+1); 38 else 39 { 40 insert(l,mid,x,k*2); 41 insert(mid+1,r,x,k*2+1); 42 } 43 } 44 45 int search(int k) 46 { 47 if(ss[k].s!=-1) //如果此区间只有一种颜色,直接计算 48 return (ss[k].r-ss[k].l+1)*ss[k].s; 49 else 50 return search(k*2)+search(k*2+1); 51 } 52 int main() 53 { 54 int T,i,j,n,m,Case; 55 scanf("%d",&T); 56 for(Case=1;Case<=T;Case++) 57 { 58 scanf("%d%d",&n,&m); 59 build(1,n,1); 60 int a,b,c; 61 while(m--) 62 { 63 scanf("%d%d%d",&a,&b,&c); 64 insert(a,b,c,1); 65 } 66 printf("Case %d: The total value of the hook is %d.\n",Case,search(1)); 67 } 68 return 0; 69 }
标签:
原文地址:http://www.cnblogs.com/pshw/p/5322437.html