vijos p1881 线段树

题意:点我

我就想问,现在换代码风格还来得及吗?

 1 #include<cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define mid (l+r)/2
 5 #define ls rt<<1,l,mid
 6 #define rs rt<<1|1,mid+1,r
 7 using namespace std;
 8 const int Rn=199999+9;
 9 int N,Q;
10 struct Node
11 {
12     int lc,rc;  //左右两端颜色
13     int ln,rn;  //左右两边长度
14     int val;    //长度
15 }T[Rn<<2];
16 void pushup(int rt,int l,int r)
17 {
18     Node &x1=T[rt],x2=T[rt<<1],x3=T[rt<<1 | 1];
19     x1.lc=x2.lc;
20     x1.rc=x3.rc;
21     x1.ln=x2.ln;
22     x1.rn=x3.rn;
23     x1.val=max(x2.val,x3.val);
24     if(x2.rc!=x3.lc)
25     {
26         x1.val=max(x1.val,x2.rn+x3.ln);
27         if(x2.val==mid-l+1){
28             x1.ln=x2.val+x3.ln;
29         }
30         if(x3.val==r-mid){
31             x1.rn=x3.val+x2.rn;
32         }
33     }
34
35 }
36 void build(int rt,int l,int r)
37 {
38     Node &S=T[rt];
39     S.lc=S.rc=S.ln=S.rn=S.val=1;
40     if(l==r)
41     {
42         return;
43     }
44     build(ls);
45     build(rs);
46 }
47
48 void update(int rt,int l,int r,int x)
49 {
50     if(l==r)
51     {
52         T[rt].lc=T[rt].rc=T[rt].lc^1;
53         return;
54     }
55     if(x<=mid)
56     {
57         update(ls,x);
58     }
59     if(x>mid)
60     {
61         update(rs,x);
62     }
63     pushup(rt,l,r);
64 }
65
66 int main()
67 {
68     #ifndef ONLINE_JUDGE
69     freopen("1.in","r",stdin);
70     #endif
71     int x;
72     scanf("%d%d",&N,&Q);
73     build(1,1,N);
74     for(int i=0;i<Q;i++)
75     {
76         scanf("%d",&x);
77         update(1,1,N,x);
78         printf("%d\n",T[1].val);
79     }
80     return 0;
81
82 }
时间: 2024-10-22 08:20:16

vijos p1881 线段树的相关文章

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

【vijos】1750 建房子(线段树套线段树+前缀和)

https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad. void pushup1(int x) { for1(i, 1, mm<<2) mn[x][i]=min(mn[lc][i], mn[rc][i]); } 这里注意是mm*4...我该好好想想了..这是在dbg的时候找出来的问题.sad. 我觉得很奇怪,线段树的底层节点一共就mm个,那么整棵树

【vijos】1881 闪烁的繁星(线段树+特殊的技巧)

https://vijos.org/p/1881 这场比赛太难了sad.所以我都没做.. 这题一开始我竟然不会sad(本来就不会),然后我继续yy..yy了好久,竟然yy了个什么可拆分的并查集?(sad,后来发现我是如此sb,根本无法实现..) 然后我弃疗了,比赛干脆不交了..sad 后来看了题解和神犇们热心的指导,这就是一水题.. sad. 我们只需要在线段树维护三个值,L表示这个节点的区间内从左边向又能延伸的最长可行串的长度,R表示这个节点的区间内从右边向左能延伸的最长可行串的长度,mx表示

Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 格式 输入格式 第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 样例1 样例输入1 5 4 1 1

Vijos P1103 校门外的树【线段树,模拟】

校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示. 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 格式 输入格式 输入的

vijos 1659 河蟹王国 线段树区间加、区间查询最大值

河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他的名字叫羊驼.河蟹王国富饶安定,人们和谐相处.有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人.于是,羊驼国王将 他的子民排成了一列(==!!b汗~好长呀).每个人都有一个初始的和谐值.羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选 出的人.而且,在某一时间,区间[L

Vijos 1083 小白逛公园(线段树)

线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<

Vijos P1881 闪烁的繁星

P1882石阶上的砖 标签:d[显示标签] 背景 微雨的山门下 石阶湿着-- 只有独立的我 和缕缕的游云 这也是'同参密藏'么 描述 清晨, Alice与Bob在石阶上玩砖块. 他们每人都有属于自己的一堆砖块. 每人的砖块都由N列组成且N是奇数. Alice的第i列砖块有m[i]个. 而Bob的第i列砖块有s[i]个. 他们想建造城堡, 两座一样的城堡. 每一座城堡都是从正中间一列开始: 1)若往左侧看去,数量逐次增加,每一列都比右侧的一列多出恰一块砖. 2)若往右侧看去,数量逐次增加,每一列都

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对于每份