QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#272317 | #2214. Link Cut Digraph | Zeardoe | AC ✓ | 668ms | 87760kb | C++20 | 3.8kb | 2023-12-02 16:52:53 | 2023-12-02 16:52:54 |
Judging History
answer
/*
[templates]:
duipai
compre
addhis
floor_sum
treedfs
matrix
network_flow
polynomial
lca
bitset
valuesgt
fenwick
erbitree
segment
mcmf
primal_dual
*/
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx")
#include<bits/stdc++.h>
using namespace std;
#define int long long
//use ll instead of int.
#define f(i, a, b) for(int i = (a); i <= (b); i++)
#define cl(i, n) i.clear(),i.resize(n);
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 1e18;
//#define cerr if(false)cerr
//#define freopen if(false)freopen
mt19937 rng(std::chrono::high_resolution_clock::now().time_since_epoch().count());
int rnd(int l, int r) {return rng() % (r-l+1) + l; }
#define watch(x) cerr << (#x) << ' '<<'i'<<'s'<<' ' << x << endl
void pofe(int number, int bitnum) {
string s; f(i, 0, bitnum) {s += char(number & 1) + '0'; number >>= 1; }
reverse(s.begin(), s.end()); cerr << s << endl;
return;
}
template <typename TYP> void cmax(TYP &x, TYP y) {if(x < y) x = y;}
template <typename TYP> void cmin(TYP &x, TYP y) {if(x > y) x = y;}
//调不出来给我对拍!
//use std::array.
const int N = 250000;
int u[N+10],v[N+10],fa[N+10],sz[N+10],ans[N+10];
int vis[N+10],dfn[N+10],seq[N+10],col[N+10],dcnt,ccnt;
vector<int> quan,e[N+10],f[N+10];
int getfa(int x){
if(fa[x]==x)return x;
return fa[x]=getfa(fa[x]);
}
void merge(int x,int y) {
x=getfa(x),y=getfa(y);
if(x==y)return;
fa[x]=y;sz[y]+=sz[x];
}
void dfs1(int x){
vis[x]=1;for(int i:e[x])if(!vis[i])dfs1(i);
dfn[x]=++dcnt;seq[dcnt]=x;
}
void dfs2(int x){
col[x]=ccnt;
for(int i:f[x])if(!col[i])dfs2(i);
}
void kosaraju() {
dcnt=ccnt=0;for(int i:quan)vis[i]=dfn[i]=seq[i]=col[i]=0;
for(int i:quan)if(!vis[i])dfs1(i);
for(int i=dcnt;i>=1;i--)if(!col[seq[i]]){
++ccnt;dfs2(seq[i]);
}
}
void solve(int l, int r, vector<int> s) {
// cerr<<l<<" "<<r<<endl;
// cerr<<"l="<<l<<",r="<<r<<",s=";for(int i:s)cerr<<i<<" ";
// cerr<<endl;
int mid = (l + r) >> 1; quan.clear();
for(int i:s){
// cerr<<"i="<<i<<endl;
if(i>mid)break;
quan.push_back(getfa(u[i]));quan.push_back(getfa(v[i]));
}
sort(quan.begin(),quan.end());
quan.erase(unique(quan.begin(),quan.end()),quan.end());
for(int i:quan){e[i].clear();f[i].clear();}
for(int i:s)if(i<=mid)e[getfa(u[i])].push_back(getfa(v[i])),
f[getfa(v[i])].push_back(getfa(u[i]));
// cerr<<l<<" "<<r<<" "<<quan.size()<<endl;
kosaraju();
if(l==r){
int delta=0;
for(int i:s){
int uu=getfa(u[i]),vv=getfa(v[i]);
if(uu==vv||col[uu]!=col[vv])continue;
delta+=sz[uu]*sz[vv];
merge(uu,vv);
}
ans[l]=ans[l-1]+delta;
}
else {
vector<int>sl,sr;
for(int i:s) {
if(i>mid)sr.push_back(i);
else {
if(col[getfa(u[i])]==col[getfa(v[i])])sl.push_back(i);
else sr.push_back(i);
}
}
solve(l,mid,sl);solve(mid+1,r,sr);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
//freopen();
//freopen();
//time_t start = clock();
//think twice,code once.
//think once,debug forever.
int n, m; cin >> n >> m;
// cerr<<"n="<<n<<",m="<<m<<endl;
f(i, 1, n) fa[i]=i,sz[i]=1;
f(i, 1, m) {
cin >> u[i] >> v[i];
}
vector<int> s; f(i, 1, m) s.push_back(i);
solve(1, m, s);
f(i, 1, m) cout << ans[i] << endl;
//time_t finish = clock();
//cout << "time used:" << (finish-start) * 1.0 / CLOCKS_PER_SEC <<"s"<< endl;
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 668ms
memory: 81752kb
Test #2:
score: 0
Accepted
time: 653ms
memory: 82812kb
Test #3:
score: 0
Accepted
time: 651ms
memory: 85380kb
Test #4:
score: 0
Accepted
time: 619ms
memory: 86028kb
Test #5:
score: 0
Accepted
time: 657ms
memory: 84308kb
Test #6:
score: 0
Accepted
time: 650ms
memory: 85296kb
Test #7:
score: 0
Accepted
time: 656ms
memory: 83012kb
Test #8:
score: 0
Accepted
time: 638ms
memory: 84380kb
Test #9:
score: 0
Accepted
time: 572ms
memory: 87256kb
Test #10:
score: 0
Accepted
time: 645ms
memory: 84384kb
Test #11:
score: 0
Accepted
time: 627ms
memory: 85344kb
Test #12:
score: 0
Accepted
time: 642ms
memory: 82728kb
Test #13:
score: 0
Accepted
time: 566ms
memory: 86784kb
Test #14:
score: 0
Accepted
time: 535ms
memory: 87760kb
Test #15:
score: 0
Accepted
time: 247ms
memory: 57676kb
Test #16:
score: 0
Accepted
time: 549ms
memory: 75612kb
Test #17:
score: 0
Accepted
time: 555ms
memory: 76372kb
Test #18:
score: 0
Accepted
time: 580ms
memory: 77016kb
Test #19:
score: 0
Accepted
time: 640ms
memory: 85616kb
Test #20:
score: 0
Accepted
time: 598ms
memory: 83920kb
Test #21:
score: 0
Accepted
time: 624ms
memory: 83880kb
Test #22:
score: 0
Accepted
time: 634ms
memory: 84124kb
Test #23:
score: 0
Accepted
time: 611ms
memory: 84744kb
Test #24:
score: 0
Accepted
time: 634ms
memory: 83104kb
Test #25:
score: 0
Accepted
time: 601ms
memory: 84164kb
Test #26:
score: 0
Accepted
time: 590ms
memory: 83116kb
Test #27:
score: 0
Accepted
time: 611ms
memory: 81844kb