题意:点我

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

2015-05-19:线段树进一步加强,看来不用换风格了

维护左右节点左右端颜色和长度即可

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. #define lson l,mid,rt<<1
  8. #define rson mid+1,r,rt<<1|1
  9. #define root 1,n,1
  10. #define mid ((l+r)>>1)
  11. #define ll long long
  12. #define cl(a) memset(a,0,sizeof(a))
  13. #define ts printf("*****\n");
  14. using namespace std;
  15. const int MAXN=+;
  16. int sum[MAXN<<],lsum[MAXN<<],rsum[MAXN<<],lc[MAXN<<],rc[MAXN<<];
  17. int n,m,t;
  18. void pushup(int rt,int m)
  19. {
  20. lc[rt]=lc[rt<<];
  21. rc[rt]=rc[rt<<|];
  22. lsum[rt]=lsum[rt<<];
  23. rsum[rt]=rsum[rt<<|];
  24. sum[rt]=max(sum[rt<<],sum[rt<<|]);
  25. if(rc[rt<<]!=lc[rt<<|])
  26. {
  27. sum[rt]=max(sum[rt],rsum[rt<<]+lsum[rt<<|]);
  28.  
  29. if(sum[rt<<]==(m-(m>>)))
  30. {
  31. lsum[rt]=sum[rt<<]+lsum[rt<<|];
  32. }
  33. if(sum[rt<<|]==(m>>))
  34. {
  35. rsum[rt]=sum[rt<<|]+rsum[rt<<];
  36. }
  37. }
  38. }
  39. void build(int l,int r,int rt)
  40. {
  41. sum[rt]=lsum[rt]=rsum[rt]=lc[rt]=rc[rt]=;
  42. if(l==r) return;
  43. build(lson);
  44. build(rson);
  45. }
  46. void update(int pos,int l,int r,int rt)
  47. {
  48. if(l==r)
  49. {
  50. lc[rt]=rc[rt]^=;
  51. return;
  52. }
  53. if(pos<=mid) update(pos,lson);
  54. if(pos>mid) update(pos,rson);
  55. pushup(rt,(r-l+));
  56. }
  57. int main()
  58. {
  59. int i,j,k,q;
  60. scanf("%d%d",&n,&m);
  61. build(root);
  62. int pos;
  63. for(i=;i<m;i++)
  64. {
  65. scanf("%d",&pos);
  66. update(pos,root);
  67. printf("%d\n",sum[]);
  68. }
  69. return ;
  70. }

题解代码

  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=+;
  9. int N,Q;
  10. struct Node
  11. {
  12. int lc,rc; //左右两端颜色
  13. int ln,rn; //左右两边长度
  14. int val; //长度
  15. }T[Rn<<];
  16. void pushup(int rt,int l,int r)
  17. {
  18. Node &x1=T[rt],x2=T[rt<<],x3=T[rt<< | ];
  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+){
  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=;
  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^;
  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(,,N);
  74. for(int i=;i<Q;i++)
  75. {
  76. scanf("%d",&x);
  77. update(,,N,x);
  78. printf("%d\n",T[].val);
  79. }
  80. return ;
  81.  
  82. }

vijos p1881 线段树的更多相关文章

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

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...

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

    弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了 ...

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

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  4. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

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

    河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他 ...

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

    https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...

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

    https://vijos.org/p/1881 这场比赛太难了sad.所以我都没做.. 这题一开始我竟然不会sad(本来就不会),然后我继续yy..yy了好久,竟然yy了个什么可拆分的并查集?(sa ...

  8. [vijos]1066弱弱的战壕<线段树>

    题目链接:https://www.vijos.org/p/1066 这道题没什么难度,只是要一个排序然后就是线段树的基本套路模版了 但是我还是讲一讲思路吧: 给出的是坐标x,y,当一个点的x,y都小于 ...

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

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

随机推荐

  1. 无需登录-悟空CRM 存储型XSS

    无需登录-悟空CRM 存储型XSS 审计悟空的缘由是看见某云爆出CRM的getshell,于是就想着去挖出来瞅瞅!但可能自己把自己给局限了,就想着去挖那些无限制访问的文件. 故事的发生点 漏洞文件:/ ...

  2. sqlplus设置长度

    1.set linesize   100 2.col  XX format  a30 3.col  XXX format 9,999,999,999 3.set heading off  表头不显示

  3. [问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?

    情况是这样的,使用NotificationManager触发多个Notification: private Notification genreNotification(Context context ...

  4. 项目中遇到的问题:Gradle传递性依赖冲突

    问题描述: 在调用别人接口时,由于他们接口做了拦截处理在使用RestTemplate调用时必须要使用@Qualifier("他们封装好的类"),需要导入jar包 gradle方式导 ...

  5. 两行代码搞定js对象深浅拷贝

    有一段时间没有更新博客了,忙于工作.2018年刚过去,今天来开启2018第一篇博文.好了,咱们步入正题. 先上代码 /** * 遍历对象 * 1.判断是不是原始值 * 2.判断是数组还是对象 * 3. ...

  6. jenkins主从服务器部署

    当服务器为linux系统但也有部分ios代码,此时就需要添加一个从jenkins以便编译ios代码.或者需要多个job同时编译这时就需要搭建主从服务器. 1.主(master)节点安装jenkins ...

  7. MIT6.006Lec02:DocumentDistance

    MIT6.006是算法导论,Lec02讲的是Document Distance(文档距离),比如比较两个文档相似度或者搜索引擎中都会用到. 计算步骤为: 1.将每个文档分离为单词 2.统计词频 3.计 ...

  8. 批处理命令篇--配置免安装mysql

    免安装版的mysql是进行软件绿色发布的绝佳助手,本文介绍一种使用批处理命令自动配置mysql的方法. (1)建立三个文件,分别是:service install.bat,temp.txt,updat ...

  9. 标准C++中的String类的使用

    要使用标准C++中的String类,必须包含#include<string>(注意不是<string.h>带.h的是C语言中的头文件) 作者:耑新新,发布于  博客园 转载请注 ...

  10. hdu 4813(2013长春现场赛A题)

    把一个字符串分成N个字符串 每个字符串长度为m Sample Input12 5 // n mklmbbileay Sample Outputklmbbileay # include <iost ...