博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cogs1885 [WC2006]水管局长数据加强版
阅读量:4361 次
发布时间:2019-06-07

本文共 5759 字,大约阅读时间需要 19 分钟。

BZOJ卡不过灰常蛋疼(毕竟人蠢自带巨大常数

这和动态维护最小生成树很像,但加边变成了删边,似乎没法做了。

然后根据之前的套路离线做,删边变成加边,就可以做了orz

二分查找的:(慢

// It is made by XZZ#include
#include
#include
#include
#define il inline#define rg register#define vd void#define sta staticusing namespace std;il int gi(){ rg int x=0,f=1;rg char ch=getchar(); while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*f;}const int maxn=100001;stack
stk;namespace LCT{ typedef const int& fast; int ch[maxn*2][2],fa[maxn*2],mx[maxn*2],w[maxn*2],index,A[maxn*2],B[maxn*2];bool rev[maxn*2]; il vd upd(fast x){ mx[x]=x; if(w[mx[ch[x][0]]]>w[mx[x]])mx[x]=mx[ch[x][0]]; if(w[mx[ch[x][1]]]>w[mx[x]])mx[x]=mx[ch[x][1]]; } il vd Rev(fast x){if(x)rev[x]^=1,swap(ch[x][0],ch[x][1]);} il vd down(fast x){if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;} il bool isrt(fast x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;} il vd rotate(fast x){ sta int y,z,o;y=fa[x],z=fa[y],o=x==ch[y][1]; if(!isrt(y))ch[z][y==ch[z][1]]=x;fa[x]=z; ch[y][o]=ch[x][!o],fa[ch[x][!o]]=y; ch[x][!o]=y,fa[y]=x; upd(y); } il vd splay(fast x){ sta int y,z,stk[maxn],top;stk[top=1]=x; for(rg int i=x;!isrt(i);i=fa[i])stk[++top]=fa[i]; while(top)down(stk[top--]); for(y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y]) if(!isrt(y))rotate(((x==ch[y][0])^(y==ch[z][0]))?y:x); upd(x); } il vd access(int x){for(rg int y=0;x;x=fa[y=x])splay(x),ch[x][1]=y,upd(x);} il vd makert(fast x){access(x),splay(x),Rev(x);} il vd link(fast x,fast y){makert(x),fa[x]=y;} il vd cut(fast x,fast y){makert(x),access(y),splay(y);fa[x]=ch[y][0]=0;} il int Query(fast x,fast y){makert(x),access(y),splay(y);return mx[y];} il int find(int x){access(x),splay(x);while(ch[x][0])x=ch[x][0];return x;} il vd Link(fast x,fast y,fast _w){ if(find(x)^find(y)){w[++index]=_w,link(A[index]=x,index),link(B[index]=y,index);return;} sta int z;z=Query(x,y); if(_w>=w[z])return; cut(A[z],z),cut(B[z],z); w[z]=_w,link(A[z]=x,z),link(B[z]=y,z); }};namespace GGMap{ struct gzy{int x,y,*k;}s[maxn]; il bool cmp(const gzy&a,const gzy&b){return a.x==b.x?a.y
>1; if(s[mid].x
Y[i])swap(X[i],Y[i]);} for(rg int i=1;i<=q;++i){ opt[i]=gi(),A[i]=gi(),B[i]=gi();if(A[i]>B[i])swap(A[i],B[i]); if(opt[i]==2)GGMap::insert(A[i],B[i],&C[i]); } GGMap::prepare(); for(rg int i=1;i<=m;++i){ int *it=GGMap::find(X[i],Y[i]); if(it==NULL)LCT::Link(X[i],Y[i],Z[i]); else *it=Z[i]; } while(q){ if(opt[q]==1)stk.push(LCT::w[LCT::Query(A[q],B[q])]); else LCT::Link(A[q],B[q],C[q]); --q; } while(!stk.empty())printf("%d\n",stk.top()),stk.pop(); return 0;}

map+一丁点哈希优化:(较上面快,但还是慢

// It is made by XZZ#include
#include
#include
#include
#define il inline#define rg register#define vd void#define sta staticusing namespace std;il int gi(){ rg int x=0,f=1;rg char ch=getchar(); while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*f;}const int maxn=100001;map
,int>yyb[32768];stack
stk;namespace LCT{ typedef const int& fast; int ch[maxn*2][2],fa[maxn*2],mx[maxn*2],w[maxn*2],index,A[maxn*2],B[maxn*2];bool rev[maxn*2]; il vd upd(fast x){ mx[x]=x; if(w[mx[ch[x][0]]]>w[mx[x]])mx[x]=mx[ch[x][0]]; if(w[mx[ch[x][1]]]>w[mx[x]])mx[x]=mx[ch[x][1]]; } il vd Rev(fast x){if(x)rev[x]^=1,swap(ch[x][0],ch[x][1]);} il vd down(fast x){if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;} il bool isrt(fast x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;} il vd rotate(fast x){ sta int y,z,o;y=fa[x],z=fa[y],o=x==ch[y][1]; if(!isrt(y))ch[z][y==ch[z][1]]=x;fa[x]=z; ch[y][o]=ch[x][!o],fa[ch[x][!o]]=y; ch[x][!o]=y,fa[y]=x; upd(y); } il vd splay(fast x){ sta int y,z,stk[maxn],top;stk[top=1]=x; for(rg int i=x;!isrt(i);i=fa[i])stk[++top]=fa[i]; while(top)down(stk[top--]); for(y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y]) if(!isrt(y))rotate(((x==ch[y][0])^(y==ch[z][0]))?y:x); upd(x); } il vd access(int x){for(rg int y=0;x;x=fa[y=x])splay(x),ch[x][1]=y,upd(x);} il vd makert(fast x){access(x),splay(x),Rev(x);} il vd link(fast x,fast y){makert(x),fa[x]=y;} il vd cut(fast x,fast y){makert(x),access(y),splay(y);fa[x]=ch[y][0]=0;} il int Query(fast x,fast y){makert(x),access(y),splay(y);return mx[y];} il int find(int x){access(x),splay(x);while(ch[x][0])x=ch[x][0];return x;} il vd Link(fast x,fast y,fast _w){ if(find(x)^find(y)){w[++index]=_w,link(A[index]=x,index),link(B[index]=y,index);return;} sta int z;z=Query(x,y); if(_w>=w[z])return; cut(A[z],z),cut(B[z],z); w[z]=_w,link(A[z]=x,z),link(B[z]=y,z); }};int opt[maxn],A[maxn],B[maxn],C[maxn];int X[10000001],Y[10000001],Z[10000001];int main(){ freopen("tube_strong.in","r",stdin); freopen("tube_strong.out","w",stdout); int n=gi(),m=gi(),q=gi(),k; LCT::index=n; for(rg int i=1;i<=m;++i){X[i]=gi(),Y[i]=gi(),Z[i]=gi();if(X[i]>Y[i])swap(X[i],Y[i]);} for(rg int i=1;i<=q;++i){ opt[i]=gi(),A[i]=gi(),B[i]=gi();if(A[i]>B[i])swap(A[i],B[i]); if(opt[i]==2)yyb[(A[i]+B[i]*23333ll)&32767][make_pair(A[i],B[i])]=-1; } for(rg int i=1;i<=m;++i){ sta map
,int>::iterator it; k=(X[i]+Y[i]*23333ll)&32767; it=yyb[k].find(make_pair(X[i],Y[i])); if(it==yyb[k].end())LCT::Link(X[i],Y[i],Z[i]); else it->second=Z[i]; } while(q){ if(opt[q]==1)stk.push(LCT::w[LCT::Query(A[q],B[q])]); else LCT::Link(A[q],B[q],yyb[(A[q]+B[q]*23333ll)&32767][make_pair(A[q],B[q])]); --q; } while(!stk.empty())printf("%d\n",stk.top()),stk.pop(); return 0;}

//orz各位巨犇

转载于:https://www.cnblogs.com/xzz_233/p/8179411.html

你可能感兴趣的文章
EASYUI DATAGRID 多列复选框CheckBox
查看>>
fit_transform和transform的区别
查看>>
常用激活函数(激励函数)理解与总结
查看>>
DataFrame.to_dict(orient='dict')英文文档翻译
查看>>
DictVectorizer中的fit_transform
查看>>
HDFS优缺点
查看>>
排序算法(1) 快速排序 C++实现
查看>>
伙伴分配器的一个极简实现
查看>>
$.ajax所犯的错误。success后面不执行
查看>>
Spring注入方式及注解配置
查看>>
cocos2dx blender 骨骼动画实现
查看>>
ARM基础
查看>>
eclipse
查看>>
Mybatis参数传递及返回类型
查看>>
关于Ubuntu使用笔记
查看>>
调整Tomcat上的参数提高性能[转]
查看>>
在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项
查看>>
SDK 操作 list-view control 实例 -- 遍历进程
查看>>
由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法
查看>>
65. Valid Number
查看>>