Weed

  duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹。

  为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验。

  电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 vi 的金坷垃,或者除掉最 新 vi 层(不是量)撒的金坷垃。如果上面只留有不足 vi 层金坷垃,那么就相当于电脑上 面没有金坷垃了。

  duyege 非常严谨,一开始先给你 m 个上述操作要你依次完成。然后又对实验步骤进行 了 q 次更改,每次更改都会改变其中一个操作为另外一个操作。每次修改之后都会询问最 终金坷垃的量有多少。

  输入第一行为两个正整数 m、q,接下来 m 行每行 2 个整数 k、vi。k 为 0 时撒金坷垃, 为 1 时除金坷垃。接下来 q 行每行 3 个整数 ci、k、vi,ci 代表被更改的操作是第 ci 个, 后面 2 个数描述更改为这样的操作。 输出 q 行代表每次金坷垃的量为多少

  对于 30%的数据,m<=1000,q<=1000.

  对于另外 20%的数据,每次 k=1 时都会将金坷垃清空。

  对于 100%的数据,m<=2*10^5,q<=2*10^5,vi<=10^4.

——————————————分割线——————————————

分析:

  ( 30分 )这道题朴素想法是每次对某个操作修改,然后依次算到最后一个元素。

  ( 100分 )朴素的想法在逐个计算上耗时太多,这时我们需要一种数据结构,能够对某个操作修改,又能够对某一段查询,那么不难想到线段树。

我们需要维护三个信息,即当前区间中操作的金坷垃数量,层数,以及需要删去更左边操作的层数。

显然左边的删除操作不会影响之后的操作,那么我们只需要对每个节点进行结算,统计即可。

下面代码的Push_up函数比较难懂,特此注释。

  1. #include "bits/stdc++.h"
  2. #define Never return
  3. #define Explode 0
  4.  
  5. using namespace std ;
  6. struct SegTree { int l , r , Add , Cnt , Del ;};
  7. const int maxN = 2e5 + ;
  8.  
  9. SegTree tr[ maxN << ] ;
  10. int arr[ maxN ] ;
  11. bool op[ maxN ] ;
  12.  
  13. int INPUT ( ) {
  14. int x = , f = ;char ch = getchar( ) ;
  15. while ( ch < '' || ch > '' ) { if( ch == '-' ) f= - ; ch = getchar( ) ; }
  16. while ( ch >= '' && ch <= '' ) { x = ( x << ) + ( x << ) + ch - '' ; ch = getchar( ) ; }
  17. return x * f ;
  18. }
  19.  
  20. int Query_Tree ( const int i , const int Target ) {
  21. if ( Target == tr[ i << | ].Add ) {
  22. return tr[ i ].Cnt - tr[ i << | ].Cnt ;
  23. }
  24. else if ( Target < tr[ i << | ].Add ) {
  25. return tr[ i ].Cnt - tr[ i << | ].Cnt + Query_Tree ( i << | , Target ) ;
  26. }
  27. else {
  28. return Query_Tree ( i << , Target - tr[ i << | ].Add + tr[ i << | ].Del ) ;
  29. }
  30. }
  31.  
  32. void Push_up ( const int i ) {
  33. int lchild = i << ;
  34. int rchild = lchild + ;
  35. if ( tr[ rchild ].Del >= tr[ lchild ].Add ) {//右区间 删除数大于等于左边层数
  36. tr[ i ].Del = tr[ lchild ].Del + tr[ rchild ].Del - tr[ lchild ].Add ;
  37. tr[ i ].Add = tr[ rchild ].Add ;
  38. tr[ i ].Cnt = tr[ rchild ].Cnt ;
  39. }
  40. else if ( !tr[ rchild ].Del ) {//右区间没有删除
  41. tr[ i ].Add = tr[ lchild ].Add + tr[ rchild ].Add ;
  42. tr[ i ].Cnt = tr[ lchild ].Cnt + tr[ rchild ].Cnt ;
  43. tr[ i ].Del = tr[ lchild ].Del ;
  44. }
  45. else {//右边无法全部删去左边
  46. tr[ i ].Del = tr[ lchild ].Del ;
  47. tr[ i ].Add = tr[ lchild ].Add + tr[ rchild ].Add - tr[ rchild ].Del ;
  48. tr[ i ].Cnt = tr[ rchild ].Cnt + Query_Tree ( lchild , tr[ rchild ].Del ) ;
  49. }
  50. }
  51. void Build_Tree ( const int x , const int y , const int i ) {
  52. tr[ i ].l = x ;
  53. tr[ i ].r = y ;
  54. if ( x == y ) {
  55. if ( op[ x ] ) tr[ i ].Del = arr[ x ] ;
  56. else if ( !op[ x ] ) {
  57. tr[ i ].Add = ;
  58. tr[ i ].Cnt = arr[ x ] ;
  59. }
  60. }
  61. else {
  62. int mid = ( tr[ i ].l + tr[ i ].r ) >> ;
  63. Build_Tree ( x , mid , i<< ) ;
  64. Build_Tree ( mid + , y , i<<| ) ;
  65. Push_up ( i ) ;
  66. }
  67. return ;
  68. }
  69.  
  70. void Update_Tree ( const int i , const int Target ) {
  71. if ( tr[ i ].l == tr[ i ].r ) {
  72. tr[ i ].Add = tr[ i ].Cnt = tr[ i ].Del = ;
  73. if ( INPUT ( ) ) {
  74. tr[ i ].Del = INPUT( ) ;
  75. }
  76. else {
  77. tr[ i ].Cnt = INPUT ( ) ;
  78. tr[ i ].Add = ;
  79. }
  80. }
  81. else {
  82. int mid = ( tr[ i ].l + tr[ i ].r ) >> ;
  83. if ( Target > mid ) Update_Tree ( i << | , Target ) ;
  84. else if( Target <= mid ) Update_Tree ( i << , Target ) ;
  85. Push_up ( i ) ;
  86. }
  87. return ;
  88. }
  89.  
  90. int main ( ) {
  91. int N , Q ;
  92. freopen("weed.in", "r", stdin);
  93. freopen("weed.out", "w", stdout);
  94. scanf ( "%d%d" , &N , &Q ) ;
  95. for ( int i= ; i<=N ; ++i ) scanf ("%d%d" , op + i , arr + i ) ;
  96. Build_Tree ( , N , ) ;
  97. while ( Q-- ) {
  98. int tmp = INPUT ( ) ;
  99. Update_Tree ( , tmp ) ;
  100. printf ( "%d\n" , tr[ ].Cnt ) ;
  101. }
  102. fclose(stdin);
  103. fclose(stdout);
  104. Never Explode ;
  105. }

