cdoj 秋实大哥与战争

首先,显然每个区间的最长连续子区间要么在左孩子里,要么在右孩子里,要么跨越两个孩子。于是我们可以对每个区间维护如下信息ll(left long),rl(rigth long),ml(mid long)分别表示前缀最长长度,后缀最长长度,中间的最长区间长度,并维护即可。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #include<stack>
11 #include<string>
12
13 using namespace std;
14
15 struct Tree{
16     int l,r;
17     int ll,rl,ml;
18 };
19
20 int n,m;
21 Tree T[400007];
22
23 void buildtree(int now,int l,int r){
24     T[now].ll=T[now].rl=T[now].ml=r-l+1;
25     T[now].l=l;
26     T[now].r=r;
27     if (l==r) return;
28     buildtree(now<<1,l,(l+r)>>1);
29     buildtree((now<<1)|1,((l+r)>>1)+1,r);
30 }
31
32 void update(int now,int aim,int val){
33     if (T[now].l==T[now].r){
34             T[now].ll=T[now].rl=T[now].ml=val;
35             return;
36     }
37     int mid=(T[now].l+T[now].r)>>1;
38     if (aim<=mid) update(now<<1,aim,val);
39     else update((now<<1)|1,aim,val);
40     T[now].ll=T[now<<1].ll;
41     T[now].rl=T[(now<<1)|1].rl;
42     if (T[now<<1].ll==(T[now<<1].r-T[now<<1].l+1)) T[now].ll=T[now].ll+T[(now<<1)|1].ll;
43     if (T[(now<<1)|1].rl==T[(now<<1)|1].r-T[(now<<1)|1].l+1) T[now].rl+=T[now<<1].rl;
44     T[now].ml=max(T[now<<1].ml,T[(now<<1)|1].ml);
45     T[now].ml=max(T[now].ml,T[now<<1].rl+T[(now<<1)|1].ll);
46 }
47
48 int query(int now,int aim){
49     if (T[now].l==T[now].r || T[now].ml==0 || T[now].ml==T[now].r-T[now].l+1){
50             return T[now].ml;
51     }
52     int mid=(T[now].l+T[now].r)>>1;
53     if (aim<=mid){
54             if (aim>=T[now<<1].r-T[now<<1].rl+1)
55                 return query(now<<1,aim)+query((now<<1)|1,mid+1);
56             else
57                 return query(now<<1,aim);
58     }
59     else{
60             if (aim<=T[(now<<1)|1].l+T[(now<<1)|1].ll-1)
61                     return query((now<<1)|1,aim)+query(now<<1,mid);
62             else
63                     return query((now<<1)|1,aim);
64     }
65 }
66
67 int main(){
68     scanf("%d%d",&n,&m);
69     buildtree(1,1,n);
70     for (int cas=1;cas<=m;cas++){
71             int f,x;
72             scanf("%d%d",&f,&x);
73             if (f==0){
74                     update(1,x,0);
75             }
76             if (f==1){
77                     update(1,x,1);
78             }
79             if (f==2){
80                     printf("%d\n",query(1,x));
81             }
82             checktree(1,1,n);
83     }
84     return 0;
85 }
86 /*
87 5 3
88 2 2
89 0 3
90 2 2
91
92 5 5
93 2 2
94 0 3
95 2 2
96 1 3
97 2 2
98 */
时间: 2024-12-29 13:01:40

cdoj 秋实大哥与战争的相关文章

CDOJ 1061 C - 秋实大哥与战争 STL set 迭代器

题目链接: C - 秋实大哥与战争 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Status Practice UESTC 1061 Appoint description:  System Crawler  (2016-04-23) Description 男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从

UESTC_秋实大哥与战争 2015 UESTC Training for Data Structures&lt;Problem D&gt;

D - 秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡,整个阵列就会从这个位置断开:同时有的时候已阵亡的士兵会受人赢气息感染而复活. 秋

E - 秋实大哥与战争

秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡,整个阵列就会从这个位置断开:同时有的时候已阵亡的士兵会受人赢气息感染而复活. 秋实大哥想

UESTC 1061 秋实大哥与战争 线段树区间合并

秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡,整个阵列就会从这个位置断开:同时有的时候已阵亡的士兵会受人赢气息感染而复活. 秋实大哥想知道某一时刻某一个士兵所在的

CDOJ 1146 A - 秋实大哥与连锁快餐店 最小生成树 Prim算法 稠密图

题目链接 A - 秋实大哥与连锁快餐店 Time Limit:3000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Status Practice UESTC 1146 Appoint description:  System Crawler  (2016-05-01) Description 成大事者,不惟有超世之才,亦有坚忍不拔之志. 秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金

CDOJ 1057 秋实大哥与花 线段树 区间更新+区间查询

链接: I - 秋实大哥与花 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Status Practice UESTC 1057 Appoint description:  System Crawler  (2016-04-19) Description 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前. 所以秋实大哥精心照料了很多花朵.现在所有的花朵排成了一行,每朵花有一

CDOJ 1069 秋实大哥去打工 单调栈 下标处理

E - 秋实大哥去打工 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Status Practice UESTC 1069 Appoint description:  System Crawler  (2016-04-24) Description 天行健,君子以自强不息.地势坤,君子以厚德载物. 天天过节的秋实大哥又要过节了,于是他要给心爱的妹子买礼物.但由于最近秋实大哥手头拮

uestc 1073 秋实大哥与线段树 Label:线段树

秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) “学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作. 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值:一种是询问一段区间的和. Input

UESTC_秋实大哥掰手指 2015 UESTC Training for Dynamic Programming&lt;Problem B&gt;

B - 秋实大哥掰手指 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 2048/1024KB (Java/Others) Submit Status 秋实大哥发现数据结构专题出到了N题,但是他一时算不出来已经有了几道题,他就萌萌地掰手指数. 这个时候他发现,虽然人们根据手指数创造了十进制数,但是两只手同时能表达的数是0-10一共十一个数字. 这样,他觉得如果用手指表现十进制数,同一个十进制数就会有很多种不同的表现方法. 比如,11