社区讨论
66ptsTLE求助
P4374[USACO18OPEN] Disruption P参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjhaf8s
- 此快照首次捕获于
- 2025/11/04 02:33 4 个月前
- 此快照最后确认于
- 2025/11/04 02:33 4 个月前
如题。本人已调试 2 小时未发现问题,讨论区内没有发现类似情况,故在此求助。
做法为树链剖分。
提交记录:https://www.luogu.com.cn/record/231091879
代码:
CPP#include<bits/stdc++.h>
using namespace std;
struct edg{
int u,v;
}egs[50010];
vector<int>g[50010];
//------start segtree------
int tag[333333];
struct nod{
int l,r;
int mi=0x7f7f7f7f;
}sgt[333333];
nod operator +(const nod&n1,const nod&n2){
nod ans;
ans.l=n1.l;
ans.r=n2.r;
// cout<<ans.mi<<"->";
ans.mi=max(n1.mi,n2.mi);
// cout<<ans.mi<<endl;
return ans;
}
void psd(int idx){
int tg=tag[idx];
tag[idx]=0x7f7f7f7f;
sgt[idx<<1].mi=min(sgt[idx<<1].mi,tg);
tag[idx<<1]=min(tag[idx<<1],tg);
sgt[idx<<1|1].mi=min(sgt[idx<<1|1].mi,tg);
tag[idx<<1|1]=min(tag[idx<<1|1],tg);
}
void build(int l,int r,int id){
if(l==r){
sgt[id].l=sgt[id].r=l;
return ;
}
int mid=(l+r)>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
sgt[id]=sgt[id<<1]+sgt[id<<1|1];
}
void modify(int l,int r,int nl,int nr,int id,int v){
if(nl>nr)swap(nl,nr);
// cout<<l<<" "<<r<<" "<<nl<<" "<<nr<<endl;
if(nl<=l&&r<=nr){
// cout<<"-"<<l<<" "<<r<<" "<<v<<endl;
sgt[id].mi=min(sgt[id].mi,v);
tag[id]=min(tag[id],v);
return ;
}
if(l>nr||r<nl)return ;
psd(id);
int mid=(l+r)>>1;
modify(l,mid,nl,nr,id<<1,v);
modify(mid+1,r,nl,nr,id<<1|1,v);
sgt[id]=sgt[id<<1]+sgt[id<<1|1];
}
nod query(int l,int r,int nl,int nr,int id){
if(nl>nr)swap(nl,nr);
if(nl<=l&&r<=nr){
return sgt[id];
}
psd(id);
int mid=(l+r)>>1;
if(mid>=nr)return query(l,mid,nl,nr,id<<1);
else if(mid<nl)return query(mid+1,r,nl,nr,id<<1|1);
else return query(l,mid,nl,nr,id<<1)+query(mid+1,r,nl,nr,id<<1|1);
}
//------end segtree------
//------start shupou------
int dfn[50010],cn=0;
int top[50010];
int siz[50010];
int dep[50010];
int fu[50010];
void dfs(int u,int fa){
siz[u]=1;
dep[u]=dep[fa]+1;
fu[u]=fa;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==fa)continue;
dfs(v,u);
siz[u]+=siz[v];
}
}
void df2(int u,int fa){
cn++;
dfn[u]=cn;
int mx=0,mxi;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==fa)continue;
if(siz[v]>mx){
siz[v]=mx;
mxi=i;
}
}
if(g[u].size()==0||(u!=1&&g[u].size()==1))return ;
swap(g[u][mxi],g[u][0]);
top[g[u][0]]=top[u];
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==fa)continue;
if(i)top[v]=v;
df2(v,u);
}
}
//------end shupou------
int ans[50010];
int main(){
// freopen("P4374_11.in","r",stdin);
// cout<<0x3f3f3f3f<<endl;
memset(tag,0x7f,sizeof(tag));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int p,q;
scanf("%d%d",&p,&q);
g[p].push_back(q);
g[q].push_back(p);
egs[i].u=p;
egs[i].v=q;
}
dfs(1,1);
top[1]=1;
df2(1,1);
// for(int i=1;i<=n;i++){
// cout<<dep[i]<<" ";
// }
// cout<<endl;
build(1,n,1);
while(m--){
int p,q,r;
scanf("%d%d%d",&p,&q,&r);
int cn=0;
while(top[p]!=top[q]){
if(dep[top[p]]<dep[top[q]])swap(p,q);
modify(1,n,dfn[top[p]],dfn[p],1,r);
p=fu[top[p]];
cn++;
}
// cout<<m<<" "<<cn<<endl;
if(dep[p]<dep[q])swap(p,q);
if(p==q)continue;
// cout<<"("<<q<<" "<<p<<endl;
modify(1,n,dfn[q]+1,dfn[p],1,r);
}
for(int i=1;i<n;i++){
int u=egs[i].u,v=egs[i].v;
if(dep[u]<dep[v])swap(v,u);
int val=query(1,n,dfn[u],dfn[u],1).mi;
if(val!=0x7f7f7f7f){
printf("%d\n",val);
}else{
printf("-1\n");
}
}
return 0;
}
违规自删。
回复
共 1 条回复,欢迎继续交流。
正在加载回复...