算好题目,反正我没想到可以用图论做(虽然现在做的是图论专题= =)

首先是要把求每个位置上的值转化为求 “前缀和之差”,这是一个很有用的技巧

其次,由输入的(n+(n-1)+...+2+1)个符号,可以确定出 n个前缀和的大小关系,并从大到小做有向边建图

之后,用拓扑排序依次从大到小找到前缀和,与此同时对num[]做处理,实际上是离散出这n个值。

这n值符合之前的大小关系,所以他们两两相减,就得到了题目要求的值

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int MAXN=;
  8.  
  9. struct Edge{
  10. int v,next;
  11. Edge(){}
  12. Edge(int _v,int _next):v(_v),next(_next){}
  13. }edge[MAXN*MAXN];
  14.  
  15. int indegree[MAXN],n;
  16. int num[MAXN];
  17. int tol,head[MAXN];
  18.  
  19. queue<int>q;
  20.  
  21. void top()
  22. {
  23. for(int i=;i<=n;i++){
  24. if(!indegree[i])
  25. q.push(i);
  26. }
  27. while(!q.empty())
  28. {
  29. int u=q.front();
  30. q.pop();
  31. for(int i=head[u];i!=-;i=edge[i].next)
  32. {
  33.  
  34. int v=edge[i].v;
  35. num[v]--;
  36. if((--indegree[v])==)
  37. q.push(v);
  38. }
  39. }
  40. }
  41.  
  42. void init()
  43. {
  44. tol=;
  45. memset(head,-,sizeof(head));
  46. memset(indegree,,sizeof(indegree));
  47. memset(num,,sizeof(num));
  48. }
  49.  
  50. void add(int u,int v)
  51. {
  52. edge[tol]=Edge(v,head[u]);
  53. head[u]=tol++;
  54. }
  55.  
  56. char str[MAXN*MAXN];
  57.  
  58. int main()
  59. {
  60. int T;
  61. scanf("%d",&T);
  62. while(T--)
  63. {
  64. scanf("%d%s",&n,str);
  65. int tot=;
  66. init();
  67.  
  68. for(int i=;i<=n;i++)
  69. {
  70. for(int j=i;j<=n;j++,tot++)
  71. {
  72. if(str[tot]=='+'){
  73. add(j,i-);
  74. indegree[i-]++;
  75. }else if(str[tot]=='-'){
  76. add(i-,j);
  77. indegree[j]++;
  78. }
  79. }
  80. }
  81. top();
  82. for(int i=;i<=n;i++)
  83. {
  84. if(i==)printf("%d",num[i]-num[i-]);
  85. else printf(" %d",num[i]-num[i-]);
  86. }
  87. printf("\n");
  88. }
  89. return ;
  90. }

后来发现其实根本不用拓扑排序。。拓扑的本质是为了离散,其实建图的时候就已经决定了大小关系,可以直接对num[]处理,连建图都省了

  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. const int MAXN=;
  5.  
  6. int num[MAXN];
  7. char str[MAXN*MAXN];
  8.  
  9. int main()
  10. {
  11. int T,n,tot;
  12. scanf("%d",&T);
  13. while(T--)
  14. {
  15. scanf("%d%s",&n,str);
  16. tot=;
  17. memset(num,,sizeof(num));
  18. for(int i=;i<=n;i++)
  19. {
  20. for(int j=i;j<=n;j++,tot++)
  21. {
  22. if(str[tot]=='+')
  23. num[i-]--;
  24. else if(str[tot]=='-')
  25. num[j]--;
  26. }
  27. }
  28. for(int i=;i<=n;i++)
  29. if(i==)printf("%d",num[i]-num[i-]);
  30. else printf(" %d",num[i]-num[i-]);
  31. printf("\n");
  32. }
  33. return ;
  34. }

uvalive 4255 Guess(拓扑排序)的更多相关文章

  1. UVALive 6264 Conservation --拓扑排序

    题意:一个展览有n个步骤,告诉你每一步在那个场馆举行,总共2个场馆,跨越场馆需要1单位时间,先给你一些约束关系,比如步骤a要在b前执行,问最少的转移时间是多少. 解法:根据这些约束关系可以建立有向边, ...

  2. LA 4255 UVa1423 拓扑排序

    题目给出的是Sij的正负号,Sij=ai+...+aj,所以令前缀和Bi=a0+a1+..+ai,a0=0,B0=0,则有Sij=Bj-B(i-1): 由此构造出Bi的拓扑序列,只要每个拓扑序列相邻的 ...

  3. 【拓扑排序或差分约束】Guess UVALive - 4255

    题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...

  4. UVALive - 4255 - Guess (拓扑排序)

    Guess 题目传送:Guess 白书例题 注意拓扑排序时,,入度同一时候为0的前缀和须要赋值为同一个数(这个数能够随机取.由于前缀和是累加的,每个a的数值都仅仅和前缀和之差有关).,由于此时能够看成 ...

  5. D - Guess UVALive - 4255 拓扑排序

    Given a sequence of integers, a1, a2, . . . , an, we define its sign matrix S such that, for 1 ≤ i ≤ ...

  6. LA 4255 (拓扑排序 并查集) Guess

    设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...

  7. UVALive 6467 Strahler Order 拓扑排序

    这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ ...

  8. uvalive 6393(uva 1572) Self-Assembly 拓扑排序

    题意: 给出一些正方形,这些正方形的每一条边都有一个标号.这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形能够任意翻转和旋 ...

  9. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

随机推荐

  1. 2565: 最长双回文串 - BZOJ

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...

  2. python参考手册--第1章python简介

    1.if __name__ == '__main__': 直接运行myModel.py时,当前模块的名字是main:import myModel然后运行的时候当前模块的名字是myModel. 2.ev ...

  3. POJ 1459 Power Network(网络最大流,dinic算法模板题)

    题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数.      接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...

  4. SQL中的事物【转】

    来源于:http://www.cnblogs.com/zhuifengnianshao/archive/2010/11/24/1886939.html 事务(Transaction)是并发控制的单位, ...

  5. cojs 白树黑 黑树白 题解报告

    黑树白 首先如果不是强制在线,这个题用莫队+树状数组就可以在O(n*sqrt(n)*log(n))的时间内搞定 如果没有修改操作,可以直接上主席树就可以辣 我们考虑修改操作,某一个修改操作对于某一个查 ...

  6. lintcode :最大子数组

    题目:  最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 ...

  7. HTML5入门7---"session的会话缓存"和"localStorage的cookie"缓存数据

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. C#基础练习(使用委托窗体传值)

    主界面: Form1中的代码: namespace _06委托练习_窗体传值 {     public partial class Form1 : Form     {         public ...

  9. 开源调度框架Quartz最佳实践

    开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...

  10. Git教程之版本回退(4)

    现在,我们已经学会了修改文件,然后把修改提交到Git版本库,现在再次修改readme.txt文件如下: