社区讨论
淀粉树秋调
P2056[ZJOI2007] 捉迷藏参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjadao5
- 此快照首次捕获于
- 2025/11/03 23:19 4 个月前
- 此快照最后确认于
- 2025/11/03 23:19 4 个月前
,不知道为什么,一直 .
CPP#include<bits/stdc++.h>
#define int long long
#define ls (lc[p])
#define rs (rc[p])
#define mid (l+r>>1)
#define PII pair<int,int>
#define fs first
#define sd second
#define cp complex<double>
#define exint __int128
using namespace std;
const int N=100005;
vector<int> G[N];
int n;
int dep[N];
int fa[N][19];
void dfs(int x,int f){
dep[x]=dep[f]+1;
fa[x][0]=f;
for(int i=1;i<19;i++) fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(y==f) continue;
dfs(y,x);
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=18;i>=0;i--){
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
}
if(x==y) return x;
for(int i=18;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int dis(int x,int y){
int LCA=lca(x,y);
return dep[x]+dep[y]-2*dep[LCA];
}
int root;
int siz[N];
int son[N];
bool v[N];
void getroot(int x,int f,int sz,int &root,int &maxn){
siz[x]=1;
son[x]=0;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(v[y]||y==f) continue;
getroot(y,x,sz,root,maxn);
siz[x]+=siz[y];
son[x]=max(son[x],siz[y]);
}
son[x]=max(son[x],sz-siz[x]);
if(son[x]<maxn){
maxn=son[x];
root=x;
}
}
struct pq{
priority_queue<int> q;
unordered_map<int,int> num;
bool empty(){
while(!q.empty()&&num[q.top()]){
num[q.top()]--;
q.pop();
}
return q.empty();
}
void pop(int x){
num[x]++;
}
int top(){
while(!q.empty()&&num[q.top()]){
num[q.top()]--;
q.pop();
}
assert(!q.empty());
return q.top();
}
void push(int x){
if(num[x]) num[x]--;
else q.push(x);
}
};
pq newnode(){
pq a;
while(!a.q.empty()) a.q.pop();
a.num.clear();
return a;
}
pq ans;
pq tans[N];
pq fans[N];
int f[N];
int build(int x,int sz){
int maxn=sz+10;
getroot(x,0,sz,x,maxn);
v[x]=1;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(v[y]) continue;
int ch=build(y,sz-son[y]);
f[ch]=x;
}
return x;
}
int solve(pq q){
if(q.empty()) return -1;
// return 0;
int x=q.top();
q.pop(x);
if(q.empty()) return 0;
int y=q.top();
return x+y;
}
void insert(int x){
ans.pop(solve(tans[x]));
tans[x].push(0);
ans.push(solve(tans[x]));
int t=x;
int y=0;
while(x){
y=x;
x=f[x];
int sum=dis(x,t);
ans.pop(solve(tans[x]));
if(!fans[y].empty()) tans[x].pop(fans[y].top());
fans[y].push(sum);
tans[x].push(fans[y].top());
ans.push(solve(tans[x]));
}
}
void erase(int x){
ans.pop(solve(tans[x]));
tans[x].pop(0);
ans.push(solve(tans[x]));
int t=x;
int y=0;
while(x){
y=x;
x=f[x];
int sum=dis(x,t);
ans.pop(solve(tans[x]));
tans[x].pop(fans[y].top());
fans[y].pop(sum);
if(!fans[y].empty())tans[x].push(fans[y].top());
ans.push(solve(tans[x]));
}
}
bool l[N];
int read(int &x){
char c=getchar();
x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x;
}
void write(int x){
if(x==0){
putchar('0');
return;
}
if(x/10) write(x/10);
putchar((x%10)^48);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
read(n);
for(int i=1;i<n;i++){
int x,y;
read(x);
read(y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,0);
root=build(1,n);
// for(int i=1;i<=n;i++) cout<<f[i]<<' ';
// cout<<'\n';
for(int i=1;i<=n;i++) ans.push(-1);
for(int i=1;i<=n;i++) insert(i);
int m;
read(m);
while(m--){
char c=getchar();
while(c!='C'&&c!='G') c=getchar();
if(c=='G'){
if(ans.empty()||ans.top()<0) putchar('-'),putchar('1');
else write(ans.top());
putchar('\n');
}else{
int x;
read(x);
if(!l[x]){
erase(x);
l[x]=1;
}else{
insert(x);
l[x]=0;
}
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...