【NOIP2017提高组模拟6.27】C
题目
蜘蛛精大爷是世界上最爷的爷,ta的图论专著《蜘蛛精大爷教你学做人OI之图论》正在热卖,只要233美元一本,每人限购一本。。。。。。在某弱的不懈要求下,ta给某弱出了一道题,然而某弱太弱了,只好向你求助。
给你一张n个结点,m条边的无向图,每个结点都有一个整数权值。你需要执行一系列操作。操作分为三种,如下表所示。
操作
D x (1<=x<=m)
删除编号为x的边。输入保证每条边至多被删除一次。
Q x k (1<=x<=n)
计算出结点x所在的联通块中,第k大的权值。如果不存在,输出0。
C x v (1<=x<=n)
把结点x的权值改为v。
操作序列的结束标志为单个字母E。结点编号为1到n,边的编号为1到m。
分析
考虑到,求第k大,我们可以用权值线段树,
线段树分裂很麻烦,
所以,倒过来做。
首先先将没有被删除的边加入,用并查集维护,
对于每一个联通块开一棵线段树,
在将经过多次修改后的权值扔进这个节点所在的联通块的线段树。
这就是初始化了。
每当有D操作,如果这条边两边的点不在同一个联通块,用并查集并在一起,并将两个联通块的线段树合并。
Q操作就直接查询,记录在一个数组,最后倒着输出。
C操作,就在线段树中删除该值,加入修改前的值。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647ll;
const long long mo=1000000007;
const long long N=2000005;
const long long M=60010;
using namespace std;
long long tr[N][2],root[N],fa[N],b[N][2],size[N],n,m,re[N][3],tot,num,sum,d[N+10],t,v[N];
long long ans[N];
bool bz[N]={0};
long long read(long long &n)
{
char ch=' ';int q=0,w=1;
for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());
if(ch=='-')w=-1,ch=getchar();
for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;
}
void put(long long v,long long l,long long r,long long x,long long y)
{
if(l==r)
{
size[v]+=y;
return;
}
long long mid=(l+r)/2;
if(x<=mid)
{
if(!tr[v][0]) tr[v][0]=++tot;
put(tr[v][0],l,mid,x,y);
}
else
{
if(!tr[v][1]) tr[v][1]=++tot;
put(tr[v][1],mid+1,r,x,y);
}
size[v]+=y;
}
long long get(long long x)
{
if(fa[x]==x) return x;
return (fa[x]=get(fa[x]));
}
long long mesh(long long x,long long y)
{
if (!x) return y;
if (!y) return x;
size[x]+=size[y];
tr[x][0]=mesh(tr[x][0],tr[y][0]);
tr[x][1]=mesh(tr[x][1],tr[y][1]);
return x;
}
bool qq=true;
long long find(long long v,long long l,long long r,long long y)
{
if(l==r) return l;
long long mid=(l+r)/2;
if(y<=size[tr[v][1]]) return find(tr[v][1],mid+1,r,y);
else
return find(tr[v][0],l,mid,y-size[tr[v][1]]);
}
int main()
{
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
read(v[i]),fa[i]=i,root[i]=++tot;
for(long long i=1;i<=m;i++)
for(long long j=0;j<=1;j++) read(b[i][j]);
while(1)
{
char c=getchar();
while(c!='E' && c!='D' && c!='Q' && c!='C') c=getchar();
if(c=='E') break;
read(re[++num][1]);
if(c=='D') bz[re[num][1]]=true;
else
if(c=='Q') re[num][0]=1,read(re[num][2]);
else
{
re[num][0]=2,read(re[num][2]);
long long x=re[num][2];
re[num][2]=v[re[num][1]];
v[re[num][1]]=x;
}
}
long long ff=maxlongint*2;
for(long long i=1;i<=n;i++) v[i]+=maxlongint;
for(int i=1;i<=num;i++)
if(re[i][0]==2) re[i][2]+=maxlongint;
for(int i=1;i<=m;i++)
if(!bz[i]) fa[get(b[i][1])]=get(b[i][0]);
for(int i=1;i<=n;i++) put(root[get(i)],0,ff,v[i],1);
for(int i=num;i>=1;i--)
{
if(!re[i][0])
{
int z=re[i][1],xx=get(b[z][0]),yy=get(b[z][1]);
if(xx==yy) continue;
mesh(root[xx],root[yy]);
fa[yy]=xx;
}
else
if(re[i][0]==1)
{
if(re[i][2]>size[root[get(re[i][1])]]) ans[++sum]=maxlongint;
else ans[++sum]=find(root[get(re[i][1])],0,maxlongint*2,re[i][2]);
qq=false;
}
else
{
put(root[get(re[i][1])],0,ff,v[re[i][1]],-1);
v[re[i][1]]=re[i][2];
put(root[get(re[i][1])],0,ff,v[re[i][1]],1);
}
}
for(int i=sum;i>=1;i--) printf("%lld\n",ans[i]-maxlongint);
}
【NOIP2017提高组模拟6.27】C的更多相关文章
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- JZOJ 5196. 【NOIP2017提高组模拟7.3】B
5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence
5185. [NOIP2017提高组模拟6.30]tty's sequence (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
- NOIP2017提高组模拟赛 10 (总结)
NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...
- NOIP2017提高组模拟赛 8(总结)
NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...
随机推荐
- 使用xUnits来实现单元测试
目录 前言 单元测试 xUnit 小结 附录 前言 从开始敲代码到现在,不停地都是在喊着记得做测试,记得自测,测试人员打回来扣你money之类的,刚开始因为心疼钱(当然还是为了代码质量),就老老实实自 ...
- 彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- js移动端滑动效果
移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...
- 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)
现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...
- 【HANA系列】SAP 【第二篇】EXCEL连接SAP HANA的方法(ODBC)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP [第二篇]EXCEL连接 ...
- Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成
打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设 ...
- excel常用快捷键和技巧
1. Ctrl+方向键,对单元格光标快速移动,移动到数据边缘(空格位置). 2. Ctrl+方向键,对单元格光标快速移动,移动到数据边缘(空格位置). 3. Ctrl+A,选择整张表. 4. Ctrl ...
- spring配置添加多个事务(转)
大多数项目只需要一个事务管理器.然而,有些项目为了提高效率.或者有多个完全不同又不相干的数据源,最好用多个事务管理器.机智的Spring的Transactional管理已经考虑到了这一点,首先分别定义 ...
- C++中的单例类模板
1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以: 2,需求的提出: 1,在架构设计时,某些类在整个系统生命 ...
- Android尺寸适配问题
1, 布局与组件大小用dp,文字大小用sp 2,