观察复杂度,是log级别以下回答询问的。

O(1)?逗我kx呢?

自然而然地想到线段树。

学长讲的原题啊考场上还不会打。

线段树上的每个节点都表示一个操作区间。

线段树上维护的权值有3个:这个子区间一共“净”加了多少层cnt,多少量num,以及它需要除掉前面的多少层del。

因为对于每一个子区间,它只可能有几种情况:

新累加了几层,或者这个子区间不够删了删前面的几层,或先删掉前面的几层再加上新的几层。

那么每个叶节点就不用说啦,关键就在于两个区间合并。

1,如果右区间要删左区间而且还能把它删干净,那么整个区间要删的量就是del[r]+del[l]-cnt[l],整个区间累加的量就是右区间所累加的

2,如果删了但没删干净,那么我们就需要删掉左区间里最靠后的几个没被删除的值,删除量就是左区间的删除量,剩余层数就是cnt[l]+cnt[r]-del[r]

但是怎么知道那“最靠后的几个值”呢?

稍微改变一下设问,查询线段树子树中区间内最后几个有权值位置的权值和。打个ask函数就好了。

然而这里有一个易错点:你不能直接查询左子树的最靠后的那几个值,因为右子树可能删除了它的一部分。

所以你要查询的是p子树的后k个的话,实际上就是ask(p,k+del[bro])-ask(p,del[bro])

bro是指p的右兄弟。如果p本身就是右子树则不存在。这样被它右子树删除的元素就被我们考虑到了。

然后就到了考验码力的时候了。

 #include<bits/stdc++.h>
using namespace std;
#define lc p<<1
#define rc p<<1|1
int opt[],k[],num[],cnt[],del[],n,m,cl[],cr[];
int ask(int p,int t){
if(!t)return ;
if(cnt[p]<=t)return num[p];
if(t<=cnt[rc])return ask(rc,t);
return ask(lc,t-cnt[rc]+del[rc])-ask(lc,del[rc])+num[rc];
}
void up(int p){
if(del[rc]>cnt[lc])del[p]=del[lc]+del[rc]-cnt[lc],cnt[p]=cnt[rc],num[p]=num[rc];
else del[p]=del[lc],cnt[p]=cnt[rc]+cnt[lc]-del[rc],num[p]=num[rc]+num[lc]-ask(lc,del[rc]);
}
void build(int p,int l,int r){
cl[p]=l;cr[p]=r;
if(l==r){
if(opt[l])del[p]=k[l];
else cnt[p]=,num[p]=k[l];
return;
}
build(lc,l,l+r>>);build(rc,(l+r>>)+,r);up(p);
}
void change(int p,int x){
if(cl[p]==cr[p]){
if(opt[x])del[p]=k[x],cnt[p]=num[p]=;
else cnt[p]=,num[p]=k[x],del[p]=;
return;
}
if(cl[rc]<=x)change(rc,x);else change(lc,x);up(p);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d%d",&opt[i],&k[i]);
build(,,n);
for(int i=,x;i<=m;++i){
scanf("%d",&x);scanf("%d%d",&opt[x],&k[x]);
change(,x);printf("%d\n",num[]);
}
}

就1.1k但都是精华

Weed:线段树的更多相关文章

  1. 【Foreign】Weed [线段树]

    Weed Time Limit: 20 Sec  Memory Limit: 512 MB Description 从前有个栈,一开始是空的. 你写下了 m 个操作,每个操作形如 k v : 若 k ...

  2. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  3. 【模拟8.10】Weed(线段树)

    考试只好随便骗骗分过去啦啦啦..... 正解是玄学线段树: 以每个操作为叶子节点,我们定义几个变量ce表示层数,h表示高度,add表示所减的层数 那么问题转化为单点修改的问题输出直接是根节点答案 但是 ...

  4. [CSP-S模拟测试]:Weed(线段树)

    题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...

  5. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  6. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  7. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  8. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  9. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

随机推荐

  1. [开源]如何使用goapp写你的后台管理系统_golang

    简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...

  2. 微信小程序学习总结

    微信小程序开发环境安装以及相关设置配置 微信小程序前端页面书写 微信小程序前端样式WXSS书写 微信小程序中事件 微信小程序自定义组件 微信小程序发起请求 微信小程序登入流程 微信小程序路由跳转 微信 ...

  3. git 删除未提交的文件

    git checkout . && git clean -xdf

  4. PMP 项目管理第六版- 组织治理与项目治理之间的关系

    组织治理: 1.组织治理通过制定政策和流程,用结构化方式指明工作方向并进行控制,以便实现战略和运营目标. 2,组织治理通常由董事会执行,以确保对相关方的最终责任得以落实,并保持公平和透明. 项目治理: ...

  5. 自学php有哪些好的方法

    很多php新手对于如何自学php很苦恼,找不到入门到方法,有些时候一个软件都下载不下来,后者环境都不能安装好,大大打击了学习的信心.那么如何能自学好php,学好php有哪些方法呢,接下来我就给同学们提 ...

  6. 微信分享—ios和安卓机制居然不一样!

     实际项目中,在做微信分享追踪的时候,遇到了一个百思不得其解的问题. 在加入了用户分享追踪功能之后,页面已经加载完成的情况下,安卓分享功能没有任何问题,ios却总是分享失败. 关于ios和安卓设备的差 ...

  7. javascript学习总结之对象的深拷贝和浅拷贝

    前言 最近在写ES6的文章的时候发现重复遇到关于javascript深拷贝和浅拷贝的问题,然后查找了一些资料,根据资料和自己的理解做了以下笔记,毕竟javascript关于深拷贝和浅拷贝的问题在一些面 ...

  8. openflow流表项中有关ip掩码的匹配的问题(控制器为ryu)

    一.写在前面 唉,被分配到sdn安全方向,顶不住,顶不住,感觉搞不出来什么有搞头的东西.可若是让我水水的应付,我想我也是做不到的,世上无难事只怕有心人.好了,进入正题,本次要讨论的时一个比较细节的东西 ...

  9. MySQL GROUP_CONCAT()函数 -- 字段合并查询

    在做查询的时候遇到一个问题,今天分享一下解决方法. 先看一下我想要什么效果. 清单名称类型要点,后面两列为清单步骤(外键表) 但我并不想让主表的内容重复那么多遍,于是 distinct去重.子查询.左 ...

  10. GO基础之闭包

    一.闭包的理解 闭包是匿名函数与匿名函数所引用环境的组合.匿名函数有动态创建的特性,该特性使得匿名函数不用通过参数传递的方式,就可以直接引用外部的变量. 这就类似于常规函数直接使用全局变量一样,个人理 ...