站外题求调
  • 板块灌水区
  • 楼主Martlet
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/8 20:58
  • 上次更新2023/10/23 19:01:04
查看原帖
站外题求调
543717
Martlet楼主2023/4/8 20:58

#include<bits/stdc++.h>
using namespace std;
vector<int> G[100010],G2[100010],ys[100010];
int dfn[100010],low[100010],stk[1000010],res[100010];
int t;
int scn,top;
int a[10000010];
bool instk[10000010];
int sum[10000010];
void dfs(int u){
	t++;
    dfn[u] = low[u] = t;
    stk[top++] = u;
    instk[u] = 1;
    for(int i = 0;i < G[u].size();i++){
    	int v = G[u][i];
    	if(dfn[v]){
    		if(instk[v])low[u] = min(low[u],dfn[v]);
    		continue;
		}
		dfs(v);
		low[u] = min(low[u],low[v]);
	} 
	if(low[u] == dfn[u]){
		scn++;
		res[u] = scn;
		while(1){
			int v = stk[--top];
			sum[scn] += a[v];
			instk[v] = 0;
			res[v] = scn;
			ys[scn].push_back(v);
			if(u == v)break;
		}
	}
}
bool se[10000010];
void build(){
	for(int i = 1;i <= scn;i++){
		for(int j = 0;j < ys[i].size();j++){
			int v = ys[i][j];
			for(int k = 0;k < G[v].size();k++){
				int vis = G[v][k];
				if(!se[res[vis]]&&res[vis]!=i){
					se[res[vis]] = 1;
					G2[i].push_back(res[vis]);
				}
			}
		}
	}
}
int s;
void gets(int u,int p){

	s+=sum[u];
	for(int i = 0;i < G2[u].size();i++){
		int v = G2[u][i];
		if(v == p)continue;
		gets(v,u);
	}
    return;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
	}
	for(int i = 1;i <= m;i++){
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
	}
	for(int i = 1;i <= n;i++){
		if(!dfn[i])dfs(i);
	}
	build();

    
	int q;
	cin>>q;
	for(int i = 1;i <= q;i++){
		int u;
		cin>>u;
		u = res[u];
		s = 0;
		gets(u,-1);
		cout<<s<<endl;
	}
   return 0;
}  

大红大紫

结果MLE,WA,RE都有

2023/4/8 20:58
加载中...