Weed

NOIP_RP++;

2016-10-07 20:28:07

(完)

20161003 NOIP 模拟赛 T2 解题报告的更多相关文章

  1. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  2. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  3. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  4. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  5. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  6. CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

    T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7 ...

  7. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

  8. 20161007 NOIP 模拟赛 T1 解题报告

    排序 3.1 题意描述 众所周知,熟练掌握至少一种排序算法是参加NOIP的必备技能.常见的排序算法有冒泡 排序.归并排序.快速排序.奇偶排序.猴子排序.梳排序.鸡尾酒排序.臭皮匠排序等. 在这里,介绍 ...

  9. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

随机推荐

  1. Delphi之DLL知识学习3---为什么要使用DLL

    使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...

  2. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  3. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

  4. CodeForces 371D Vessels(树状数组)

    树状数组,一个想法是当往p注水时,认为是其容量变小了,更新时二分枚举,注意一些优化. #include<cstdio> #include<iostream> #include& ...

  5. hdu 4751 2013南京赛区网络赛 二分图判断 **

    和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的 是 hdu 2444 #include<cstdio> #include<iostre ...

  6. Android的图片缓存ImageCache(转)

    为什么要做缓存?       在UI界面加载一张图片时很简单,然而如果需要加载多张较大的图像,事情就会变得更加复杂.在许多情况下(如ListView.GridView或ViewPager等的组件),屏 ...

  7. SercureCRT无法正常连接Ubuntu14.0.4.1的解决办法

    问题描述 通过VirtualBox重新安装了ubuntu 14.0.4.1 虚拟服务器,在SercureCRT中使用root帐号连接ubuntu14.0.4.1的时候,提示“Password Auth ...

  8. VIM学习笔记

    参考: http://linux.chinaunix.net/techdoc/beginner/2009/12/20/1150108.shtml VIM命令大全 光标控制命令 命令           ...

  9. 通讯录(ios自带无界面)

    1,添加框架AddressBook.framework 2,请求权限认证,在Appdelegate.m文件中 - (BOOL)application:(UIApplication *)applicat ...

  10. QQ互联登录 微博登录问题

    qq 需要用开放平台的扣扣测试 审核通过后 开放所有用户 微博 出现获取token  个人信息失败  需要在微博里添加测试账号  审核通过后 开放所有用户