DZY开始有 nn 个点,现在他对这 nn 个点进行了 mm 次操作,对于第 ii 个操作(从 11 开始编号)有可能的三种情况:

  1. Add a b: 表示在 aa 与 bb 之间连了一条长度为 ii 的边(注意,ii是操作编号)。保证 1≤a,b≤n1≤a,b≤n。
  2. Delete k: 表示删除了当前图中边权最大的k条边。保证 kk 一定不会比当前图中边的条数多。
  3. Return: 表示撤销第 i−1i−1 次操作。保证第 11 次操作不是 Return 且第 i−1i−1 次不是 Return 操作。

请你在每次操作后告诉DZY当前图的最小生成树边权和。如果最小生成树不存在则输出 00。

输入格式

第一行两个正整数 n,mn,m。表示有 nn 个点 mm 个操作。 接下来 mm 行每行描述一个操作。

输入格式

对于每一个操作输出一行一个整数表示当前最小生成树边权和。

样例一

input

2 2
Add 1 2
Return

output

1
0

样例二

input

5 10
Add 2 1
Add 3 2
Add 4 2
Add 5 2
Add 2 3
Return
Delete 1
Add 2 3
Add 5 2
Return

output

0
0
0
10
10
10
0
0
15
0

样例三

见样例数据下载

正解:并查集+各种奇怪维护

解题报告:

  调试了两个多小时才AC,而且还蒯了别人的题解。

  传送门:http://vfleaking.blog.uoj.ac/blog/15

  我讲不太清楚,直接看vfk的博客吧。

  1 //It is made by jump~
  2 #include <iostream>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <cstdio>
  6 #include <cmath>
  7 #include <algorithm>
  8 #include <ctime>
  9 #include <vector>
 10 #include <queue>
 11 #include <map>
 12 #include <set>
 13 #ifdef WIN32
 14 #define OT "%I64d"
 15 #else
 16 #define OT "%lld"
 17 #endif
 18 using namespace std;
 19 typedef long long LL;
 20 const int MAXM = 500011;
 21 int n,m,cnt;//cnt统计树边
 22 LL ans;
 23 int father[MAXM],last[MAXM];//分别表示最小生成树中的所在块的祖先和这条边断掉之后的所在块的祖先(前提,这条边在最小生成树中)
 24 //int stack[MAXM];
 25 int size[MAXM],top;
 26 char ch[12];
 27 LL num[MAXM];
 28 vector<int>q;
 29 struct ask{
 30     int type,x,y;
 31 }Q[MAXM];
 32
 33 inline int getint()
 34 {
 35        int w=0,q=0;
 36        char c=getchar();
 37        while((c<'0' || c>'9') && c!='-') c=getchar();
 38        if (c=='-')  q=1, c=getchar();
 39        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
 40        return q ? -w : w;
 41 }
 42
 43 inline int find(int x){
 44     if(father[x]!=x) return find(father[x]);
 45     return father[x];
 46 }
 47
 48 inline void delet(int x){
 49     int u;
 50     while(x--) {
 51     u=q[q.size()-1]; q.pop_back();
 52     //u=stack[top]; top--;
 53     if(last[u]!=-1) {
 54         ans-=u; cnt--;
 55
 56         int y=father[u];
 57         while(y)
 58         {
 59             size[y]-=size[u];
 60             if(y==father[y]) break;
 61         }
 62         //if(father[x])  size[father[x]]-=size[x];
 63         father[last[u]]=last[u];
 64     }
 65     }
 66 }
 67
 68 inline void work(){
 69     n=getint(); m=getint();
 70     for(int i=1;i<=m;i++) {
 71     scanf("%s",ch);
 72     if(ch[0]=='A')  Q[i].type=1,Q[i].x=getint(),Q[i].y=getint();
 73     else if(ch[0]=='D') Q[i].type=2,Q[i].x=getint();
 74     else Q[i].type=3;
 75     }
 76     for(int i=1;i<=n;i++) father[i]=i,size[i]=1;
 77     int x,y;
 78     for(int i=1;i<=m;i++) {
 79     if(Q[i].type==1) {
 80         //stack[++top]=i;
 81         q.push_back(i);
 82         x=find(Q[i].x); y=find(Q[i].y);
 83         if(x!=y) {//加入最小生成树,后面的肯定不如前面的编号小的更优
 84         if(size[x]>size[y]) swap(x,y);//交换,按秩
 85         last[i]=x;
 86         father[x]=y; size[y]+=size[x];
 87         ans+=i; cnt++;
 88         }
 89         else last[i]=-1;//不在最小生成树中
 90     }
 91     else if(Q[i].type==2) {
 92         if(Q[i+1].type==3) {
 93         //printf("%lld\n",num[top-Q[i].x]);
 94         printf("%lld\n",num[q.size()-Q[i].x]);
 95         continue;
 96         }else delet(Q[i].x);
 97     }
 98     else {
 99         if(Q[i-1].type==1) delet(1);
100     }
101
102     if(cnt==n-1) {//构成最小生成树
103         //num[top]=ans;
104         num[q.size()]=ans;
105         printf("%lld\n",ans);
106     }
107     else {
108         //num[top]=0;
109         num[q.size()]=0;
110         printf("0\n"); }
111     }
112 }
113
114 int main()
115 {
116   work();
117   return 0;
118 }

