QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#462457 | #3556. Making Friends on Joitter is Fun | Rafi22# | 0 | 0ms | 17544kb | C++20 | 2.4kb | 2024-07-03 19:44:19 | 2024-07-03 19:44:20 |
Judging History
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%