目录
题干
时间限制每测试2秒
内存限制每test256兆字节
inputstandard输入
outputstandard输出
当你玩权力的游戏时,你要么赢,要么死。没有中间地带。
《权力的游戏》,作者:乔治·r·r·马丁
有n个贵族,从1到n个。贵族i的幂为i。还有m个“友谊”。贵族甲与贵族乙之间的友谊总是相互的。
如果满足以下两个条件,贵族就被定义为脆弱的:
贵族至少有一个朋友,而且
那个贵族的朋友都有更高的权力。
您必须处理以下三种类型的查询。
贵族u与v之间增添友谊。
解除贵族u和v之间的友谊。
计算以下过程的答案。
过程:所有脆弱的贵族同时被杀死,他们的友谊也随之结束。那么,新贵族就有可能变得脆弱。这个过程会不断重复,直到没有贵族会受到伤害。可以证明,这个过程将在有限的时间内结束。在这个过程完成后,你需要计算剩余的贵族数量。
注意,进程的结果不会在查询之间传递,也就是说,每个进程开始时所有的贵族都是活的!
输入
第一行包含整数n和m(1≤n≤2⋅105,0≤m≤2⋅105)——贵族数、原友谊数。
接下来的m行分别包含整数u和v(1≤u,v≤n, u≠v),描述了一段友谊。没有友谊是列两次的。
下一行为整数q(1≤q≤2⋅105)——查询次数。
接下来的q行包含查询本身,每个查询有以下三种格式之一。
1u v(1≤u,v≤n, u≠v) -在u和v之间添加一个友谊,可以保证u和v此刻不是朋友。
2 u v(1≤u,v≤n, u≠v) -去除u和v之间的友谊,此时u和v保证是朋友。
打印出陈述中描述的过程的答案。
输出
对于每个类型3查询,将一个整数打印到新行。可以保证至少有一个type 3查询。
例子
输入
4个3
2 1
1 3
3 4
4
3.
1 2 3
1 2 3
3.
输出
2
1
输入
4个3
2 3
3 4
4个1
1
3.
输出
1
请注意
考虑第一个例子。在第一个类型3查询中,我们有如下图。
在第一轮的过程中,贵族1比他所有的朋友(2和3)都弱,因此被杀死。在第一轮没有其他的贵族是脆弱的。在第二回合中,noble 3比他唯一的朋友noble 4弱,因此被杀死。此时,过程结束,答案是2。
代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1001;
int main()
{
int n,m;
cin>>n>>m;
map<int ,int>mp;
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
mp[min(a,b)]++;
}
int sky;
cin>>sky;
while(sky--)
{
int zo;
cin>>zo;
if(zo==3)
{
cout<<n-mp.size()<<endl;
}
if(zo==1)
{
cin>>a>>b;
mp[min(a,b)]++;
if(mp[min(a,b)]==0)
mp.erase(min(a,b));
}
if(zo==2)
{
cin>>a>>b;
mp[min(a,b)]--;
if(mp[min(a,b)]==0)
mp.erase(min(a,b));
}
}
}
补充
mp.size()
mp.erase()