这道题是CD老OJ上面的一道题,现在在新OJ上的题号是360,开始在VJ上做的提交一直RE(囧)。后来才知道OJ移位了。

这道题是一个简单的成段更新+区间合并的线段树的题,1A还让我小激动了一下

这道题的大概意思是有两种操作,一种是成段地增加一个值,另外一种是询问从l到r这段区间内的最长递增子序列

首先先分析一下,如果某一段的值成段地增加一个量,那么该区间内的数的相对大小是不变的,因此递增子序列的长度是不会改变的

是要分析对于结果有影响的信息与值:一是每个子区间中的最值,二是有可能在两个区间合并之后的两个区间的中间的两段成为新的最值,因此我们需要判断中间的两个值是否可以合并,从何得知:我们需要在运算过程中分别记录下左端点的值和右端点的值,来判断是否可以合并。因此在每个节点增设两个值lv,rv。

还有一个问题就是在查询过程中,可能会存在查询的范围R-mid比lsum[rt<<1|1]小(mid-L+1比rsum[rt<<1]小),因此用比较取较小值相加就OK;额

  1. 1 #include<cstdio>
  2. 2 #include<cstring>
  3. 3 #include<algorithm>
  4. 4 using namespace std;
  5. 5 const int SIZEN=100005;
  6. 6 int sum[SIZEN<<2],lsum[SIZEN<<2],rsum[SIZEN<<2];
  7. 7 int lv[SIZEN<<2],rv[SIZEN<<2],add[SIZEN<<2];
  8. 8 int a[SIZEN];
  9. 9 void pushup(int len,int rt){
  10. 10 int tmp;
  11. 11 lsum[rt]=lsum[rt<<1];
  12. 12 rsum[rt]=rsum[rt<<1|1];
  13. 13 lv[rt]=lv[rt<<1];rv[rt]=rv[rt<<1|1];
  14. 14 if(lsum[rt]==(len-(len>>1))&&rv[rt<<1]<lv[rt<<1|1]) lsum[rt]+=lsum[rt<<1|1];
  15. 15 if(rsum[rt]==(len>>1)&&rv[rt<<1]<lv[rt<<1|1]) rsum[rt]+=rsum[rt<<1];
  16. 16 tmp=rsum[rt<<1]+lsum[rt<<1|1];
  17. 17 if(rv[rt<<1]<lv[rt<<1|1])
  18. 18 sum[rt]=max(tmp,max(sum[rt<<1],sum[rt<<1|1]));
  19. 19 else sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
  20. 20 }
  21. 21 void pushdown(int rt){
  22. 22 if(add[rt]!=0){
  23. 23 add[rt<<1]+=add[rt];
  24. 24 add[rt<<1|1]+=add[rt];
  25. 25 lv[rt<<1]+=add[rt];rv[rt<<1]+=add[rt];
  26. 26 lv[rt<<1|1]+=add[rt];rv[rt<<1|1]+=add[rt];
  27. 27 add[rt]=0;
  28. 28 }
  29. 29 }
  30. 30 void update(int L,int R,int o,int l,int r,int rt){
  31. 31 if(L<=l&&r<=R){
  32. 32 add[rt]+=o;
  33. 33 lv[rt]+=o;rv[rt]+=o;
  34. 34 return;
  35. 35 }
  36. 36 pushdown(rt);
  37. 37 int mid=(l+r)>>1;
  38. 38 if(L<=mid) update(L,R,o,l,mid,rt<<1);
  39. 39 if(mid+1<=R) update(L,R,o,mid+1,r,rt<<1|1);
  40. 40 pushup(r-l+1,rt);
  41. 41 }
  42. 42 void build(int l,int r,int rt){
  43. 43 add[rt]=0;
  44. 44 if(l==r){
  45. 45 sum[rt]=lsum[rt]=rsum[rt]=1;
  46. 46 lv[rt]=rv[rt]=a[l];
  47. 47 return;
  48. 48 }
  49. 49 int mid=(l+r)>>1;
  50. 50 build(l,mid,rt<<1);
  51. 51 build(mid+1,r,rt<<1|1);
  52. 52 pushup(r-l+1,rt);
  53. 53 }
  54. 54 int query(int L,int R,int l,int r,int rt){
  55. 55 if(L<=l&&r<=R){
  56. 56 return sum[rt];
  57. 57 }
  58. 58 int mid=(l+r)>>1,r1,r2,r3;
  59. 59 int len=r-l+1;
  60. 60 r1=r2=r3=-1;
  61. 61 pushdown(rt);
  62. 62 if(L<=mid) r1=query(L,R,l,mid,rt<<1);
  63. 63 if(mid+1<=R) r2=query(L,R,mid+1,r,rt<<1|1);
  64. 64 if(rv[rt<<1]<lv[rt<<1|1]) r3=min(rsum[rt<<1],mid-L+1)+min(lsum[rt<<1|1],R-mid);
  65. 65 return max(r1,max(r2,r3));
  66. 66 }
  67. 67 int main()
  68. 68 {
  69. 69 //freopen("data.in","r",stdin);
  70. 70 int i,j,_;
  71. 71 char c;
  72. 72 int l,r,o;
  73. 73 int n,q,txt=1;
  74. 74 scanf("%d",&_);
  75. 75 while(_--){
  76. 76 printf("Case #%d:\n",txt++);
  77. 77 scanf("%d%d",&n,&q);
  78. 78 for(i=1;i<=n;i++)
  79. 79 scanf("%d",&a[i]);
  80. 80 build(1,n,1);
  81. 81 while(q--){
  82. 82 scanf(" %c",&c);
  83. 83 if(c=='a'){
  84. 84 scanf("%d%d%d",&l,&r,&o);
  85. 85 update(l,r,o,1,n,1);
  86. 86 }
  87. 87 else{
  88. 88 scanf("%d%d",&l,&r);
  89. 89 int ret=query(l,r,1,n,1);
  90. 90 printf("%d\n",ret);
  91. 91 }
  92. 92 }
  93. 93 }
  94. 94 return 0;
  95. 95 }

