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 + 100 ;
  8
  9 SegTree tr[ maxN << 2 ] ;
 10 int arr[ maxN ] ;
 11 bool op[ maxN ] ;
 12
 13 int INPUT ( ) {
 14         int x = 0 , f = 1 ;char ch = getchar( ) ;
 15         while ( ch < '0' || ch > '9' ) { if( ch == '-' ) f= -1 ; ch = getchar( ) ; }
 16         while ( ch >= '0' && ch <= '9' ) { x = ( x << 1 ) + ( x << 3) + ch - '0' ; ch = getchar( ) ; }
 17         return x * f ;
 18 }
 19
 20 int Query_Tree ( const int i , const int Target ) {
 21         if ( Target == tr[ i << 1 | 1 ].Add ) {
 22                 return tr[ i ].Cnt - tr[ i << 1 | 1 ].Cnt ;
 23         }
 24         else if ( Target < tr[ i << 1 | 1 ].Add ) {
 25                 return tr[ i ].Cnt - tr[ i << 1 | 1 ].Cnt + Query_Tree ( i << 1 | 1 , Target ) ;
 26         }
 27         else {
 28                 return Query_Tree ( i << 1 , Target - tr[ i << 1 | 1 ].Add + tr[ i << 1 | 1 ].Del ) ;
 29         }
 30 }
 31
 32 void Push_up ( const int i ) {
 33         int lchild = i << 1 ;
 34         int rchild = lchild + 1 ;
 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 = 1 ;
 58                         tr[ i ].Cnt = arr[ x ] ;
 59                 }
 60         }
 61         else {
 62                 int mid = ( tr[ i ].l + tr[ i ].r ) >> 1 ;
 63                 Build_Tree ( x , mid , i<<1 ) ;
 64                 Build_Tree ( mid + 1 , y , i<<1|1 ) ;
 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 = 0 ;
 73                 if ( INPUT ( ) ) {
 74                         tr[ i ].Del = INPUT( ) ;
 75                 }
 76                 else {
 77                         tr[ i ].Cnt = INPUT ( ) ;
 78                         tr[ i ].Add = 1 ;
 79                 }
 80         }
 81         else {
 82                 int mid = ( tr[ i ].l + tr[ i ].r ) >> 1 ;
 83                 if ( Target > mid ) Update_Tree ( i << 1 | 1 , Target ) ;
 84                 else if( Target <= mid ) Update_Tree ( i << 1 , 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=1 ; i<=N ; ++i ) scanf ("%d%d" , op + i , arr + i ) ;
 96         Build_Tree ( 1 , N , 1 ) ;
 97         while ( Q-- ) {
 98                 int tmp = INPUT ( ) ;
 99                 Update_Tree ( 1 , tmp ) ;
100                 printf ( "%d\n" , tr[ 1 ].Cnt ) ;
101         }
102         fclose(stdin);
103         fclose(stdout);
104         Never Explode ;
105 }

Weed

NOIP_RP++;

2016-10-07 20:28:07

(完)

转载于:https://www.cnblogs.com/shadowland/p/5935772.html

20161003 NOIP 模拟赛 T2 解题报告相关推荐

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

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

  2. 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 ...

  3. 20161023 NOIP 模拟赛 T1 解题报告

    Task 1.纸盒子 (box.pas/box.c/box.cpp) [题目描述] Mcx是一个有轻度洁癖的小朋友.有一天,当他沉溺于数学卷子难以自拔的时候,恍惚间想起在自己当初学习概率的时候准备的一 ...

  4. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  5. nowcoder 提高组模拟赛 选择题 解题报告

    选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...

  6. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  7. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  8. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

  9. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

最新文章

  1. 互补输出级采用共集形式是为了使_互补输出级采用共集形式是为了使
  2. 今天的 IBM —— 一封来自 IBM 董事长、首席执行官 Arvind Krishna 的公开信
  3. 3D打印神经电极有助于将大脑连接到电脑
  4. makefile中的@ $ :
  5. 怎样将优酷独播1080P视频KUX格式转换成MP4
  6. MT4跟单软件的API跟单模式有多少种?
  7. 关于需求响应式公共交通的那些事(上)
  8. 前端开发:Promise的使用丨蓄力计划
  9. 破解 WIDCOMM 蓝牙驱动的方法
  10. 99%的人误解BLM中的“战略”与“执行”的关系及错误认为BLM/BEM就是战略解码的全部!
  11. 【Linux网络编程】域名转IP后的一些深层(计算机底层)的思考
  12. 让 ChatGPT 如虎添翼 2.0
  13. QT网格线的颜色设置
  14. ubuntu下街机模拟器 mame 安装和玩拳王97
  15. 【淘宝API开发系列】获得商品评论 API 返回值说明
  16. arw是什么格式?arw格式用什么软件打开?arw格式怎么转换成jpg
  17. signature=755e8ee7e865b95708ea6b30aedefbd3,fMRI of Language Systems
  18. 2022-05-14前端周报 巴厘岛项目交接完成
  19. div浮动到另一个div上面或者浮动到img图片上面
  20. hdu 4262 Juggler 这题真是跟小丑一般。。。

热门文章

  1. 扫地机器人石头爬坡_3年进化——“石头扫地机器人T65”与“米家扫地机器人”对比评测...
  2. APP免填邀请码即自动获取邀请码原理
  3. 2021 ICPC Southeastern Europe Regional Contest(更新至六题)
  4. 90元在RackNerd 买个服务器
  5. Web前端开发规范手册-阿里云
  6. 档案装订需要使用计算机吗,会计档案的装订包括什么
  7. 03-03 创建和编辑AutoCAD实体(三) 使用选择集(2)
  8. 数字num中对应的圈数量是多少?
  9. 阿里巴巴2015研发工程师B笔试卷
  10. 鸿蒙系统几纳米,鸿蒙系统+麒麟5纳米芯片,明年的华为P50手机你期待吗?