Sample input:
3 5 10 5 4 10 8 1 10 1 3 1 4 1 5 1 3 2 1 2 5 4 3 4 3 4 5 5 1 1 4 4 6 1 9 4 7 2 9 5 10 5 2 8 8 10 10 2 1 2 3 3 2 3 4 3 1 3 2 3 4 4 1 5 4 5 1 1 4 2 3 4 7 3 10 1 5 5 10 5 9 9 8 2 1 1 5 1 5 2 1 2 4 2 4 2 4 3 2 3 1 4 3 4 3 5 9 3 9 2 7 5 1 5 4
Sample output:
40 60 90 70 90 8 30 70 100 10 9 81 63 1 4
data range:
Ideas:
Make a point of maximum sum of all points of Unicom
Correct answer is tarjan, but can be greedy, to build the reverse side, about descending order, from largest to that point wide search, to sweep the updated value is his starting point (that is, the maximum point Unicom) , out of all the points after the update, you can query each time the questioning. . . .
Note that reference numerals will be changed after sorting, and the other opening array weights before sorting records corresponding to each label;
dfs bfs can be. . . .
Multiple sets of inquiry, note that each array is cleared. . .
Code:
bfs:
#include<cstdio> #include<bits/stdc++.h> #define MAXN 1000000 using namespace std; int cnt,head[MAXN],T,n,m,k,ans[MAXN],tot,num[MAXN],pos,cnt1[MAXN]; int val[MAXN]; bool v[MAXN]; struct node{int to,nxt;}e[MAXN<<1]; struct node2{int val,id;}ee[MAXN<<1]; void add(int from,int to) { e[++cnt].to=to; e[cnt].nxt=head[from]; head[from]=cnt; } queue <int> q; bool cmp(const node2 &a,const node2 &b) {return a.val>b.val;} void bfs(int u) { q.push(u); v[u]=1; pos++; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=head[x] ; i ; i=e[i].nxt) { int y=e[i].to; if(!v[y]) { pos++; val[y]=val[u]; v[y]=1; q.push(y); } } } } void init() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) { scanf("%d",&ee[i].val); val[i]=ee[i].val; ee[i].id=i; } sort(ee+1,ee+n+1,cmp); for(int i=1;i<=n;i++)num[i]=ee[i].id; for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); add(y,x); } for(int i=1;i<=n;i++) { if(!v[num[i]])bfs(num[i]); } int a,u; for(int i=1;i<=k;i++) { scanf("%d%d",&a,&u); ans[++tot]=val[a]*u; } } void clear() { memset(head,0,sizeof(head)); memset(e,0,sizeof(e)); memset(ee,0,sizeof(ee)); memset(v,0,sizeof(v)); memset(num,0,sizeof(num)); memset(val,0,sizeof(val)); } int main() { #ifdef yilnr #else freopen("neural.in","r",stdin); freopen("neural.out","w",stdout); #endif scanf("%d",&T); while(T--) { init(); for(int i=1;i<=k;i++) printf("%d\n",ans[i]); clear(); tot=0;pos=0; } fclose(stdin);fclose(stdout); return 0; }
dfs:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define N 400500 using namespace std; inline int read() { int x = 0,f = 1; char s = getchar(); while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();} while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();} return x * f; } int T,n,m,k; int head[N],cnt; struct node { int nxt,to; }e[N]; bool vis[N]; struct edge { int num,id; bool friend operator < (const edge &a,const edge &b) { return a.num > b.num; } }tr[N]; long long sum[N]; inline void cp(int u,int v) { cnt ++; e[cnt].to = v; e[cnt].nxt = head[u]; head[u] = cnt; } inline void dfs(int u,int top) { vis[u] = 1; for(int i = head[u]; i ; i = e[i].nxt) { int v = e[i].to; if(vis[v]) continue; sum[v] = sum[top]; dfs(v,top); } } inline void Work() { n = read(),m = read(),k = read(); for(int i = 1;i <= n;i ++) tr[i].num = read(),tr[i].id = i,sum[i] = tr[i].num; for(int i = 1;i <= m;i ++) { int a = read(),b = read(); cp(b,a); } sort(tr + 1,tr + n + 1); for(int i = 1;i <= n;i ++) if(!vis[tr[i].id]) dfs(tr[i].id,tr[i].id); for(int i = 1;i <= k;i ++) { int a = read(),b = read(); printf("%lld\n",sum[a] * b); } } inline void Clean() { memset(sum,0,sizeof(sum)); memset(tr,0,sizeof(tr)); cnt = 0; memset(head,0,sizeof(head)); memset(vis,0,sizeof(vis)); } int main() { freopen("neural.in","r",stdin); freopen("neural.out","w",stdout); T = read(); while(T --) Work(),Clean(); return 0; }
dfs来自清远学会