uvalive 4255 Guess(拓扑排序)
算好题目,反正我没想到可以用图论做(虽然现在做的是图论专题= =)
首先是要把求每个位置上的值转化为求 “前缀和之差”,这是一个很有用的技巧
其次,由输入的(n+(n-1)+...+2+1)个符号,可以确定出 n个前缀和的大小关系,并从大到小做有向边建图
之后,用拓扑排序依次从大到小找到前缀和,与此同时对num[]做处理,实际上是离散出这n个值。
这n值符合之前的大小关系,所以他们两两相减,就得到了题目要求的值
- #include<stdio.h>
- #include<string.h>
- #include<queue>
- #include<algorithm>
- using namespace std;
- const int MAXN=;
- struct Edge{
- int v,next;
- Edge(){}
- Edge(int _v,int _next):v(_v),next(_next){}
- }edge[MAXN*MAXN];
- int indegree[MAXN],n;
- int num[MAXN];
- int tol,head[MAXN];
- queue<int>q;
- void top()
- {
- for(int i=;i<=n;i++){
- if(!indegree[i])
- q.push(i);
- }
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- for(int i=head[u];i!=-;i=edge[i].next)
- {
- int v=edge[i].v;
- num[v]--;
- if((--indegree[v])==)
- q.push(v);
- }
- }
- }
- void init()
- {
- tol=;
- memset(head,-,sizeof(head));
- memset(indegree,,sizeof(indegree));
- memset(num,,sizeof(num));
- }
- void add(int u,int v)
- {
- edge[tol]=Edge(v,head[u]);
- head[u]=tol++;
- }
- char str[MAXN*MAXN];
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%s",&n,str);
- int tot=;
- init();
- for(int i=;i<=n;i++)
- {
- for(int j=i;j<=n;j++,tot++)
- {
- if(str[tot]=='+'){
- add(j,i-);
- indegree[i-]++;
- }else if(str[tot]=='-'){
- add(i-,j);
- indegree[j]++;
- }
- }
- }
- top();
- for(int i=;i<=n;i++)
- {
- if(i==)printf("%d",num[i]-num[i-]);
- else printf(" %d",num[i]-num[i-]);
- }
- printf("\n");
- }
- return ;
- }
后来发现其实根本不用拓扑排序。。拓扑的本质是为了离散,其实建图的时候就已经决定了大小关系,可以直接对num[]处理,连建图都省了
- #include<stdio.h>
- #include<string.h>
- const int MAXN=;
- int num[MAXN];
- char str[MAXN*MAXN];
- int main()
- {
- int T,n,tot;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%s",&n,str);
- tot=;
- memset(num,,sizeof(num));
- for(int i=;i<=n;i++)
- {
- for(int j=i;j<=n;j++,tot++)
- {
- if(str[tot]=='+')
- num[i-]--;
- else if(str[tot]=='-')
- num[j]--;
- }
- }
- for(int i=;i<=n;i++)
- if(i==)printf("%d",num[i]-num[i-]);
- else printf(" %d",num[i]-num[i-]);
- printf("\n");
- }
- return ;
- }
uvalive 4255 Guess(拓扑排序)的更多相关文章
- UVALive 6264 Conservation --拓扑排序
题意:一个展览有n个步骤,告诉你每一步在那个场馆举行,总共2个场馆,跨越场馆需要1单位时间,先给你一些约束关系,比如步骤a要在b前执行,问最少的转移时间是多少. 解法:根据这些约束关系可以建立有向边, ...
- LA 4255 UVa1423 拓扑排序
题目给出的是Sij的正负号,Sij=ai+...+aj,所以令前缀和Bi=a0+a1+..+ai,a0=0,B0=0,则有Sij=Bj-B(i-1): 由此构造出Bi的拓扑序列,只要每个拓扑序列相邻的 ...
- 【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...
- UVALive - 4255 - Guess (拓扑排序)
Guess 题目传送:Guess 白书例题 注意拓扑排序时,,入度同一时候为0的前缀和须要赋值为同一个数(这个数能够随机取.由于前缀和是累加的,每个a的数值都仅仅和前缀和之差有关).,由于此时能够看成 ...
- D - Guess UVALive - 4255 拓扑排序
Given a sequence of integers, a1, a2, . . . , an, we define its sign matrix S such that, for 1 ≤ i ≤ ...
- LA 4255 (拓扑排序 并查集) Guess
设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...
- UVALive 6467 Strahler Order 拓扑排序
这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ ...
- uvalive 6393(uva 1572) Self-Assembly 拓扑排序
题意: 给出一些正方形,这些正方形的每一条边都有一个标号.这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形能够任意翻转和旋 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
随机推荐
- 2565: 最长双回文串 - BZOJ
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...
- python参考手册--第1章python简介
1.if __name__ == '__main__': 直接运行myModel.py时,当前模块的名字是main:import myModel然后运行的时候当前模块的名字是myModel. 2.ev ...
- POJ 1459 Power Network(网络最大流,dinic算法模板题)
题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数. 接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...
- SQL中的事物【转】
来源于:http://www.cnblogs.com/zhuifengnianshao/archive/2010/11/24/1886939.html 事务(Transaction)是并发控制的单位, ...
- cojs 白树黑 黑树白 题解报告
黑树白 首先如果不是强制在线,这个题用莫队+树状数组就可以在O(n*sqrt(n)*log(n))的时间内搞定 如果没有修改操作,可以直接上主席树就可以辣 我们考虑修改操作,某一个修改操作对于某一个查 ...
- lintcode :最大子数组
题目: 最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 ...
- HTML5入门7---"session的会话缓存"和"localStorage的cookie"缓存数据
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C#基础练习(使用委托窗体传值)
主界面: Form1中的代码: namespace _06委托练习_窗体传值 { public partial class Form1 : Form { public ...
- 开源调度框架Quartz最佳实践
开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...
- Git教程之版本回退(4)
现在,我们已经学会了修改文件,然后把修改提交到Git版本库,现在再次修改readme.txt文件如下: