標籤:style blog color os io for
// 第二題 我記得很久很久很久以前看過這樣的題目,忘記是哪的地區賽了
// 記得有人說和節點度數有關,我記不清了,反正當時完全不懂
// 然後我想了想,估計就是更新節點度數有關,YY出來可能只要更新相鄰節點度數更大或更小的就可以了
// 複雜度不知道多少,就是提交了試試,15MS就過了
// 看來就是這樣了
// 具體就是求出每個節點度數,然後每次更新時,只要更新與自己相連,但度數比自己大的
// 查詢時把度數自己大的節點累加的值加上就可輸出,具體看代碼比較清楚
// 也就做得來這2題了(見識少,以前題目做得少)。
// 不過在廈門實訓感覺蠻悠閑,企業上課就是比學校效率
#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <vector>#include <map>#include <queue>using namespace std;#define LL long long#define N 100010#define mod 1000000007vector<int> V[N],up[N];//V記錄邊,up記錄鄰接節點,但度數自己大int in[N];//記錄節點度數int sum[N],add[N];//add 儲存更新int main(){ // priority_queue<int,vector<int>,greater<int> > int T; int n,m,Q; int a,b; int i,j; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(i=1;i<=n;i++){ V[i].clear(); in[i]=0; up[i].clear(); sum[i]=add[i]=0; } while(m--) { scanf("%d %d",&a,&b); V[a].push_back(b); V[b].push_back(a); in[b]++; in[a]++; } for(a=1;a<=n;a++) for(j=0;j<V[a].size();j++) { b=V[a][j]; if(in[b]>=in[a]) up[a].push_back(b); } scanf("%d",&Q); int cmd,u,v; while(Q--) { scanf("%d %d",&cmd,&u); if(cmd==0) { scanf("%d",&v); add[u]+=v; for(i=0; i<up[u].size(); i++) { j=up[u][i]; sum[j]+=v; } } else { int ans=sum[u]; for(i=0; i<up[u].size(); i++) { j=up[u][i]; if(in[j]!=in[u]) ans+=add[j]; } printf("%d\n",ans); } } } return 0;}