QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#59682 | #4863. Equivalence in Connectivity | captured | TL | 1984ms | 30860kb | C++14 | 8.2kb | 2022-10-31 19:16:31 | 2022-10-31 19:16:33 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define LL long long
#define deb(x) cerr<<#x<<" : "<<x<<" "
#define dnl cerr<<endl
#define FOR(i,n) for(int i=0;i<n;i++)
#define cnd tree[idx]
#define lnd idx*2,b,(b+e)/2
#define rnd idx*2+1,(b+e)/2 + 1,e
typedef pair<int,int> pii;
LL power(LL a,LL b,LL m){
if(b==0)return 1;
if(b==1)return a%m;
LL x = power(a,b>>1,m);
x = (x*x)%m;
if(b%2){
x = (x*a)%m;
}
return x;
}
const int mx = 1e5+5;
LL P[2][mx];
const LL base[4]={23, 29,37,79};
const LL mod[2]={(LL)1e9+7, (LL)1e9+9};
LL globalhash[2];
LL hashval[2][mx];
int cntofhash=2;
inline LL getcurrenthash(){
LL x = globalhash[0], y = globalhash[1];
return (x<<31)^y;
}
multiset<LL> hashbusket[2];
void printhashbusket(){
FOR(i,2){
for(LL h:hashbusket[i])deb(h);dnl;
}
deb(getcurrenthash());dnl;
}
struct dsu_save {
int v, rnkv, u, rnku;
dsu_save() {}
dsu_save(int _v, int _rnkv, int _u, int _rnku)
: v(_v), rnkv(_rnkv), u(_u), rnku(_rnku) {}
};
struct dsu_with_rollbacks {
vector<int> p, rnk, sz;
int comps;
stack<dsu_save> op;
int N;
dsu_with_rollbacks() {}
void add(int u){
FOR(i,2){
globalhash[i] += power(base[i+2],hashval[i][u],mod[i]);
globalhash[i] %= mod[i];
}
}
void rem(int u){
FOR(i,2){
globalhash[i] -= power(base[i+2],hashval[i][u],mod[i]);
globalhash[i] += mod[i];
globalhash[i] %= mod[i];
}
}
void init(int n) {
p.resize(n+5);
rnk.resize(n+5);
N = n;
while(!op.empty())op.pop();
for (int i = 0; i <= n; i++) {
p[i] = i;
rnk[i] = 0;
FOR(j,cntofhash){
hashval[j][i] = P[j][i];
globalhash[j] += power(base[j+2],P[j][i],mod[j]);
globalhash[j] %= mod[j];
hashbusket[j].insert(P[j][i]);
}
}
comps = n;
}
int find_set(int v) {
return (v == p[v]) ? v : find_set(p[v]);
}
bool unite(int v, int u) {
v = find_set(v);
u = find_set(u);
if (v == u)
return false;
comps--;
if (rnk[v] > rnk[u])
swap(v, u);
op.push(dsu_save(v, rnk[v], u, rnk[u]));
p[v] = u;
rem(u);
rem(v);
FOR(i,2){
hashval[i][u] += hashval[i][v];
hashval[i][u] %= mod[i];
}
add(u);
if (rnk[u] == rnk[v])
rnk[u]++;
return true;
}
void rollback() {
if (op.empty())
return;
dsu_save x = op.top();
op.pop();
comps++;
rem(x.u);
FOR(i,2){
hashval[i][x.u] -= hashval[i][x.v];
hashval[i][x.u] += mod[i];
hashval[i][x.u] %= mod[i];
}
add(x.u);
add(x.v);
p[x.v] = x.v;
rnk[x.v] = x.rnkv;
p[x.u] = x.u;
rnk[x.u] = x.rnku;
}
void show(){
for(int i=1;i<=N;i++){
deb(i);deb(p[i]);deb(hashval[1][i]);
dnl;
}
FOR(i,cntofhash)deb(globalhash[i]);dnl;
}
} dsu;
struct oper{
int typ;
int u,v;
int dest;
bool united;
void reset(){
typ=0,u=0,v=0,dest=0,united=0;
}
};
int posinq[5*mx];
oper oplist[10*mx];
LL finalhash[10*mx];
LL hashoftim[15*mx];
vector<oper> g[mx];
int curtime;
set<int> tst;
int kartime[10*mx];
void buildtimeline(int u,oper x){
curtime++;
oplist[curtime]=x;
curtime++;
posinq[u]=curtime;
// deb(u);deb(x.u);deb(x.v);deb(x.typ);dnl;
// tst.insert(curtime);
kartime[curtime] = u;
for(oper op:g[u]){
buildtimeline(op.dest,op);
}
curtime++;
x.typ *= -1;
oplist[curtime] = x;
}
struct QueryTree {
vector<vector<oper>> tree;
int T;
QueryTree() {}
void init(int _T){
T = _T;
tree.clear();
tree.resize(4 * T + 400);
}
void add_query_to_tree(int idx,int b,int e,int l,int r,oper q){
if(l>e or r<b)return;
if(l<=b and r>=e){
q.united=0;
cnd.push_back(q);
return;
}
add_query_to_tree(lnd,l,r,q);
add_query_to_tree(rnd,l,r,q);
}
void add_query(oper q, int l, int r) {
add_query_to_tree(1, 1, T, l, r, q);
}
void offline_dcp(int idx,int b,int e){
for(oper &q:cnd){
q.united = dsu.unite(q.u,q.v);
}
if(b==e){
hashoftim[b] = getcurrenthash();
}
else{
offline_dcp(lnd);
offline_dcp(rnd);
}
for(oper q:cnd){
if(q.united){
dsu.rollback();
}
}
}
void solve(){
offline_dcp(1,1,T);
}
} DCP;
vector<int> groups[mx];
void tcreset(int n,int k){
FOR(i,k+2){
finalhash[i] = 0;
groups[i].clear();
g[i].clear();
}
FOR(i,curtime+2){
hashoftim[i]=0;
oplist[i].reset();
}
FOR(i,2){
globalhash[i]=0;
FOR(j,n)hashval[i][j] = 0;
}
curtime = 0;
FOR(i,n+2)posinq[i] = 0;
}
/*
3
8 5 2
1 5
1 4
1 add 2 4
1 add 3 4
1 add 2 4
4 add 3 4
4 add 1 3
5 add 1 3
2 add 2 3
*/
void solve(int cs){
int n,m,k;
vector<vector<int>> timeline;
cin>>k>>n>>m;
dsu.init(n);
// dsu.show();
curtime = 1;
vector<vector<int>> edges;
FOR(ii,m){
int u,v;
cin>>u>>v;
// dsu.unite(u,v);
oper cop;
cop.dest=0,cop.typ=1;
cop.u=u,cop.v=v;
oplist[curtime++] = cop;
edges.push_back({u,v});
}
FOR(i,k-1){
int par;string s;int u,v;
int typ;
cin>>par>>s>>u>>v;
if(s=="add")typ=1;
else typ=-1;
g[par].push_back({typ,u,v,i+2});
}
buildtimeline(1,{0,0,0,0});
for(auto e:edges){
oplist[curtime++] = {-1,e[0],e[1],0};
}
map<pii,int> mp;
vector<int> used(curtime+2,0);
for(int i=1;i<=curtime;i++){
int u = oplist[i].u, v = oplist[i].v;
int t = oplist[i].typ;
if(u > v)swap(u,v);
pii x(u,v);
if(t==0)continue;
if( t==-1 ){
if(mp.find(x)==mp.end() or mp[x]==0){
// assert(0);
}
else{
int l = mp[x];
timeline.push_back({l,i-1,u,v});
mp[x] = 0;
used[l]=1;
}
}
else if(t==1){
mp[x] = i;
}
}
DCP.init(curtime);
for(auto xx:timeline){
oper cur;cur.typ=1,cur.u=xx[2],cur.v=xx[3],cur.dest=0;
DCP.add_query(cur,xx[0],xx[1]);
}
for(int i=1;i<=curtime;i++){
if(oplist[i].typ==1 and !used[i]){
int u = oplist[i].u, v = oplist[i].v;
// deb(u);deb(v);deb(i);dnl;
DCP.add_query(oplist[i],i,curtime);
}
}
DCP.solve();
map<LL,int> gmap;
int groupcount = 0;
gmap[finalhash[1]] = 1;
for(int i=1;i<=k;i++){
int t = posinq[i];
LL cx = hashoftim[t];
if(gmap.find(cx)==gmap.end()){
gmap[cx]= i;
groups[i].push_back(i);
groupcount++;
}
else{
int px = gmap[cx];
groups[px].push_back(i);
}
}
//
cout<<groupcount<<endl;
for(int i=1;i<=k;i++){
if((int)groups[i].size() > 0){
cout<<(int)groups[i].size();
for(int g:groups[i])cout<<" "<<g;
cout<<endl;
}
}
tcreset(n,k);
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
FOR(i,2){
P[i][0]=1;
for(int j=1;j<mx;j++){
P[i][j] = (P[i][j-1]*base[i])%mod[i];
}
}
int t;cin>>t;
for(int cs=1;cs<=t;cs++){
solve(cs);
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 12920kb
input:
2 15 11 8 6 11 1 6 6 9 6 8 1 2 1 5 9 10 2 5 1 add 3 11 1 add 2 3 3 add 5 8 4 add 5 11 3 add 7 10 1 add 6 10 3 add 3 10 1 remove 6 8 5 add 4 9 1 add 2 9 8 add 7 8 3 add 2 4 1 remove 6 9 10 remove 6 9 14 5 2 1 5 1 4 1 add 2 4 1 add 3 4 1 add 2 4 4 add 3 4 4 add 1 3 5 add 1 3 2 add 2 3 1 add 1 2 4 add ...
output:
7 3 1 7 11 5 2 3 4 5 8 2 6 12 1 9 2 10 13 1 14 1 15 5 2 1 14 3 2 4 9 2 3 11 6 5 6 7 8 10 12 1 13
result:
ok 2 test cases (2 test cases)
Test #2:
score: 0
Accepted
time: 245ms
memory: 30860kb
input:
100000 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0...
output:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
result:
ok 100000 test cases (100000 test cases)
Test #3:
score: 0
Accepted
time: 204ms
memory: 24452kb
input:
50000 1 2 0 1 2 1 1 2 1 2 1 1 2 1 1 0 1 1 0 1 1 0 2 2 0 1 add 1 2 2 2 0 1 add 1 2 1 1 0 1 1 0 1 1 0 1 2 0 2 2 0 1 add 1 2 1 1 0 1 2 0 1 1 0 1 1 0 1 2 1 1 2 1 1 0 1 1 0 1 1 0 2 2 1 1 2 1 remove 1 2 1 1 0 1 2 0 2 2 1 1 2 1 remove 1 2 1 2 0 1 2 0 1 1 0 2 2 1 1 2 1 remove 1 2 1 1 0 1 1 0 2 2 0 1 add 1 2...
output:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 1 2 1 1 1 2 1 1 1 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
result:
ok 50000 test cases (50000 test cases)
Test #4:
score: 0
Accepted
time: 486ms
memory: 20928kb
input:
20000 1 1 0 5 4 5 1 4 2 3 2 4 1 3 1 2 1 remove 1 4 1 remove 1 3 3 add 1 3 3 remove 1 4 1 1 0 4 3 1 1 2 1 add 2 3 2 remove 2 3 3 add 2 3 2 4 2 2 3 1 3 1 add 3 4 2 4 0 1 add 3 4 1 3 3 1 3 2 3 1 2 3 3 1 1 2 1 add 2 3 1 add 2 3 2 4 0 1 add 1 2 2 4 3 2 4 1 4 2 3 1 add 1 3 1 2 1 1 2 1 3 3 1 3 2 3 1 2 1 1 ...
output:
1 1 1 1 5 1 2 3 4 5 1 1 1 2 2 1 3 2 2 4 2 1 1 1 2 2 1 1 1 2 1 1 1 2 1 1 2 2 3 2 1 1 1 2 1 2 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 2 3 1 1 2 2 4 1 3 1 1 1 2 3 1 3 4 1 2 1 1 1 1 3 1 2 3 1 1 1 4 2 1 3 1 2 1 4 1 5 1 1 1 1 1 1 2 2 1 4 3 2 3 5 2 1 1 1 2 2 1 1 1 2 1 1 1 3 1 1 1 2 1 3 2 3 1 2 3 1 4 2 1 1 2 2 3 1 1 ...
result:
ok 20000 test cases (20000 test cases)
Test #5:
score: 0
Accepted
time: 984ms
memory: 19664kb
input:
10000 1 4 4 3 4 1 3 1 2 2 3 3 4 4 2 3 1 3 1 2 3 4 1 add 2 4 1 remove 3 4 8 6 9 1 5 3 5 2 3 1 3 3 4 4 5 1 2 2 5 4 6 1 remove 3 5 2 remove 3 4 3 remove 1 3 3 remove 1 3 1 add 5 6 1 add 3 6 1 add 2 6 1 1 0 2 5 9 3 4 4 5 1 4 1 3 1 5 3 5 2 5 1 2 2 3 1 remove 2 3 9 2 1 1 2 1 remove 1 2 2 add 1 2 1 remove ...
output:
1 1 1 2 2 1 2 1 3 1 8 1 2 3 4 5 6 7 8 1 1 1 1 2 1 2 2 3 1 3 9 6 2 4 5 6 7 8 7 1 1 1 2 2 3 8 1 4 2 5 6 1 7 1 9 3 2 1 3 1 2 1 4 4 1 1 1 2 2 3 5 1 4 1 1 1 5 1 1 1 2 1 3 1 4 1 5 5 1 1 2 2 6 1 3 1 4 1 5 4 1 1 3 2 3 7 3 4 6 8 1 5 2 1 1 1 2 3 1 1 1 2 1 3 2 3 1 4 5 2 2 3 1 1 1 5 1 1 1 2 4 3 4 6 7 2 5 8 1 9 ...
result:
ok 10000 test cases (10000 test cases)
Test #6:
score: 0
Accepted
time: 1445ms
memory: 18528kb
input:
5000 18 10 13 4 7 2 5 1 8 8 10 4 6 9 10 3 10 8 9 1 7 2 4 3 9 2 9 2 3 1 remove 1 7 1 remove 4 7 1 add 6 8 4 add 5 6 2 add 4 9 3 add 2 6 6 remove 4 9 6 add 3 6 7 remove 2 9 10 add 6 10 9 add 7 9 8 add 3 6 8 add 1 9 1 remove 1 7 2 add 4 10 5 add 3 5 13 add 5 7 9 3 3 2 3 1 3 1 2 1 remove 2 3 1 remove 1 ...
output:
1 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 3 6 1 2 3 4 5 7 2 6 8 1 9 6 1 1 5 2 4 7 8 10 3 3 5 11 1 6 1 9 1 12 1 8 1 2 3 4 5 6 7 8 17 1 1 1 2 2 3 5 1 4 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 2 4 1 2 5 6 2 3 4 1 3 1 2 3 5 1 1 1 2 1 3 1 4 1 5 1 1 1 1 1 1 1 1 1 2 1 1 7 2 3 4...
result:
ok 5000 test cases (5000 test cases)
Test #7:
score: 0
Accepted
time: 1984ms
memory: 17564kb
input:
2000 11 40 21 6 19 16 18 24 30 13 35 16 32 7 11 17 38 28 33 32 36 17 26 28 30 2 19 3 17 9 12 21 34 8 40 13 27 23 36 24 32 22 27 16 31 1 add 4 11 2 add 31 34 1 add 8 13 2 add 8 22 5 add 6 30 6 add 21 29 1 add 12 38 6 add 27 32 1 add 33 35 3 add 13 18 27 49 19 10 46 15 47 23 34 38 39 20 24 2 18 1 13 4...
output:
11 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 26 2 1 25 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 26 1 27 1 1 1 37 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25...
result:
ok 2000 test cases (2000 test cases)
Test #8:
score: -100
Time Limit Exceeded
input:
1000 54 84 96 19 74 38 61 61 66 26 59 31 56 12 48 24 63 5 14 12 14 51 78 36 49 18 64 14 38 16 50 55 75 29 52 15 65 12 27 3 13 40 52 48 83 7 81 23 30 23 54 62 74 32 75 66 67 4 69 32 34 8 23 78 80 24 70 3 52 22 73 19 35 22 52 17 60 49 83 9 63 53 81 18 29 8 9 34 47 23 82 30 81 53 61 16 62 2 7 19 25 17 ...
output:
6 43 1 2 3 4 5 6 7 8 11 12 13 14 16 17 20 21 22 23 24 25 26 27 28 30 32 34 35 36 37 38 39 40 41 42 44 45 46 47 48 49 52 53 54 7 9 15 18 19 29 31 33 1 10 1 43 1 50 1 51 87 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 2...