QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#462457#3556. Making Friends on Joitter is FunRafi22#0 0ms17544kbC++202.4kb2024-07-03 19:44:192024-07-03 19:44:20

Judging History

你现在查看的是最新测评结果

  • [2024-07-03 19:44:20]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:17544kb
  • [2024-07-03 19:44:19]
  • 提交

answer

#include<bits/stdc++.h>

using namespace std;

#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif

#define int long long
#define ll long long
#define pb push_back
#define st first
#define nd second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define ROF(i,r,l) for(int i=(r);i>=(l);i--)
#define endl '\n'
int inf=1000000007;
ll infl=1000000000000000007;
ll mod=998244353;

const int N=100007;

ll ans;

int r[N];
vector<int>V[N];
set<int>in[N];
set<int>IN[N],OUT[N];

deque<pair<int,int>>Q;

void Merge(int u,int v)
{
	debug("MERGE",u,v);
	if(sz(V[u])>sz(V[v])) swap(u,v);
	ans-=(ll)sz(in[u])*sz(V[u])+(ll)sz(V[u])*(sz(V[u])-1);
	ans-=(ll)sz(in[v])*sz(V[v])+(ll)sz(V[v])*(sz(V[v])-1);
	vector<int>del;
	for(auto x:in[u]) if(r[x]==v) del.pb(x);
	for(auto x:del) in[u].erase(x);
	for(auto x:V[u]) in[v].erase(x);
	for(auto x:in[u]) in[v].insert(x);
	IN[u].erase(v);
	OUT[u].erase(v);
	IN[v].erase(u);
	OUT[v].erase(u);
	for(auto x:IN[u]) 
	{
		OUT[x].erase(u);
		OUT[x].insert(v);
	}
	for(auto x:OUT[u]) 
	{
		IN[x].erase(u);
		IN[x].insert(v);
	}
	for(auto x:V[u])
	{
		r[x]=v;
		V[v].pb(x);
	}
	for(auto x:IN[u])
	{
		IN[v].insert(x);
		if(OUT[v].count(x)) Q.pb({v,x});
	}
	for(auto x:OUT[u])
	{
		OUT[v].insert(x);
		if(IN[v].count(x)) Q.pb({v,x});
	}
	debug(sz(in[v]),sz(V[v]),ans,sz(in[v])*sz(V[v])+sz(V[v])*(sz(V[v])-1));
	ans+=(ll)sz(in[v])*sz(V[v])+(ll)sz(V[v])*(sz(V[v])-1);
	debug(ans);
}


signed main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	FOR(i,1,n)
	{
		r[i]=i;
		V[i]={i};
	}
	while(m--)
	{
		int a,b;
		cin>>a>>b;
		ans-=(ll)sz(in[r[b]])*sz(V[r[b]]);
		in[r[b]].insert(a);
		ans+=(ll)sz(in[r[b]])*sz(V[r[b]]);
		IN[r[b]].insert(r[a]);
		if(OUT[r[b]].count(r[a])) Q.pb({r[a],r[b]});
		OUT[r[a]].insert(r[b]);
		while(sz(Q)>0)
		{
			int u=r[Q[0].st],v=r[Q[0].nd];
			Q.pop_front();
			if(u!=v) Merge(u,v);
		}
		cout<<ans<<endl;
		FOR(j,1,n) debug(r[j]);
		debug(sz(in[2]),sz(V[2]));
	}
	
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 17544kb

input:

5 20
4 2
1 5
2 3
2 5
3 2
3 1
4 5
1 2
5 2
1 4
4 1
3 4
5 1
2 4
2 1
4 3
1 3
5 4
3 5
5 3

output:

1
2
3
4
6
7
8
12
16
20
25
30
35
40
40
40
45
45
45
45

result:

wrong answer 11th lines differ - expected: '20', found: '25'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #1:

0%