AC日记——[ZJOI2012]网络 bzoj 2816
思路:
多个LCT;
代码:
- #include <bits/stdc++.h>
- using namespace std;
- #define maxn 10005
- #define ll long long
- int val[maxn];
- struct LinkCutTreeType {
- int f[maxn],Max[maxn],ch[maxn][],rev[maxn],sta[maxn],top,cnt[maxn];
- void updata(int now)
- {
- Max[now]=val[now];
- if(ch[now][]) Max[now]=max(Max[now],Max[ch[now][]]);
- if(ch[now][]) Max[now]=max(Max[now],Max[ch[now][]]);
- }
- void downdata(int now)
- {
- if(rev[now])
- {
- rev[now]^=,swap(ch[now][],ch[now][]);
- if(ch[now][]) rev[ch[now][]]^=;
- if(ch[now][]) rev[ch[now][]]^=;
- }
- }
- bool isroot(int now)
- {
- return (ch[f[now]][]!=now)&&(ch[f[now]][]!=now);
- }
- void rotate(int now)
- {
- int fa=f[now],ffa=f[fa],l=(ch[fa][]==now),r=l^;
- if(!isroot(fa)) ch[ffa][ch[ffa][]==fa]=now;
- f[now]=ffa,f[fa]=now,ch[fa][l]=ch[now][r],ch[now][r]=fa;
- if(ch[fa][l]) f[ch[fa][l]]=fa;updata(fa);
- }
- void splay(int now)
- {
- top=,sta[]=now;int fa,ffa;
- for(int i=now;!isroot(i);i=f[i]) sta[++top]=f[i];
- while(top) downdata(sta[top--]);
- while(!isroot(now))
- {
- fa=f[now],ffa=f[fa];
- if(!isroot(fa)) rotate(((ch[ffa][]==fa)^(ch[fa][]==now))?now:fa);
- rotate(now);
- }
- updata(now);
- }
- void access(int now)
- {
- for(int i=;now;i=now,now=f[now]) splay(now),ch[now][]=i;
- }
- void makeroot(int now)
- {
- access(now),splay(now),rev[now]^=;
- }
- void cut(int x,int y)
- {
- makeroot(x),access(y),splay(y);
- f[x]=,ch[y][]=,cnt[x]--,cnt[y]--;
- }
- void link(int x,int y)
- {
- makeroot(x),f[x]=y,splay(x),cnt[x]++,cnt[y]++;
- }
- bool iscon(int x,int y)
- {
- while(f[x]) x=f[x];
- while(f[y]) y=f[y];
- return x==y;
- }
- int query(int u,int v)
- {
- makeroot(u),access(v),splay(v);
- return Max[v];
- }
- };
- struct LinkCutTreeType lct[];
- int n,m,c,k;
- map<ll,int>Map;
- inline void in(int &now)
- {
- char Cget=getchar();now=;
- while(Cget>''||Cget<'')Cget=getchar();
- while(Cget>=''&&Cget<='')
- {
- now=now*+Cget-'';
- Cget=getchar();
- }
- }
- ll Mapped(int u,int v)
- {
- if(u>v) swap(u,v);
- return (ll)u*n*n+v;
- }
- int main()
- {
- //freopen("data.txt","r",stdin);
- freopen("networkzj.in","r",stdin);
- freopen("networkzj.out","w",stdout);
- in(n),in(m),in(c),in(k);int u,v,w,op;ll pos,id;
- for(int i=;i<=n;i++) in(val[i]);
- while(m--) in(u),in(v),in(w),Map[Mapped(u,v)]=w+,lct[w].link(u,v);
- while(k--)
- {
- in(op);
- if(op==)
- {
- in(u),in(val[u]);
- for(int i=;i<c;i++) lct[i].splay(u);
- }
- if(op==)
- {
- in(u),in(v),in(w),id=Mapped(u,v),pos=Map[id]-;
- if(pos<)
- {
- puts("No such edge.");
- continue;
- }
- if(pos==w)
- {
- puts("Success.");
- continue;
- }
- if(lct[w].cnt[u]>=||lct[w].cnt[v]>=)
- {
- puts("Error 1.");
- continue;
- }
- if(lct[w].iscon(u,v))
- {
- puts("Error 2.");
- continue;
- }
- lct[pos].cut(u,v),lct[w].link(u,v),Map[id]=w+;
- puts("Success.");
- }
- if(op==)
- {
- in(w),in(u),in(v);
- if(!lct[w].iscon(u,v))
- {
- puts("-1");
- continue;
- }
- printf("%d\n",lct[w].query(u,v));
- }
- }
- return ;
- }
AC日记——[ZJOI2012]网络 bzoj 2816的更多相关文章
- AC日记——无线网络发射器选址 洛谷 P2038
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
- AC日记——[Hnoi2017]影魔 bzoj 4826
4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...
- AC日记——[LNOI2014]LCA bzoj 3626
3626 思路: 离线操作+树剖: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defin ...
- AC日记——[SCOI2009]游戏 bzoj 1025
[SCOI2009]游戏 思路: 和为n的几个数最小公倍数有多少种. dp即可: 代码: #include <bits/stdc++.h> using namespace std; #de ...
- AC日记——[HNOI2014]世界树 bzoj 3572
3572 思路: 虚树+乱搞: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300005 #define ...
- AC日记——NOI2016区间 bzoj 4653
4653 思路: 线段树,指针滑动: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 #def ...
- AC日记——Rmq Problem bzoj 3339
3339 思路: 恶心: 代码: #include <cstdio> #include <cstring> #include <iostream> #include ...
- AC日记——[HNOI2008]越狱 bzoj 1008
1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream& ...
- AC日记——[FJOI2007]轮状病毒 bzoj 1002
1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...
随机推荐
- sql 建表以及查询---复杂查询之成绩排名
废话不说,直接建表 1.表Player USE T4st -- 设置当前数据库为T4st,以便访问sysobjects IF EXISTS(SELECT * FROM sysobjects WHERE ...
- linux上抓包
使用tcpdump命令. 使用tcpdump -help查看其用法. -i eth0:在第一块网卡上进行抓包. -w filename.cap:将抓的保存到当前目录下的filename.cap文件中, ...
- hdu 3689 Infinite monkey theorem
Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- 【bzoj1774-过路费】floyd+排序
题意:n个点,m条双向边,每个点有权值c[i],每条边有权值a[i].d,一条路径的费用=每条边的权值和+各个点的权值的最大值,即sigma(a[i].d)+max(c[i]).q个询问,问x到y的最 ...
- 【BZOJ1598】牛跑步 [A*搜索]
牛跑步 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description BESSIE准备用从牛棚跑到池塘的方 ...
- 【NOIP】提高组2014 解方程
[题意]已知n次方程(n<=100)及其所有系数(|ai|<=10^10000),求[1,m]中整数解的个数(m<=10^6). [算法]数论 [题解]如果f(x)=0,则有f(x) ...
- 解决vue代码缩进报错问题 关闭ESlint
前言 使用vue-cli来构建单页SPA应用,提示代码缩进报错 原因分析 通过查看package.json文件我们可以发现,在文件中默认安装了eslint-loader模块,eslint-loader ...
- jqgrid 翻页记录选中行
简单的jqgrid列表 $("#list").jqGrid({ url:contextPath + "/getList", postData: data, da ...
- promise 如何知道所有的回调都执行完了?
var fs = require('fs'); /** * @return {object} Promise */ function doThing(fileName) { // ... // con ...
- DirectX介绍(转)
原文转自 https://baike.baidu.com/item/Direct3D/910353