转载于:https://www.cnblogs.com/ljh2000-jump/p/5765212.html

UOJ14 DZY Loves Graph相关推荐

  1. UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)

    显然可以用可持久化并查集实现.考虑更简单的做法.如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊.加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销 ...

  2. [UER #1] DZY Loves Graph

    题目描述 开始有 \(n\) 个点,现在对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 \(1\) 开始编号)有可能的三种情况: \(Add\) a b: 表示在 \ ...

  3. DZY Loves Graph

    按秩合并的并查集支持删边操作. 附代码 #include <cstdio> #include <cstring> #include <algorithm> usin ...

  4. CodeForces 444C. DZY Loves Physics(枚举+水题)

    转载请注明出处:http://blog.csdn.net/u012860063/article/details/37509207 题目链接:http://codeforces.com/contest/ ...

  5. Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers

    參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...

  6. Codeforces 447C - DZY Loves Sequences

    447C - DZY Loves Sequences 思路:dp 代码: #include<bits/stdc++.h> using namespace std; #define ll l ...

  7. Codeforces 446C —— DZY Loves Fibonacci Numbers(线段树)

    题目:DZY Loves Fibonacci Numbers 题意比較简单,不解释了. 尽管官方的题解也是用线段树,但还利用了二次剩余. 可是我没有想到二次剩余,然后写了个感觉非常复杂度的线段树,还是 ...

  8. CF A. DZY Loves Hash

    A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. BZOJ 3309 DZY Loves Math

    3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...

最新文章

  1. matlab仿真疏散,276基于matlab的疏散仿真程序简介
  2. msdn集合不存在 请重新安装msdn_全网首发【MSDN系统】 Windows 10 1909 五版合一 原版系统(64位)...
  3. 矩形法_字体设计 | 新手必学,超简单的矩形造字法!!
  4. 前端常见浏览器兼容性问题及解决办法
  5. C语言-查找顺序表中的最大值
  6. kettle日志解析_Kettle运行日志记录
  7. 手机科学计算机xy怎么用,如何使用科学计算器
  8. Oracle查看ogg延时,OGG复制进程延迟不断增长
  9. WM_CHAR,WM_UNICHAR,WM_IME_CHAR
  10. unity 阿拉伯文显示
  11. 金蝶生成凭证模板_【干货】金蝶云ERP教你凭证模版的引入引出
  12. java计算机毕业设计医院病历管理系统源程序+mysql+系统+lw文档+远程调试
  13. Java、JSP外卖订餐系统
  14. 微信支付-----统一下单接口对接
  15. 广州Java培训,疯狂Java如何?谈谈疯狂Java,谈谈李刚
  16. 武汉云数时代网络科技有限公司网店代运营托管优势?
  17. ssm整合笔记(1)-curd
  18. LDAP使用说明文档
  19. rabbitmq的使用已经数据同步
  20. linux下通过bin文件来制作img镜像文件

热门文章

  1. Unity大型场景程序化生成及优化技术—FPS迷宫生成和优化
  2. ArcMap打不开ENVI的img格式问题解决
  3. Python实现线性判别分析教程
  4. 优秀自律的人手机上都装了些什么app?看完你就懂了!
  5. 一个程序员的减肥方法(男女通用); 饮食+运动
  6. oracle职工工资数据表四表联动,oracle 学习之基础篇(四):多表查询
  7. 如何在windows开启UAC(用户账号控制)的情况下优雅的管理程序的权限申请方案(一)
  8. python按位置从字符串提取子串的操作是_Python基础-字符串操作和“容器”的操作...
  9. 三战南京大学计算机学硕上岸,初试403经验贴
  10. 于飞SEO:零基础学seo难吗?怎么学?