BZOJ4150 AMPPZ2014 The Staging 【线段树】*
BZOJ4150 AMPPZ2014 The Staging
Description
在舞台上有n个枪手,第i个枪手瞄准了第p[i]个枪手,将于第u[i]秒开枪。一个枪手如果成功开枪,
那么被瞄准的枪手会立刻死亡。
现在给出q次修改操作,请在一开始和每次修改操作后统计出最后存活的枪手个数。
Input
第一行包含一个正整数n(1<=n<=200000),表示枪手的个数。
第二行包含n个互不相同的正整数p[1],p[2],...,p[n](1<=p[i]<=n,p[i]!=i)" role="presentation" style="position: relative;">p[1],p[2],...,p[n](1<=p[i]<=n,p[i]!=i)p[1],p[2],...,p[n](1<=p[i]<=n,p[i]!=i),依次表示每个枪手的目标。
第三行包含n个正整数u[1],u[2],...,u[n](1<=u[i]<=109)" role="presentation" style="position: relative;">u[1],u[2],...,u[n](1<=u[i]<=109)u[1],u[2],...,u[n](1<=u[i]<=109),依次表示每个枪手的开枪时间。
接下来一行包含一个正整数q,表示修改操作的个数。
接下来q行,每行包含两个正整数k,v(1<=k<=n,1<=v<=109)" role="presentation" style="position: relative;">(1<=k<=n,1<=v<=109)(1<=k<=n,1<=v<=109),表示把u[k]修改为v。
数据保证任何时刻任意两个枪手的开枪时间都不同。
Output
第一行包含一个正整数,即在进行修改之前最后存活的枪手个数。
接下来q行,每行包含一个正整数,第i行输出在第i次修改之后最后存活的枪手个数。
Sample Input
4
2 3 4 1
1 2 3 4
3
1 8
2 7
3 6
Sample Output
2
2
1
1
线段树好题
真的好
上次好像是dcy还是谁的给我们考过一次
然后无奈暴力50分
考完听完评奖望之生畏也就没改留坑了
结果这次cdsf又给我们考,因为不想接受暴零的未来
所以拼命想,然后把它做出来了
结果是好的
接下来讲正事
首先我们有很多的环
然后我们考虑从中间的某一个点把这个环剖开
然后变成一条链
然后我们有许许多多的单点修改,全局查询。。。想到了啥
线段树啊
然后发现一个人是否存活之和它之前的人有没有机会发出炮弹有关
所以对于一个区间,我们考虑维护左端点的人可以存活的时候,右端点的人是否存活,在这个时候区间中可以留下的人一共有多少,左端点的人不能存活同理,顺便维护一下一个区间的左右端点的u
然后我们考虑怎么合并两个区间
首先,对于左端点可以存活的时候,来看看左区间的右端点的人活不活的了,如果活的了就判断一下右区间的左端点可不可以活,然后统计贡献,左端点不可以存活同理
有些细节太繁琐了,还是自己想想好了
然后讨论区间一共可以活下多少人同理
然后最后统计答案的时候,分类讨论一下最左端点和最右端点的情况统计一下贡献
然后就可以滑稽了
#include<bits/stdc++.h>
using namespace std;
#define N 200010
struct Node{int id,tim;};
bool operator < (Node a,Node b){return a.tim>b.tim;}
int n,m,tot=0;
int u[N],p[N],bel[N]={0},ans,res[N],newpos[N];
bool vis[N];
vector<int> ch[N];
priority_queue<Node> q;
int rt[N],ld[N<<2],rd[N<<2],siz1[N<<2],siz2[N<<2];
int ul[N<<2],ur[N<<2];
bool tmp1[N<<2],tmp2[N<<2];
int tcnt=0;
int st[N];
void pushup(int t){
ul[t]=ul[ld[t]];
ur[t]=ur[rd[t]];
//alive
if(tmp1[ld[t]]){
if(ur[ld[t]]<ul[rd[t]])tmp1[t]=tmp2[rd[t]];
else tmp1[t]=tmp1[rd[t]];
}else tmp1[t]=tmp1[rd[t]];
if(tmp2[ld[t]]){
if(ur[ld[t]]<ul[rd[t]])tmp2[t]=tmp2[rd[t]];
else tmp2[t]=tmp1[rd[t]];
}else tmp2[t]=tmp1[rd[t]];
//siz
if(tmp1[ld[t]]){
if(ur[ld[t]]<ul[rd[t]])siz1[t]=siz1[ld[t]]+siz2[rd[t]];
else siz1[t]=siz1[ld[t]]+siz1[rd[t]]-1;
}else siz1[t]=siz1[ld[t]]+siz1[rd[t]];
if(tmp2[ld[t]]){
if(ur[ld[t]]<ul[rd[t]])siz2[t]=siz2[ld[t]]+siz2[rd[t]];
else siz2[t]=siz2[ld[t]]+siz1[rd[t]]-1;
}else siz2[t]=siz2[ld[t]]+siz1[rd[t]];
}
void build(int &t,int l,int r){
if(l>r)return;
t=++tcnt;
if(l==r){
tmp1[t]=1;tmp2[t]=0;
siz1[t]=1;siz2[t]=0;
ul[t]=ur[t]=u[st[l]];
return;
}
int mid=(l+r)>>1;
build(ld[t],l,mid);
build(rd[t],mid+1,r);
pushup(t);
}
void modify(int t,int l,int r,int pos,int vl){
if(l==r){ul[t]=ur[t]=vl;return;}
int mid=(l+r)>>1;
if(pos<=mid)modify(ld[t],l,mid,pos,vl);
else modify(rd[t],mid+1,r,pos,vl);
pushup(t);
}
void init(int &root,int t){
int now=0;
int u=ch[t][0],tmp=p[u];
st[++now]=u;
newpos[u]=now;
while(tmp!=u){
st[++now]=tmp;
newpos[tmp]=now;
tmp=p[tmp];
}
build(root,1,now);
}
int work(int t){
t=rt[t];
if(ur[t]<ul[t]){
if(tmp2[t])return siz2[t];
else return siz1[t];
}else {
if(tmp1[t])return siz1[t]-1;
else return siz1[t];
}
}
int fa[N],siz;
int findfa(int x){
if(fa[x]==x)return x;
return fa[x]=findfa(fa[x]);
}
int main(){
scanf("%d",&n);
siz=n;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
int fi=findfa(i);
int fpi=findfa(p[i]);
if(fi!=fpi)fa[fpi]=fi;
}
for(int i=1;i<=n;i++){
int fi=findfa(i);
if(!bel[fi])bel[i]=bel[fi]=++tot;
else bel[i]=bel[fi];
ch[bel[i]].push_back(i);
}
for(int i=1;i<=n;i++)scanf("%d",&u[i]);
for(int i=1;i<=tot;i++)init(rt[i],i);
int ans=0;
for(int i=1;i<=tot;i++)ans+=work(i);
printf("%d\n",ans);
scanf("%d",&m);
while(m--){
int x,val;
scanf("%d%d",&x,&val);
int f=bel[x];x=newpos[x];
ans-=work(f);
modify(rt[f],1,(signed)ch[f].size(),x,val);
ans+=work(f);
printf("%d\n",ans);
}
return 0;
}
BZOJ4150 AMPPZ2014 The Staging 【线段树】*的更多相关文章
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- How to implement multiple constructor with different parameters in Scala
Using scala is just another road, and it just like we fall in love again, but there is some pain you ...
- Memcached delete 命令
Memcached delete 命令用于删除已存在的 key(键). 语法: delete 命令的基本语法格式如下: delete key [noreply] 多个 key 使用空格隔开,如下: d ...
- web微信开发总结
这两天使用Django开发了web微信,实现了显示联系人以及收发消息的功能. 总结下这过程中使用到的一些知识. 1 http请求 通过chrome浏览器自带的开发者工具查看每次请求的信息,分析请求,包 ...
- PHP stream相关协议及上下文选项和参数归纳
支持的协议和封装协议 PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen(). copy(). file_exists() 和 filesize() 的文件系统函数. 除了这些封装协 ...
- C# 终于写完了简单的ORM
实现单表 增 .删. 改 .查 使用接口定义表实体数据.实体对象动态创建,使用 Email 进行数据读取. 存储过程调用示例
- 互换CapsLock和Ctrl键
如果你没有HHKB键盘,完全可以利用系统自身的功能交换CapsLock和Ctrl键. macOS系统 在系统偏好设置里,点击“键盘”,在出现的画面点击右下角的“修饰键...”按钮,在这里可以配置这两个 ...
- vue iview组件表格 render函数的使用
如果要在标签中加入属性,例如img 中src属性 a标签中href属性 此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'c ...
- 玲珑oj 1028 贪心
http://www.ifrog.cc/acm/problem/1028 很有趣的一道题,求从n个数里挑出不同的两个,使得他俩'|','&','^'后的值尽量大,求这个最大的结果. 求最大的异 ...
- 普通用户启动redis
重庆231 Redis 服务器 redis用户启动 复制 /etc/init.d/redis 启动脚本到 /redisdata/redis3.2下面,修改内容 [root@localhost ~]# ...
- zk的watcher机制的实现
转载:https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-zookeeper-watcher/ http://blog.csdn ...