http://acm.hdu.edu.cn/showproblem.php?pid=4107

线段树。。

刚开始没想那么多,直接给每一个区间加两个域,cp和num。

cp表示该区间中所有数是否都已经大于等于p了, num表示累加的和。

然后对于一次更新,如果该区间所有的数都已经大于等于p了,num+=2*d;

否则就更新到最低。毫无疑问tle了。。

最后看别人的博客,需要求一个区间的最大和最小值。

如果min>=p  num+=2*d;

如果max<p   num+=d;

否则就更新下面的一层。

code:

View Code
  1 # include<stdio.h>
2 # include<string.h>
3 # define N 200005
4 struct node{
5 int l,r,Min,Max,num;
6 }tree[4*N];
7 int n,m,p;
8 int max(int a,int b)
9 {
10 return a>b?a:b;
11 }
12 int min(int a,int b)
13 {
14 return a<b?a:b;
15 }
16 void bulid(int l,int r,int t)
17 {
18 int mid;
19 tree[t].l=l;
20 tree[t].r=r;
21 tree[t].Min=tree[t].Max=0;
22 tree[t].num=0;
23 if(l==r) return;
24 mid=(l+r)/2;
25 bulid(l,mid,2*t);
26 bulid(mid+1,r,2*t+1);
27 }
28 void updata(int l,int r,int d,int t)
29 {
30 if(tree[t].l==l && tree[t].r==r)
31 {
32 if(tree[t].Min>=p)
33 {
34 tree[t].num+=2*d;
35 tree[t].Min+=2*d;
36 tree[t].Max+=2*d;
37 return;
38 }
39 if(tree[t].Max<p)
40 {
41 tree[t].num+=d;
42 tree[t].Max+=d;
43 tree[t].Min+=d;
44 return;
45 }
46
47 }
48 if(tree[t].num!=0)
49 {
50 tree[2*t].num+=tree[t].num;
51 tree[2*t+1].num+=tree[t].num;
52 tree[2*t].Max+=tree[t].num;
53 tree[2*t].Min+=tree[t].num;
54 tree[2*t+1].Max+=tree[t].num;
55 tree[2*t+1].Min+=tree[t].num;
56 tree[t].num=0;
57 }
58 if(r<=tree[2*t].r) updata(l,r,d,2*t);
59 else if(l>=tree[2*t+1].l) updata(l,r,d,2*t+1);
60 else
61 {
62 updata(l,tree[2*t].r,d,2*t);
63 updata(tree[2*t+1].l,r,d,2*t+1);
64 }
65 tree[t].Max=max(tree[2*t].Max,tree[2*t+1].Max);
66 tree[t].Min=min(tree[2*t].Min,tree[2*t+1].Min);
67 }
68 void query(int t)
69 {
70 if(tree[t].l==tree[t].r)
71 {
72 if(tree[t].l!=1) printf("");
73 printf("%d",tree[t].num);
74 return;
75 }
76 if(tree[t].num!=0)
77 {
78 tree[2*t].num+=tree[t].num;
79 tree[2*t+1].num+=tree[t].num;
80 tree[t].num=0;
81 }
82 query(2*t);
83 query(2*t+1);
84 }
85 int main()
86 {
87 int a,b,c;
88 while(scanf("%d%d%d",&n,&m,&p)!=EOF)
89 {
90 bulid(1,n,1);
91 while(m--)
92 {
93 scanf("%d%d%d",&a,&b,&c);
94 updata(a,b,c,1);
95 }
96 query(1);
97 printf("\n");
98 }
99 return 0;
100 }

 

 

 

posted on 2011-10-31 18:06  奋斗青春  阅读(357)  评论(0编辑  收藏  举报