社区讨论
淀粉树求卡常
P4115Qtree4参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj44072f
- 此快照首次捕获于
- 2025/12/13 17:44 3 个月前
- 此快照最后确认于
- 2025/12/15 20:55 3 个月前
我已经做了可删堆的优化了,可还是只有64pts,求卡常。
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
//multiset<int> ans;
struct mpq{
priority_queue<int> q1,q2;
void erase(int x){q2.push(x);}
void insert(int x){q1.push(x);}
int mx(){
while(q1.size()&&q2.size()&&q1.top()==q2.top())q1.pop(),q2.pop();
return q1.top();
}
int size(){return q1.size()-q2.size();}
}ans;
struct node{
unordered_map<int,mpq> ump;
mpq ans;
int getans(){
if(ans.size()<=1)return -1;
int u=ans.mx(),u2;
ans.erase(u);
u2=ans.mx();
ans.insert(u);
return u+u2;
}
void insert(int v,int fr){
bool ok=0,ok2=ump[fr].size();
if(ump[fr].size())if(ump[fr].mx()<v)ans.erase(ump[fr].mx()),ok=1;
ump[fr].insert(v);
if(!ok2||ok)ans.insert(v);
}
void erase(int v,int fr){
ans.erase(ump[fr].mx());
ump[fr].erase(v);
if(ump[fr].size())ans.insert(ump[fr].mx());
}
}tree[100005];
unordered_map<int,int> dep[100005];
int siz[100005],cut[100005],fa[100005],cl[100005],n,a,b,c,q;
vector<pair<int,int> > edge[100005];
void dfs1(int u,int fa){
siz[u]=1;
for(auto i:edge[u]){
if(i.first!=fa&&!cut[i.first])dfs1(i.first,u),siz[u]+=siz[i.first];
}
}
int zx(int u,int fa,int rt){
if((siz[rt]-siz[u])*2>siz[rt])return -1;
bool ok=1;
for(auto i:edge[u]){
if(i.first!=fa&&!cut[i.first]){
int re=zx(i.first,u,rt);
if(~re)return re;
if(siz[i.first]*2>siz[rt])ok=0;
}
}
return (ok?u:-1);
}
void init(int u,int fa,int rt,int udep){
dep[rt][u]=udep;
for(auto i:edge[u]){
if(i.first!=fa&&!cut[i.first]){
init(i.first,u,rt,udep+i.second);
}
}
}
int dfz(int u){
dfs1(u,0);
u=zx(u,0,u);
init(u,0,u,0);
cut[u]=1;
for(auto i:edge[u]){
if(!cut[i.first])fa[dfz(i.first)]=u;
}
return u;
}
void to1(int u){
for(int i=u,fr=u;i;fr=i,i=fa[i]){
int tans=tree[i].getans();
if(~tans)ans.erase(tans);
tree[i].insert(dep[i][u],fr);
tans=tree[i].getans();
if(~tans)ans.insert(tans);
}
}
void to0(int u){
for(int i=u,fr=u;i;fr=i,i=fa[i]){
int tans=tree[i].getans();
if(~tans)ans.erase(tans);
tree[i].erase(dep[i][u],fr);
tans=tree[i].getans();
if(~tans)ans.insert(tans);
}
}
int cnt=0;
void change(int u){
if(cl[u]==1)to0(u),cnt--;
else to1(u),cnt++;
cl[u]=!cl[u];
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
cin>>a>>b>>c;
edge[a].emplace_back(b,c);
edge[b].emplace_back(a,c);
}
dfz(1);
for(int i=1;i<=n;i++)change(i);
cin>>q;
char c;
int x;
while(q--){
cin>>c;
if(c=='A'){
if(!cnt)cout<<"They have disappeared.\n";
else if(cnt==1)cout<<"0\n";
else cout<<max(0,/**prev(ans.end())*/ans.mx())<<'\n';
}else{
cin>>x;
change(x);
}
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...