题目描述

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

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

电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 \(v_i\)的金坷垃

或者除掉最新\(v_i\) 层(不是量)撒的金坷垃。如果上面只留有不足\(v_i\) 层金坷垃,那么就相当于电脑上面没有金坷垃了。

\(duyege\) 非常严谨,一开始先给你 \(m\) 个上述操作要你依次完成。

然后又对实验步骤进行了\(q\)次更改,每次更改都会改变其中一个操作为另外一个操作。

每次修改之后都会询问最终金坷垃的量有多少。

输入格式

输入第一行为两个正整数\(m\)、\(q\) ,接下来 \(m\) 行每行\(2\) 个整数 \(k\)、\(v_i\) 。 \(k\)为 \(0\)时撒金坷垃,为\(1\) 时除金坷垃。

接下来\(q\) 行每行\(3\) 个整数 \(c_i\)、\(k\) 、\(v_i\) , 代表被更改的操作是第 \(c_i\) 个,

后面\(2\)个数描述更改为这样的操作。

输出格式

输出\(q\)行代表每次金坷垃的量为多少

样例

样例输入

10 5

0 10

1 5

0 13

0 18

0 2

1 1

0 8

0 9

1 3

0 7

9 0 3

10 1 7

6 0 8

10 0 5

8 1 2

样例输出

58

0

0

66

41

数据范围与提示

对于 \(30\%\)的数据,\(m \leq 1000,q \leq 1000\)

.

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

对于 100%的数据,\(m \leq 2 \times 10^5,q \leq 2 \times 10^5,v_i \leq 10^4\) .

分析

考场上 \(20\) 分暴力打挂,只因一个 \(continue\)

for(rg int i=1;i<=q;i++){
aa=read(),bb=read(),cc=read();
if(b[aa].op==0){
if(bb==0){
ad(aa,-b[aa].val);
ad(aa,cc);
} else {
now=cx(aa)-cx(aa-1);
ad(aa,-now);
xg(1,aa,aa);
}
} else {
if(bb) continue;
else {
xg(1,aa,0);
ad(aa,cc);
}
}
b[aa].op=bb,b[aa].val=cc;
now=shu[1].mmin;
if(now==0) printf("%d\n",cx(m));
else printf("%d\n",cx(m)-cx(now));
}
for(rg int i=1;i<=q;i++){
aa=read(),bb=read(),cc=read();
if(b[aa].op==0){
if(bb==0){
ad(aa,-b[aa].val);
ad(aa,cc);
} else {
now=cx(aa)-cx(aa-1);
ad(aa,-now);
xg(1,aa,aa);
}
} else {
if(!bb) {
xg(1,aa,0);
ad(aa,cc);
}
}
b[aa].op=bb,b[aa].val=cc;
now=shu[1].mmin;
if(now==0) printf("%d\n",cx(m));
else printf("%d\n",cx(m)-cx(now));
}

正解用线段树维护

每个点记录三个值:执行完这段操作后会删多少个,再插多少个,插的和一共是多少

合并值时再用一个函数查找左孩子被从右删除若干个后剩下的插入总和是多少

注意查找时,如果右儿子的层数大于清除的层数

应该写成

return tr[da].sum-tr[da<<1|1].sum+cx(da<<1|1,cnt);

而不是

return tr[da<<1].sum+cx(da<<1|1,cnt);

比如这样的数据('-'代表删除)

++++ -+++

代码

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=1e6+5;
int m,q;
struct asd{
int op,val;
asd(){}
asd(int aa,int bb){
op=aa,val=bb;
}
}b[maxn];
struct trr{
int l,r,sum,cnt,del;
}tr[maxn];
int cx(int da,int cnt){
if(tr[da<<1|1].cnt==cnt){
return tr[da].sum-tr[da<<1|1].sum;
} else if(tr[da<<1|1].cnt>cnt){
return tr[da].sum-tr[da<<1|1].sum+cx(da<<1|1,cnt);
} else {
return cx(da<<1,cnt-tr[da<<1|1].cnt+tr[da<<1|1].del);
}
}
void push_up(int da){
if(tr[da<<1|1].del>tr[da<<1].cnt){
tr[da].del=tr[da<<1].del+tr[da<<1|1].del-tr[da<<1].cnt;
tr[da].cnt=tr[da<<1|1].cnt;
tr[da].sum=tr[da<<1|1].sum;
} else if(tr[da<<1|1].del==0){
tr[da].del=tr[da<<1].del;
tr[da].sum=tr[da<<1].sum+tr[da<<1|1].sum;
tr[da].cnt=tr[da<<1].cnt+tr[da<<1|1].cnt;
} else {
tr[da].del=tr[da<<1].del;
tr[da].cnt=tr[da<<1].cnt+tr[da<<1|1].cnt-tr[da<<1|1].del;
if(tr[da<<1].cnt==tr[da<<1|1].del) tr[da].sum=tr[da<<1|1].sum;
else tr[da].sum=tr[da<<1|1].sum+cx(da<<1,tr[da<<1|1].del);
}
}
void build(int da,int l,int r){
tr[da].l=l,tr[da].r=r;
if(tr[da].l==tr[da].r){
if(b[l].op==1){
tr[da].del=b[l].val;
} else {
tr[da].cnt=1;
tr[da].sum=b[l].val;
}
return;
}
rg int mids=(tr[da].l+tr[da].r)>>1;
build(da<<1,l,mids);
build(da<<1|1,mids+1,r);
push_up(da);
}
void xg(int da,int wz){
if(tr[da].l==tr[da].r){
if(b[wz].op==1){
tr[da].del=b[wz].val;
tr[da].cnt=tr[da].sum=0;
} else {
tr[da].del=0;
tr[da].cnt=1;
tr[da].sum=b[wz].val;
}
return;
}
rg int mids=(tr[da].l+tr[da].r)>>1;
if(wz<=mids) xg(da<<1,wz);
else xg(da<<1|1,wz);
push_up(da);
}
int main(){
freopen("weed.in","r",stdin);
freopen("weed.out","w",stdout);
m=read(),q=read();
for(rg int i=1;i<=m;i++){
b[i].op=read(),b[i].val=read();
}
build(1,1,m);
rg int aa,bb,cc;
for(rg int i=1;i<=q;i++){
aa=read(),bb=read(),cc=read();
b[aa].op=bb,b[aa].val=cc;
xg(1,aa);
printf("%d\n",tr[1].sum);
}
return 0;
}

