bzoj3669
来源:互联网 发布:百恒网络 编辑:程序博客网 时间:2024/06/04 19:41
一维排序 另一维lct维护最小生成树
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int ch[150010][2],rv[150010],fa[150010],st[150010],tp;int ma[150010],x[150010],nu[150010],mn[150010];int n,m;int head[50010];int ans = 0x3f3f3f3f;struct edge {int u,v,a,b;bool operator < (const edge &b)const {return a < b.a;}}e[100010];int read_int () {char c = getchar();int re = 0;for(;c > '9' || c < '0';c = getchar());for(;c >= '0' && c <= '9';c = getchar())re = re * 10 + c - '0';return re;}int find (int u) {if(head[u] == u)return u;return head[u] = find(head[u]);}void pu (int u) {ma[u] = x[u];mn[u] = nu[u];if(ma[u] < ma[ch[u][0]]) {ma[u] = ma[ch[u][0]];mn[u] = mn[ch[u][0]];}if(ma[u] < ma[ch[u][1]]) {ma[u] = ma[ch[u][1]];mn[u] = mn[ch[u][1]];}}void reverse (int u) {int t = ch[u][0];ch[u][0] = ch[u][1];ch[u][1] = t;rv[u] ^= 1;}void pd (int u) {if(!rv[u])return;rv[u] = 0;reverse(ch[u][0]);reverse(ch[u][1]);}void rot (int u,int d) {ch[fa[u]][d ^ 1] = ch[u][d];if(ch[u][d])fa[ch[u][d]] = fa[u];int t = fa[fa[u]];fa[fa[u]] = u;ch[u][d] = fa[u];fa[u] = t;pu(ch[u][d]);pu(u);if(!t)return;if(ch[t][0] == ch[u][d])ch[t][0] = u;if(ch[t][1] == ch[u][d])ch[t][1] = u;}void splay (int u) {st[tp = 1] = u;int t = u;while(ch[fa[t]][0] == t || ch[fa[t]][1] == t) {t = fa[t];st[++tp] = t;}while(tp)pd(st[tp--]);while(ch[fa[u]][0] == u || ch[fa[u]][1] == u) {if(ch[fa[fa[u]]][0] != fa[u] && ch[fa[fa[u]]][1] != fa[u]) {if(ch[fa[u]][0] == u)rot(u,1);else rot(u,0);}else {int d = ch[fa[fa[u]]][0] == fa[u];if(ch[fa[u]][d] == u) {rot(u,d ^ 1);rot(u,d);}else {rot(u,d);rot(u,d);}}}}void access (int u) {int v = 0;while(u) {splay(u);ch[u][1] = v;pu(u);v = u;u = fa[u];}}void mtr (int u) {access(u);splay(u);reverse(u);}void link (int u,int v) {mtr(u);mtr(v);fa[v] = u;}void cut (int u,int v) {mtr(u);access(u);splay(v);fa[v] = 0;}int main () {n = read_int();m = read_int();for(int i = 1;i <= n;++i)head[i] = i;for(int i = 1;i <= m;++i) {e[i].u = read_int();e[i].v = read_int();e[i].a = read_int();e[i].b = read_int();}sort(e + 1,e + 1 + m);e[0].a = e[1].a;for(int i = 1;i <= m + 1;++i) {if(e[i].a != e[i - 1].a && find(1) == find(n)) {mtr(1);access(n);splay(1);ans = min(ans,e[i - 1].a + ma[1]);}if(i == m + 1)break;if(e[i].u == e[i].v)continue;if(find(e[i].u) == find(e[i].v)) {mtr(e[i].u);access(e[i].v);splay(e[i].u);if(ma[e[i].u] < e[i].b)continue;int t = mn[e[i].u];cut(t + n,e[t].v);cut(t + n,e[t].u);}else head[find(e[i].u)] = find(e[i].v);x[i + n] = ma[i + n] = e[i].b;nu[i + n] = mn[i + n] = i;link(i + n,e[i].u);link(i + n,e[i].v);}if(ans == 0x3f3f3f3f)ans = -1;printf("%d\n",ans);return 0;}
0 0
- bzoj3669
- bzoj3669
- BZOJ3669 [Noi2014]魔法森林
- bzoj3669: [Noi2014]魔法森林
- [BZOJ3669][Noi2014]魔法森林
- 【NOI2014】【BZOJ3669】魔法森林
- [bzoj3669][NOI2014]魔法森林
- BZOJ3669: [Noi2014]魔法森林
- bzoj3669: [Noi2014]魔法森林
- BZOJ3669: [Noi2014]魔法森林
- bzoj3669 [Noi2014]魔法森林
- [BZOJ3669]魔法森林
- 【NOI2014】bzoj3669 魔法森林
- 【bzoj3669】[Noi2014]魔法森林
- 【bzoj3669】[Noi2014]魔法森林
- 【bzoj3669】[Noi2014]魔法森林
- BZOJ3669 [Noi2014]魔法森林
- bzoj3669: [Noi2014]魔法森林 LCT
- android应用程序静态分析工具androguard初体验(二)
- 正则表达式之PHP篇match,match_all
- UILabel基础篇
- two sum
- 机器学习——K近邻算法(KNN)
- bzoj3669
- JAVA实现SFTP实例
- Linux下Tomcat使用80端口
- 统计单词出现的次数
- iOS9 HTTP网络请求不成功的解决方案
- bluez 协议栈实现3 应用层的协议栈实现分析之dbus
- 支持向量机总结
- android开发技巧——仿新版QQ锁屏下弹窗
- centos中selinux功能及常用服务配置