社区讨论
30pts Substack1 过了 Substzck2对一个 其他全WA求调
P7924「EVOI-RD2」旅行家参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj93j1l
- 此快照首次捕获于
- 2025/11/03 22:44 4 个月前
- 此快照最后确认于
- 2025/11/03 22:44 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const long long maxn=5e5+10;
struct node{
long long fr,to,next;
}edge[maxn*8+10],edge2[maxn*8+10];
long long n,m,vex[maxn],vex2[maxn],ei,ei2,cha[maxn];
void add(long long u ,long long v){
edge[++ei].next=vex[u];
vex[u]=ei;
edge[ei].fr=u;
edge[ei].to=v;
}
void add2(long long u ,long long v){
edge2[++ei2].next=vex2[u];
vex2[u]=ei2;
edge2[ei2].fr=u;
edge2[ei2].to=v;
}
long long dfn[maxn],low[maxn],co[maxn],num,cnt,w1[maxn],w2[maxn];
stack<long long> s;
bool vis[maxn];
void tarjan(long long u,long long fa){
dfn[u]=low[u]=++cnt;
vis[u]=1;
s.push(u);
for(long long i=vex2[u];i;i=edge2[i].next){
long long v=edge2[i].to;
if(v==fa){
continue;
}
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
}else if(vis[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
++num;
long long y;
while(1){
y=s.top();
s.pop();
vis[y]=0;
w2[num]+=w1[y];
co[y]=num;
if(y==u){
break;
}
}
}
}
long long cd[maxn],rd[maxn],tp[maxn];
long long f[maxn][25],dep[maxn];
void dfs(long long u,long long fa){
dep[u]=dep[fa]+1;
f[u][0]=fa;
// cout<<1;
for(long long i=vex[u];i;i=edge[i].next){
long long v=edge[i].to;
if(v!=fa){
dfs(v,u);
}
}
}
long long lca(long long x,long long y){
if(dep[x]<dep[y]){
swap(x,y);
}
for(long long i=20;i>=0;i--){
if(dep[f[x][i]]>=dep[y]){
x=f[x][i];
}
}
if(x==y){
return y;
}
for(long long i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
long long ans=0;
void dfs2(long long u,long long fa){
for(long long i=vex[u];i;i=edge[i].next){
long long v=edge[i].to;
if(v!=fa){
dfs2(v,u);
cha[u]+=cha[v];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%d",&w1[i]);
}
for(long long i=1;i<=m;i++){
long long u,v;
scanf("%d%d",&u,&v);
add2(u,v);
add2(v,u);
}
for(long long i=1;i<=n;i++){
if(!co[i]){
tarjan(i,0);
}
// cout<<co[i]<<" ";
}
// cout<<endl;
for(long long i=1;i<=m;i++){
long long c1=co[edge2[i].fr],c2=co[edge2[i].to];
if(c1!=c2){
add(c1,c2);
add(c2,c1);
rd[c2]++;
cd[c1]++;
}
}
dfs(co[1],0);
long long q;
scanf("%d",&q);
for(long long i=1;i<=q;i++){
long long a,b;
scanf("%d%d",&a,&b);
a=co[a],b=co[b];
// cout<<a<<" "<<b<<endl;
if(co[a]==co[b]){
cha[a]++;
cha[f[a][0]]--;
}else{
cha[a]++;
cha[b]++;
long long t=lca(a,b);
cha[t]--;
cha[f[t][0]]--;
}
}
dfs2(co[1],0);
for(long long i=1;i<=num;i++){
if(cha[i]>0){
ans+=w2[i];
}
}
cout<<ans;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...