QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#588423 | #8809. Telephone Plans | chenxinyang2006# | 0 | 2ms | 12120kb | C++20 | 5.4kb | 2024-09-25 10:52:44 | 2024-09-25 11:42:33 |
Judging History
answer
#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
//#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;
template <class T>
void chkmax(T &x,T y){
if(x < y) x = y;
}
template <class T>
void chkmin(T &x,T y){
if(x > y) x = y;
}
inline int popcnt(int x){
return __builtin_popcount(x);
}
inline int ctz(int x){
return __builtin_ctz(x);
}
/*ll power(ll p,int k = mod - 2){
ll ans = 1;
while(k){
if(k % 2 == 1) ans = ans * p % mod;
p = p * p % mod;
k /= 2;
}
return ans;
}*/
int online;
int n,m,q;
mt19937 rnd(0);
struct solver{
ll answer;
int fa[500005],siz[500005];
struct node{
int rev,sum,val,siz,l,r,w,fa;
}tree[500005];
#define ls(rt) tree[rt].l
#define rs(rt) tree[rt].r
void pushup(int rt){
tree[rt].sum = tree[rt].val + tree[ls(rt)].sum + tree[rs(rt)].sum;
tree[rt].siz = 1 + tree[ls(rt)].siz + tree[rs(rt)].siz;
}
void upd(int rt,int C){
if(!C) return;
tree[rt].rev ^= 1;
swap(ls(rt),rs(rt));
}
void pushdown(int rt){
if(!tree[rt].rev) return;
upd(ls(rt),1);upd(rs(rt),1);
tree[rt].rev = 0;
}
void ssplit(int rt,int k,int &x,int &y){
if(!rt){
x = y = 0;
return;
}
pushdown(rt);
if(k >= tree[ls(rt)].siz + 1){
x = rt;
ssplit(rs(rt),k - tree[ls(rt)].siz - 1,rs(rt),y);
if(rs(rt)) tree[rs(rt)].fa = rt;
}else{
y = rt;
ssplit(ls(rt),k,x,ls(rt));
if(ls(rt)) tree[ls(rt)].fa = rt;
}
pushup(rt);
}
void split(int rt,int k,int &x,int &y){
x = y = 0;
ssplit(rt,k,x,y);
tree[x].fa = tree[y].fa = 0;
}
int Merge(int x,int y){
if(!x || !y) return x + y;
if(tree[x].w < tree[y].w){
pushdown(x);
rs(x) = Merge(rs(x),y);
tree[rs(x)].fa = x;
pushup(x);
return x;
}else{
pushdown(y);
ls(y) = Merge(x,ls(y));
tree[ls(y)].fa = y;
pushup(y);
return y;
}
}
int top;
int stk[50];
void fix(int u){
while(u){
stk[++top] = u;
u = tree[u].fa;
}
while(top) pushdown(stk[top--]);
}
void refix(int u){
tree[u].val = siz[u];
while(u){
pushup(u);
u = tree[u].fa;
}
}
int getrank(int u){
fix(u);
int sum = 1 + tree[ls(u)].siz,v;
while(u){
v = tree[u].fa;
if(u == rs(v)) sum += tree[ls(v)].siz;
u = v;
}
return sum;
}
int getrt(int u){
while(tree[u].fa) u = tree[u].fa;
return u;
}
int gettop(int u){
u = getrt(u);
while(1){
pushdown(u);
if(ls(u)) u = ls(u);
else return u;
}
}
void prt(int u){
printf("node %d ls %d rs %d fa %d rev %d val %d sum %d siz %d\n",u,ls(u),rs(u),tree[u].fa,tree[u].rev,tree[u].val,tree[u].sum,tree[u].siz);
}
void travel(int u){
if(ls(u)) travel(ls(u));
prt(u);
if(rs(u)) travel(rs(u));
}
void access(int u){
// printf("access %d\n",u);
int temp = getrank(u),rt = getrt(u),a,b;
// printf("temp=%d\n",temp);
if(tree[rt].siz != temp){
split(rt,temp,a,b);
/* printf("travela\n");
travel(a);
printf("travelb\n");
travel(b);
printf("fin\n");*/
siz[u] += tree[b].sum;
fa[gettop(b)] = u;
refix(u);
}
// printf("part\n");
// dbg();
while(1){
int v = gettop(u);
if(!fa[v]){
// printf("fin\n");
// dbg();
return;
}
rt = getrt(fa[v]);
temp = getrank(fa[v]);
if(tree[rt].siz != temp){
split(rt,temp,a,b);
siz[fa[v]] += tree[b].sum;
fa[gettop(b)] = fa[v];
rt = a;
}
siz[fa[v]] -= tree[getrt(u)].sum;
refix(fa[v]);
fa[v] = 0;
Merge(rt,getrt(u));
}
}
void makeroot(int u){
access(u);
upd(getrt(u),1);
}
void dbg(){
rep(u,1,n) prt(u);
printf("extra structor\n");
rep(u,1,n) printf("%d ",fa[u]);
printf("\n");
rep(u,1,n) printf("%d ",siz[u]);
printf("\n");
}
void link(int u,int v){
// printf("link %d %d\n",u,v);
makeroot(u);
makeroot(v);
answer += 1ll * tree[getrt(u)].sum * tree[getrt(v)].sum;
fa[v] = u;siz[u] += tree[getrt(v)].sum;
refix(u);
// printf("[fin answer=%lld]\n",answer);
// dbg();
}
void cut(int u,int v){
// printf("[[[[[[[[[[[cut %d %d]]]]]]]]]]\n",u,v);
makeroot(u);
access(v);access(u);
answer -= 1ll * (tree[getrt(u)].sum - tree[getrt(v)].sum) * tree[getrt(v)].sum;
fa[v] = 0;siz[u] -= tree[getrt(v)].sum;
refix(u);
// printf("[fin answer=%lld]\n",answer);
// dbg();
}
void init(){
rep(u,1,n){
siz[u] = tree[u].sum = tree[u].val = 1;
tree[u].siz = 1;
tree[u].w = rnd();
}
}
}P,Q;
ll a[6005],b[6005];
ll calc(int l,int r){
ll sum = 0;
rep(i,l,r) sum += a[i];
rep(i,l + 1,r) sum -= b[i];
return sum;
}
int main(){
// freopen("test.in","r",stdin);
scanf("%d%d%d",&online,&n,&q);
P.init();
Q.init();
int op;
ll x,y,lastans = 0;
rep(i,1,q){
scanf("%d%lld",&op,&x);
if(op < 3) scanf("%lld",&y);
if(online){
x ^= lastans;
y ^= lastans;
}
if(op == 1){
P.link(x,y);
}else if(op == 2){
P.cut(x,y);
Q.cut(x,y);
}
a[i] = P.answer;
b[i] = Q.answer;
if(op == 1) Q.link(x,y);
if(op == 3){
lastans = calc(i - x,i);
printf("%lld\n",lastans);
}
}
return 0;
}
详细
Subtask #1:
score: 0
Time Limit Exceeded
Test #1:
score: 3
Accepted
time: 0ms
memory: 12120kb
input:
0 1 147 3 0 3 0 3 1 3 1 3 0 3 5 3 5 3 1 3 1 3 4 3 8 3 2 3 10 3 13 3 10 3 8 3 8 3 0 3 16 3 3 3 1 3 20 3 2 3 10 3 16 3 13 3 17 3 12 3 22 3 7 3 8 3 2 3 12 3 32 3 12 3 31 3 2 3 0 3 21 3 24 3 28 3 32 3 9 3 18 3 26 3 11 3 45 3 35 3 14 3 34 3 49 3 31 3 43 3 11 3 21 3 50 3 4 3 11 3 31 3 51 3 28 3 26 3 18 3 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 147 lines
Test #2:
score: 3
Accepted
time: 1ms
memory: 9936kb
input:
0 2 10 1 1 2 3 1 3 1 3 2 3 3 3 3 3 3 2 1 2 3 2 3 3
output:
1 1 1 1 1 1 1 1
result:
ok 8 lines
Test #3:
score: 0
Time Limit Exceeded
input:
0 30 150 1 14 10 3 1 1 14 6 1 3 6 3 4 3 4 1 2 3 3 0 3 5 1 2 9 1 11 9 3 8 1 19 11 3 6 1 8 19 3 14 3 10 1 27 8 3 15 1 27 28 1 28 20 3 0 3 3 1 20 7 1 7 23 3 13 3 5 1 24 23 3 0 3 28 1 24 13 3 5 3 32 3 1 3 13 1 30 13 3 25 1 30 16 1 15 16 3 22 1 29 15 3 13 1 29 25 1 25 1 1 1 18 3 17 3 8 3 10 1 26 18 3 46 ...
output:
result:
Subtask #2:
score: 0
Time Limit Exceeded
Test #29:
score: 2
Accepted
time: 2ms
memory: 12116kb
input:
1 1 147 3 0 3 0 3 1 3 1 3 3 3 0 3 6 3 6 3 0 3 2 3 0 3 5 3 12 3 1 3 2 3 10 3 13 3 15 3 3 3 12 3 20 3 18 3 10 3 12 3 2 3 12 3 14 3 26 3 12 3 24 3 7 3 7 3 6 3 29 3 32 3 16 3 23 3 14 3 25 3 13 3 13 3 31 3 20 3 26 3 0 3 40 3 23 3 28 3 35 3 1 3 31 3 2 3 34 3 37 3 3 3 39 3 17 3 4 3 41 3 11 3 16 3 48 3 10 3...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 147 lines
Test #30:
score: 2
Accepted
time: 2ms
memory: 12120kb
input:
1 2 10 1 1 2 3 1 3 1 3 1 3 1 3 1 3 2 3 6 2 0 3 3 2
output:
1 1 1 1 1 1 1 1
result:
ok 8 lines
Test #31:
score: 0
Time Limit Exceeded
input:
1 30 150 1 21 13 3 1 1 9 20 3 2 3 2 1 18 11 1 18 0 3 6 3 9 3 8 1 12 9 3 8 3 7 1 10 9 3 5 3 24 3 26 3 28 1 6 16 3 6 3 14 1 15 23 3 21 3 48 1 60 47 3 53 3 37 1 35 53 3 56 1 57 59 1 59 37 3 63 3 95 3 94 1 92 79 3 65 1 90 81 1 95 81 3 75 3 111 3 118 3 100 1 124 98 1 101 98 3 121 3 132 3 137 3 153 1 141 ...
output:
result:
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #2:
0%
Subtask #5:
score: 0
Skipped
Dependency #3:
0%
Subtask #6:
score: 0
Skipped
Dependency #4:
0%
Subtask #7:
score: 0
Skipped
Dependency #6:
0%