UESTC 360(1425) another LCIS的更多相关文章

  1. O(mn)实现LCIS

    序: LCIS即求两序列的最长公共不下降子序列.思路于LCS基本一致. 用dp[i][j]记录当前最大值. 代码实现: /* About: LCIS O(mn) Auther: kongse_qi D ...

  2. 全景VR视频外包公司:长年承接VR全景视频外包(技术分享YouTube的360全景视频)

    虽然比预期来得晚了些,但YouTube终于支持360度全景视频了,这应该会吸引不少VR(虚拟现实)爱好者.今年1月,Google就表示这一功能将在“接下来”的几周出现.现在YouTube上已经有了一些 ...

  3. C#制作高仿360安全卫士窗体(四)- 水晶按钮

    项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...

  4. C#制作高仿360安全卫士窗体(三)

    距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好这些玩意的同 ...

  5. 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)

    thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...

  6. 《刺杀金正恩》1080p全高清无水印,附中文字幕 bt种子下载,附字母(百度网盘/360云盘)

    <刺杀金正恩>1080p全高清无水印,附中文字幕下载(百度网盘/360云盘) 种子和字幕下载地址: thunder://QUFlZDJrOi8vfGZpbGV8JUU5JTg3JTg3JU ...

  7. 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...

  8. 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...

  9. wing带你玩转自定义view系列(1) 仿360内存清理效果

    本篇是接自 手把手带你做自定义view系列 宗旨都是一样,带大家一起来研究自定义view的实现,与其不同的是本系列省去了简单的坐标之类的讲解,重点在实现思路,用简洁明了的文章,来与大家一同一步步学习. ...

随机推荐

  1. java反射-Method中的invoke方法的用法-以及函数式接口和lambda表达式

    作者最近研究框架底层代码过程中感觉自己基础不太牢固,于是写了一点案例,以防日后忘记 接口类:Animals 1 public interface Animals { 2 3 public void e ...

  2. 快速了解JavaScript的基础知识

    注释 单行注释: // 单行注释 多行注释: /* 多行 注释 */ 历史上 JavaScript 可以兼容 HTML 注释,因此 <!-- 和 --> 也可以是单行注释. x = 1; ...

  3. Java实现PDF和Excel生成和数据动态插入以及导出

    一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...

  4. 安装蓝鲸paas社区版

    安装蓝鲸paas社区版http://docs.bk.tencent.com/bkce_install_guide/setup/get_ready.html#hostssystemctl stop fi ...

  5. docker cp 拷贝文件 和 进入容器

    进入正在运行的容器 # 进入容器 新开一个终端 # docker exec -it 容器id /bin/bash docker exec -it eaac94ef6926 /bin/bash # 进入 ...

  6. zabbix 监控的数据

    /usr/local/zabbix/bin/zabbix_sender --zabbix-server 192.168.1.10 --port 10051 --input-file /var/log/ ...

  7. 【Linux】ssh远程连接到指定ip的指定用户上

    通过ssh可以远程连接到其他的机器上,但是如果只想连接到指定的用户的话 需要这样做: -l 选项 (是L不是I,小写) ssh IP -l 用户名 这里的ip如果在hosts下就可以直接输入域名或者主 ...

  8. Electron入门Demo之桌面应用计算器笔记(二)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14307996.html 在之前总结了一篇自学笔记,通过之前学习到的方法和知识,完成了 ...

  9. python zxing包解析二维码报UnicodeDecodeError错误解决办法

    一般错误的原因是这个库不支持中文的解码(二维码内容包含中文). 修改如下: 进入zxing.__init__.py代码中,类BarCode下,parse方法中: 找到下面这两行原代码如下: 1 raw ...

  10. Ubuntu安装Vivado

    Step1 安装必要的库文件: sudo apt install libncurses5 build-essential openjdk-11-jdk Step2 进入vivado的安装文件夹 sud ...