【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B
题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一组n个数的的可行解(n个数都在-10——10之间)【保证一定有解】
解题思路:
第一反应!差分约束!
差分约束是用来求解不等式组的合理解的,用在此题上刚好,把sum[i]-sum[j]>0转化为sum[i]-sum[j]>=-1,小于零同理。把sum[i]-sum[j]==0转化为sum[i]-sum[j]>=0,sum[j]-sum[i]>=0.
差分约束之后会在另一个专题里讲到,会此方法的同学已经可以建图跑最短路了,不会此方法的同学建议选择第二种方法拓扑排序。【但是推荐差分约束,因为感觉比拓排简单】
后来和别的同学交流讨论,才知道这道题正解,或者说官方解是拓扑排序。
把大小关系改成单向连边,比如本鶸的丑代码就是把大的前缀和引出一条边指向小的前缀和。
特殊点在于等于零的处理,想了半个小时(好弱啊),想到一个很丑陋的方法,就是把两个相等的点的大小关系完全复制。也就是说如果sum[A]==sum[B],那么所有连接A却没有连接B的边,全加在B上,所有连接B没有连接A的边,全加在A上,无论方向。
第二个特殊点在于控制n个数的大小,如果选择差分约束只需要把上限值改成10就行了,对于拓排,我就想了个丑方法,把最大的前缀和赋为10*n,往下每一层减1,由于题目保证一定有解,所以不会出现问题。
下面放代码:
差分约束6msAC代码:
/* by Lstg */
/* 2018-01-27 15:32:28 */ #include<stdio.h>
#define inf 102000000 int map[][]; int main(){ int T,i,j,n,k;
char t;
scanf("%d",&T);
while(T--){ scanf("%d",&n);
getchar();
for(i=;i<=n+;i++)
for(j=;j<=n+;j++)
if(i!=j)map[i][j]=inf;
for(i=;i<=n;i++)
for(j=i;j<=n;j++){
t=getchar();
if(t=='+')map[j][i-]=-;
else if(t=='-')map[i-][j]=-;
else
map[i-][j]=map[j][i-]=; }
for(i=;i<=n;i++)
map[n+][i]=;
n++;
for(k=;k<=n;k++)
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(map[i][k]+map[k][j]<map[i][j])
map[i][j]=map[i][k]+map[k][j];
for(i=;i<n;i++)
printf("%d ",map[n][i]-map[n][i-]);
putchar();
}
return ;
}
拓扑排序6msAC代码:
/* by Lstg */
/* 2018-03-04 00:11:12 */ #include<stdio.h>
#include<string.h> int sum[],g[][],du[],stk[],n; void _getans(){ int i,top=,p;
for(i=;i<=n;i++)
if(!du[i]){
stk[++top]=i;
sum[i]=*n;
}
while(top){
p=stk[top--];
for(i=;i<=n;i++)
if(g[p][i]){
du[i]--;
if(!du[i]){
sum[i]=sum[p]-;
stk[++top]=i;
}
}
}
} int main(){ int T,i,j,k;
char ch[]; scanf("%d",&T);
while(T--){ memset(du,,sizeof(du));
memset(g,,sizeof(g));
memset(sum,,sizeof(sum));
scanf("%d",&n); scanf("%s",ch);
k=;
for(i=;i<n;i++)
for(j=i+;j<=n;j++){
if(ch[k]=='+'){
g[j][i]=true;
du[i]++;
}
if(ch[k]=='-'){
g[i][j]=true;
du[j]++;
}
k++;
}
k=;
for(i=;i<n;i++)
for(j=i+;j<=n;j++)
if(ch[k++]=='')
for(int a=;a<=n;a++){
if(!g[i][a]&&g[j][a]){
g[i][a]=true;
du[a]++;
}
if(!g[j][a]&&g[i][a]){
g[j][a]=true;
du[a]++;
}
if(!g[a][i]&&g[a][j]){
g[a][i]=true;
du[i]++;
}
if(!g[a][j]&&g[a][i]){
g[a][j]=true;
du[j]++;
}
}
_getans(); for(i=;i<=n;i++) printf("%d ",sum[i]-sum[i-]);
putchar();
}
return ;
}
【拓扑排序或差分约束】Guess UVALive - 4255的更多相关文章
- HDU 3440 House Man(编号排序+线性差分约束跑最短路)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]
收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...
- D2欧拉路,拓扑排序,和差分约束
第一题:太鼓达人:BZOJ3033 题意:给出k,求一个最长的M位01串,使其从每一个位置向后走k个得到 的M个k位01串互不相同(最后一个和第一个相邻,即是一个环).输出 字典序最小的答案. 2 ≤ ...
- uvalive 4255 Guess(拓扑排序)
算好题目,反正我没想到可以用图论做(虽然现在做的是图论专题= =) 首先是要把求每个位置上的值转化为求 “前缀和之差”,这是一个很有用的技巧 其次,由输入的(n+(n-1)+...+2+1)个符号,可 ...
- 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 ≤ ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
随机推荐
- 如何在Lunix云服务器上安装Mysql进行远程连接
说说这个服务器上安装mysql真是一个大坑啊 ! 我也不知道自己怎么心血来潮就买一个百度云服务器,然后就想着吧自己做的一些小项目都跑上去.嘿嘿...其实就是想显摆下,写点小应用给不是编程的朋友们使用 ...
- 几种不同程序语言的HMM版本
几种不同程序语言的HMM版本 “纸上得来终觉浅,绝知此事要躬行”,在继续翻译<HMM学习最佳范例>之前,这里先补充几个不同程序语言实现的HMM版本,主要参考了维基百科.读者有兴趣的话可以研 ...
- Linux rpm yum 等安装软件
任何程序都是先写代码,拿到源码去编译得到一个目标程序. 1 编译的过程复杂有需要准备编译的环境,和硬件有关,32位64位,内核的不同等等所以需要编译多次 Java特殊但是他需要安装jvm, ...
- Spring Boot中使用Spring Security进行安全控制
我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...
- 快速入门react
安装react npm install creat-react-app -g这里直接安装react的一个脚手架,里面包含了要用到的许多东西,帮助快速入门react 创建新项目 create-react ...
- 【洛谷 P3965】 [TJOI2013]循环格(费用流)
题目链接 回路限制经典题. 每个点拆成入点和出点,源点连每个点的出点,流量1,费用0,每个点出点连汇点,流量1,费用0,入点和出点之间没有边. 也就是说每个点必须靠其他点流来的流量来流入汇点,同时自己 ...
- css3同心圆闪烁扩散效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- H5调试工具 - weinre远程调试工具
weinre 简介 weinre 是一款类似于firebug 和Web Inspector的网页调试工具, 它的不同之处在于可以用于进行远程调试,比如调试手机上面的网页. 安装 weinre(运行在n ...
- USB各种模式 解释
1.MTP: 通过MTP这种技术,可以把音乐传到手机里.有了U盘功能为什么还要多此一举呢?因为版权问题,MTP可以把权限文件从电脑上导过去:如果只使用手机的U盘功能,把歌的文件拷过去之后,没有权限文件 ...
- powerpc平台移植zebra或quagga-0.99.23
1,先configure ./configure --enable-vtysh --disable-bgpd --disable-ripd --disable-ripngd --disable- ...