项目管理

题目链接

  • 分析:
    首先没有告诉Q的范围,默认它比较大吧。
    称度大于sqrt(n)的点为重点,其余为轻点。由于度数最多为2*m,所以重点不超过2*sqrt(n)个。摘自博客
    对于这个题目,过程中有两种明显的方法可以求解:1)每次需要更新一个点时候,直接将他所相邻的点都更新,查询的时候直接输出;2)每次更新一个点,只更新自己的值,查询的时候找到所有相邻的点求和输出
    这两种方法都是与当前点的度有关的,如果点的度比较大,那么第一种方法更新就会很慢,第二种方法的查询很慢;反之,第一种方法更新就比较快,第二种方法的查询比较快。(第一种方法的查询和第二种方法的更新一直很快),那么就把所有的点分成了两类:轻点和重点。
    对于轻点:相邻的点比较少,更新的时候可以直接更新所有相邻的点,查询时候需要再加上重点的值;对于重点:更新的时候就只能更新重点(重点个数比较少),查询的时候直接输出
const int MAXN = 110000;

vector<int> tG[MAXN], G[MAXN];
int d[MAXN], val[MAXN], ans[MAXN];
int Max;

int main()
{
    int T, n, m;
    RI(T);
    FE(kase, 1, T)
    {
        RII(n, m);
        FE(i, 1, n)
        {
            tG[i].clear();
            G[i].clear();
            ans[i] = val[i] = 0;
        }
        Max = sqrt(n * 1.0);

        REP(i, m)
        {
            int u, v;
            RII(u, v);
            G[u].push_back(v);
            G[v].push_back(u);
            d[v]++; d[u]++;
        }
        FE(i, 1, n)
        {
            REP(j, G[i].size())
            {
                int v = G[i][j];
                if (d[v] >= Max)
                    tG[i].push_back(v);
            }
        }
        int Q;
        RI(Q);
        while (Q--)
        {
            int op, a, b;
            RI(op);
            if (op == 0)
            {
                RII(a, b);
                val[a] += b;
                if (d[a] < Max)
                    REP(i, G[a].size())
                        ans[G[a][i]] += b;
                else
                    REP(i, tG[a].size())
                        ans[tG[a][i]] += b;
            }
            else
            {
                RI(a);
                int ret = ans[a];
                if (d[a] < Max)
                    REP(i, tG[a].size())
                        ret += val[tG[a][i]];
                WI(ret);
            }
        }
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值