BestCoder #1-2 HDU 4858

来源:互联网 发布:办公软件 编辑:程序博客网 时间:2024/05/23 00:01

暴力的方法能过,但是网上有更优化的方法,

#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;}


0 0