传送门

其实就是板子……只要会克鲁斯卡尔重构树和带修莫队就可以了

这么想着的我就调了将近一个下午……

思路其实比较清晰,然而码量很大,细节贼多……

不难看出只在最小生成树上走最优,于是建出克鲁斯卡尔重构树,\(2\)操作直接倍增跳,\(1\)操作和\(3\)操作离线,把克鲁斯卡尔重构树用\(dfs\)序转化为序列之后用带修莫队做

然后……注意细节……这是我的肺腑之言……

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=5e5+5,M=3e5+5;
struct eg{int u,v,w;}E[M];
struct ee{int v,nx;}e[N<<1];
int head[N],tot;
inline bool cmp(const eg &a,const eg &b){return a.w<b.w;}
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int fa[N],val[N],f[N][20],bin[25],ls[N],rs[N],rt[N],ans[N],dep[N],rk[N],a[N],col[N],b[N];
int cnt,n,m,q,tim,Time,t,op,x,y,S,p,now,l,r,T,lim;
struct query{
int l,r,t,id,op;
inline bool operator <(const query &b)const{
return rt[l]!=rt[b.l]?l<b.l:rt[r]!=rt[b.r]?r<b.r:t<b.t;
}
}qaq[N];
struct change{int pos,now,las;}c[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void mission(int u){for(R int i=1;bin[i]<=n;++i)f[u][i]=f[f[u][i-1]][i-1];}
void dfs(int u){
// puts("QAQ");
mission(u);
if(u<=n)return (void)(ls[u]=rs[u]=++tim,rk[tim]=u);
ls[u]=inf,rs[u]=0;
go(u)dep[v]=dep[u]+1,dfs(v),cmin(ls[u],ls[v]),cmax(rs[u],rs[v]);
}
int get(int x,int y){
// printf("%d %d\n",f[x][0],f[y][0]);
if(dep[y]>dep[x])swap(x,y);
fd(i,18,0)if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return val[x];
fd(i,18,0)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return val[f[x][0]];
}
int ck(int x,int y){
fd(i,18,0)if(f[x][i]&&val[f[x][i]]<=y)x=f[x][i];
return x;
}
inline void revise(R int x,R int d){col[x]+=d;d>0?(now+=col[x]==1):(now-=col[x]==0);}
inline void going(R int x,R int d){if(x>=l&&x<=r)revise(d,1),revise(a[x],-1);a[x]=d;}
int main(){
// freopen("testdata.in","r",stdin);
cnt=n=read(),m=read(),q=read(),S=pow(n,0.666);
if(S==0)S=1;
bin[0]=1;fp(i,1,20)bin[i]=bin[i-1]<<1;
fp(i,1,(n<<1))fa[i]=i;
fp(i,1,n)b[++lim]=val[i]=read(),rt[i]=(i-1)/S+1;
fp(i,1,m)E[i].u=read(),E[i].v=read(),E[i].w=read();
// fp(i,1,m)printf("%d %d %d\n",E[i].u,E[i].v,E[i].w);
sort(E+1,E+1+m,cmp);
fp(i,1,m){
int u=find(E[i].u),v=find(E[i].v);
if(u!=v){
val[++cnt]=E[i].w,fa[u]=fa[v]=cnt;
add(cnt,u),add(cnt,v),f[u][0]=f[v][0]=cnt;
if(cnt-n==n-1)break;
}
}dfs(cnt);
fp(i,1,n)a[i]=val[rk[i]];
// fp(i,1,n)printf("%d %d\n",i,ls[i]);
fp(i,1,q){
op=read(),x=read(),y=read();
// printf("%d %d %d %d\n",i,op,x,y);
switch(op){
case 1:c[++Time]={ls[x],y,val[x]},b[++lim]=y,val[x]=y;break;
case 2:ans[++t]=x==y?0:get(x,y);break;
case 3:{
p=ck(x,y);
++t,qaq[t]={ls[p],rs[p],Time,t,1};
break;
}
}
}sort(qaq+1,qaq+1+t);
sort(b+1,b+1+lim),lim=unique(b+1,b+1+lim)-b-1;
fp(i,1,n)a[i]=lower_bound(b+1,b+1+lim,a[i])-b;
fp(i,1,Time){
c[i].las=lower_bound(b+1,b+1+lim,c[i].las)-b;
c[i].now=lower_bound(b+1,b+1+lim,c[i].now)-b;
}
l=1,r=0,T=0;
fp(i,1,t)if(qaq[i].op==1){
while(T<qaq[i].t)++T,going(c[T].pos,c[T].now);
while(T>qaq[i].t)going(c[T].pos,c[T].las),--T;
while(l>qaq[i].l)revise(a[--l],1);
while(r<qaq[i].r)revise(a[++r],1);
while(r>qaq[i].r)revise(a[r--],-1);
while(l<qaq[i].l)revise(a[l++],-1);
// printf("%d %d %d %d\n",qaq[i].id,qaq[i].l,qaq[i].r,qaq[i].t);
ans[qaq[i].id]=now;
}fp(i,1,t)print(ans[i]);
return Ot(),0;
}

P5168 xtq玩魔塔的更多相关文章

  1. P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]

    P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...

  2. Luogu P5168 xtq玩魔塔

    这题不错啊,结合了一些不太传统的姿势. 首先看到题目有一问从一个点到另一个点边权最小值.想到了什么? 克鲁斯卡尔生成树+倍增?好吧其实有一个更常用NB的算法叫克鲁斯卡尔重构树 (不会的可以看dalao ...

  3. 【Luogu P5168】xtq玩魔塔(Kruskal 重构树 & 树状数组 & set)

    Description 给定一个 \(n\) 个顶点,\(m\) 条边的无向联通图,点.边带权. 先有 \(q\) 次修改或询问,每个指令形如 \(\text{opt}\ x\ y\): \(\tex ...

  4. SDUTOJ2465:其实玩游戏也得学程序(bfs+优先队列+回溯)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2465 题目描述 由于前两次的打击,ZYJ同学不 ...

  5. 这款打怪升级的小游戏,7 年前出生于 GitHub 社区,如今在谷歌商店有 8 万人打了满分

    今天我在 GitHub 摸鱼寻找新的"目标"时,发现了一个开源项目是 RougeLike 类的角色扮演游戏「破碎版像素地牢」(Shattered Pixel Dungeon)类似魔 ...

  6. 2018-2019学年第一学期Java课设--魔塔

    目录 Magic-Towers 一.团队名称.团队成员介绍.任务分配 团队名称:MoTa 团队成员介绍 任务分配 二.项目简介 三.项目采用技术 四.项目亮点 主界面显示主要信息功能 游戏动画 五.项 ...

  7. 自己做的roguelike+恶魔城游戏《魔塔猎人》已发布。

    游戏仍然是标准的roguelike,死亡后回到出生点重新开始,宏观架构上参考了<死亡细胞>,战斗设计上更加强调轻重攻击的组合,再配合236和28系列的搓招技.空中的突进飞腿.副武器等等. ...

  8. 魔兽争霸war3心得体会(四):不死族vs人族1本火魔塔

    QQ对战平台上玩随机的人特别多,为了应对对方的"出其不意",我最近一直用小狗去探路,小狗在家采集30个木头-摆放商店,就可以去探路了.主要有几个好处:知道对方的种族-出生点位-开局 ...

  9. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

随机推荐

  1. 【基础练习】【线性DP】codevs3027 线段覆盖2题解

    文章被盗还是非常严重,加版权信息 转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看看 这道题目是线性动归 可是思想和背包有些类似 事实上线性动 ...

  2. C# - CLR

     The Common Language Runtime (CLR), the virtual-machine component of Microsoft's .NET framework, m ...

  3. C++再论单例模式

    #include <iostream> #include <windows.h> #include <mutex> std::mutex gmutex; using ...

  4. 数据存储 --《高性能JavaScript》

    1.数据存储的方式 1.字面量 2.变量 3.数组项 4.对象成员 2.各自的性能特点 1.访问字面量和局部变量的速度最快,访问数组项和对象成员相对较慢 2.由于局部变量在作用域链的起始位置,因此访问 ...

  5. 2016-1-8 windows 7下安装mysql及其配置和运用

    绪言 最近学习了一下mysql的相关用法,以及vs2010结合mysql的使用. 遇到的问题:1.安装mysql 5.6 绿色免安装版本,出现mysql server not connect loca ...

  6. Activity左边滑出,右边滑入的动画切换

    Activity左边滑出,右边滑入的动画切换 转载请注明出处:http://blog.csdn.net/u012301841/article/details/46920809 大家都知道Android ...

  7. iOS之UI--涂鸦画板实例

     iOS之UI--涂鸦画板实例  首先是搭建框架 其他的略过,直接展示效果: 然后接下来上传搭建好两个控制器框架的源码百度云下载链接: http://pan.baidu.com/s/1skjpDox  ...

  8. openwrt gstreamer实例学习笔记(一.初始化gstreamer)

    GStreamer 是一个非常强大而且通用的流媒体应用程序框架. GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件. 但是, 由于追求模块化和高效率, ...

  9. what's WSDL

    WSDL (Web Services Description Language,Web服务描述语言) 它是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些 ...

  10. iOS——多线程编程详细解析

    基本定义: 程序:由代码生成的可执行应用.(例如QQ.app) 进程:一个正在运行的程序可以看做是一个进程. (例如:正在运行的QQ 就是一个进程),进程拥有独立运行所需要的全部资源. 线程: 程序中 ...