联赛模拟测试20 C. Weed的更多相关文章

  1. [考试反思]0813NOIP模拟测试20

    咕了两天,补一下. 4个AK的,210是第10,190的第15并列一大排,我个傻子160排第29. 历史新低,但是心态还好. 真是没想到会一天考两场.中午没回去睡觉晚上考试... 困倒是其次,关键还是 ...

  2. 8.10 NOIP模拟测试16 Blue+Weed+Drink

    T1 Blue 贪心,每次跳得时候跳能跳到的最远的地方,跳过的就把他设为0,每次二分找到位置,一直跳就行,如果能跳到的位置就是当前位置或比当前位置还小(数组里现在呆着的这一块石头,二分得到的就是当前位 ...

  3. 联赛模拟测试10 C. 射手座之日

    题目描述 分析 方法一(线段树) 线段树维护的是以当前节点为左端点的区间的贡献 而区间的右端点则会从 \(1\) 到 \(n\) 逐渐右移 当我们把右端点从 \(i-1\) 的位置扩展到 \(i\) ...

  4. 联赛模拟测试17 A. 简单的区间 启发式合并

    题目描述 分析 我们要找的是一段区间的和减去该区间的最大值能否被 \(k\) 整除 那么对于一段区间,我们可以先找出区间中的最大值 然后枚举最大值左边的后缀与最大值右边的前缀之和是否能被 \(k\) ...

  5. 联赛模拟测试18 A. 施工 单调队列(栈)优化DP

    题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...

  6. 联赛模拟测试24 B. 答题 折半枚举

    题目描述 分析 暴力的思想是把 \(2^n\) 种得分枚举出来,每一种得分的概率都是相同的,然后从小到大累加,直到大于等于所给的概率 把问题转化一下,就变成了在 \(2^n\) 种元素中求 \(k\) ...

  7. noip模拟测试20

    考试总结:这次考试,我非常真实地感觉到了自己能力的提高,具体来说,在之前的考试中,读完题之后我只会想到暴力的思路,甚至有的题连暴力都打不出来,但是这次在考场上我已经有了自己的一些想法,有了一个深入思考 ...

  8. 联赛模拟测试5 涂色游戏 矩阵优化DP

    题目描述 分析 定义出\(dp[i][j]\)为第\(i\)列涂\(j\)种颜色的方案数 然后我们要解决几个问题 首先是求出某一列涂恰好\(i\)种颜色的方案数\(d[i]\) 如果没有限制必须涂\( ...

  9. 联赛模拟测试8 Dash Speed 线段树分治

    题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ...

随机推荐

  1. [go语言]-深入理解singleflight

    目录 前言 singleflight使用场景 singleflight 简介 singleflight的使用 从singleflight的test最简单用法 验证并发重复请求 singleflight ...

  2. Anaconda使用及管理

    接下来均是以命令行模式进行介绍,Windows用户请打开"Anaconda Prompt":macOS和Linux用户请打开"Terminal"("终 ...

  3. ECMAScript 6新特性简介

    目录 简介 ECMAScript和JavaScript的关系 let和const 解构赋值 数组的扩展 函数的扩展 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言 ...

  4. 深入研究RocketMQ生产者发送消息的底层原理

    前言 hello,小伙伴们,王子又来和大家研究RocketMQ的原理了,之前的文章RocketMQ生产部署架构如何设计中,我们已经简单的聊过了生产者是如何发送消息给Broker的. 我们简单回顾一下这 ...

  5. Oracle学习(十)Oracle定时任务

    一.Oracle定时任务基础 简介 oracle job 是应用在数据库层面,用来定时执行存储过程或者 SQL 语句的定时器. 查询 --当前库中运行的 job SELECT t.* FROM dba ...

  6. 【译】使用 WebView2 将最好的 Web 带到 .NET 桌面应用程序中

    在去年的 Build 大会上,我们引入了 WebView2,这是一个浏览器控件,可以用新的基于 Chrome 的 Microsoft Edge 来呈现 Web 内容(HTML / CSS / Java ...

  7. 再解决不了前端加密我就吃shi

    参考文章 快速定位前端加密方法 渗透测试-前端加密测试 前言 最近学习挖洞以来,碰到数据做了加密基本上也就放弃了.但是发现越来越多的网站都开始做前端加密了,不论是金融行业还是其他.所以趁此机会来捣鼓一 ...

  8. makefile实验一 make的基本原则、伪目标、以及不使用.PHONY确实现和伪目标一样功能的一种方法

    target: echo "hello_Makefile" .PHONY: clean clean: echo "clean Done .2019" 使用伪目标 ...

  9. C 多态 RT-Thread

    // RT-Thread对象模型采用结构封装中使用指针的形式达到面向对象中多态的效果,例如: // 抽象父类 #include <stdio.h> #include <assert. ...

  10. “工程师思维” VS. “学院派思维”

    1.与"工程师"交流,他们致力于"更快.高质量"交付,他们会借助时下最稳定.最完善的中间件或者框架,他们更谦虚,喜欢和志同道合的朋友交流分享协作,视角更宽,往往 ...