逃生

反向拓扑+优先队列+逆序输出

这里要注意,题中要求的不是输出字典序,而是要编号小的尽量考前(首先1尽量考前,然后2尽量考前。。)。

比如说 约束是 4->1,3->2,字典序答案就是3 2 4 1,但是编号小的尽量考前答案就是 4 1 3 2。

为什么正向建图不行呢?正向建图我们不知道怎么样才能最先找到编号为1的,然后再最先找到2的。。。拿上面这个例子来说,我们应该先找到4这样才能先使得1优先,但是这样的找法是没有规律的。

正解是反向建图,这样每次先找到编号大的,最后自然使得编号小的留在后。最后逆序输出即可。

注意一个样例

input:
1
3 1
3 1
answer:
3 1 2
而不是
2 3 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define MAXN  30005
using namespace std;
vector<int> g[MAXN];
int in[MAXN];
int n;
void clear()
{
    ; i<=n; ++i)
    {
        g[i].clear();
        ;
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int m;
        scanf("%d%d",&n,&m);
        clear();
        while(m--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            g[b].push_back(a);
            in[a]++;
        }
        priority_queue<int,vector<int>,less<int> > pq;
        ; i<=n; ++i)
            )
                pq.push(i);
        vector<int> ans;
        while(!pq.empty())
        {
            int p=pq.top();
            pq.pop();
            ans.push_back(p);
            ; i<g[p].size(); ++i)
            {
                int &u=g[p][i];
                in[u]--;
                if(!in[u]) pq.push(u);
            }
        }
        ; i>=; --i)
            ) printf("%d",ans[i]);
            else printf(" %d",ans[i]);
        printf("\n");
    }
    ;
}

项目管理

维护一个sum[]和val[]的数组。sum中存比当前结点度大的点值的和,val存当前结点的值。对每个点开一个vector存比它度大的点集。

每次更新,更新自身的val,同时更新vector中点的sum。

每次查询,结果为自身sum与vector中点(除去与当前点度数相同的点,因为这部分结果已经在sum中了)的val的和。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define MAXN  100005
using namespace std;
vector<int> g[MAXN],big[MAXN];
int val[MAXN],sum[MAXN],in[MAXN];
void clear(int n)
{
    ; i<=n; ++i)
    {
        g[i].clear();
        big[i].clear();
        val[i]=sum[i]=;
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        clear(n);
        while(m--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            g[a].push_back(b);
            g[b].push_back(a);
            in[a]++;
            in[b]++;
        }
        ; i<=n; ++i)
            ; j<g[i].size(); ++j)
                if(in[g[i][j]]>=in[i])
                    big[i].push_back(g[i][j]);
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int cmd;
            scanf("%d",&cmd);
            )
            {
                int a,b;
                scanf("%d%d",&a,&b);
                val[a]+=b;
                ; i<big[a].size(); ++i)
                    sum[big[a][i]]+=b;
            }
            else
            {
                int a;
                scanf("%d",&a);
                int ans=sum[a];
                ; i<big[a].size(); ++i)
                    if(in[a]!=in[big[a][i]])
                        ans+=val[big[a][i]];
                printf("%d\n",ans);
            }
        }
    }
    ;
}

BestCoder Round #1的更多相关文章

  1. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  2. BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元

    BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy  Init函数 然后统计就ok B. 博弈 题  不懂  推了半天的SG.....  结果这 ...

  3. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  4. Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  5. Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  6. 暴力+降复杂度 BestCoder Round #39 1002 Mutiple

    题目传送门 /* 设一个b[]来保存每一个a[]的质因数的id,从后往前每一次更新质因数的id, 若没有,默认加0,nlogn复杂度: 我用暴力竟然水过去了:) */ #include <cst ...

  7. 贪心 BestCoder Round #39 1001 Delete

    题目传送门 /* 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 否则再在tot里减去多余的即为答案 用set容器也可以做,思路一样 */ # ...

  8. BestCoder Round #88

    传送门:BestCoder Round #88 分析: A题统计字符串中连续字串全为q的个数,预处理以下或加个cnt就好了: 代码: #include <cstdio> #include ...

  9. BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)

    Baby Ming and Weight lifting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  10. BestCoder Round #68 (div.2) tree(hdu 5606)

    tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

随机推荐

  1. B2车

    晚上10点之后,杭州快速公交B2的司机,把2节车厢,开的像是跑车一样,每次启动都是弹射出去的,好像是在报复白天蜗牛般的速度.真乃是见神杀神,见佛杀佛.

  2. 华为面试题——一道关于指针方面的编程题(C/C++)

    int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素 ...

  3. [saiku] 源码整合[maven整合]

    saiku源码的整合分为[普通web项目整合]和[maven整合]两种 本节主要是讲解如何整合为maven项目 转载自:http://blog.csdn.net/gsying1474/article/ ...

  4. Qt之加载QSS文件

    简述 Qt中关于样式的使用很常见,为了降低耦合性(与逻辑代码分离),我们通常会定义一个QSS文件,然后编写各种部件(例如:QLable.QLineEdit.QPushButton)的样式,最后使用QA ...

  5. hdu 3853LOOPS (概率DP)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  6. Farseer.Net

    Farseer.Net V0.2 ORM开源框架 目录 http://www.cnblogs.com/steden/archive/2013/01/22/2871160.html V1.0教程:htt ...

  7. 菜鸟学习Andriod-弹窗

    菜鸟学习Andriod-弹窗 return new AlertDialog.Builder(ZyScreenSaver.this).setIcon( R.drawable.ic_launcher).s ...

  8. LSM树——放弃读能力换取写能力,将多次修改放在内存中形成有序树再统一写入磁盘

    LSM树(Log-Structured Merge Tree)存储引擎 代表数据库:nessDB.leveldb.hbase等 核心思想的核心就是放弃部分读能力,换取写入的最大化能力.LSM Tree ...

  9. Windows Store App 应用设置存储

    应用设置存储主要分为本地存储和漫游存储两种方式.本地存储是指将应用的设置信息存储在本地存储空间中,而漫游存储则是指将应用的设置信息存储在网络服务器中,相对于本地存储而言,漫游存储支持多台设备之间的应用 ...

  10. BZOJ1507 [NOI2003]Editor

    是一道裸的Splay(反正我不会Splay,快嘲笑我!) 只需要维护在数列上加点删点操作即可,不会写Splay的渣渣只好Orz iwtwiioi大神一下了.(后来发现程序直接抄来了...) 就当我的第 ...