题目链接: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- ...
随机推荐
-
ToList()方法
//ToList()方法,翻译:把****转化为List集合. // 控制台试试: string[] fruits = { "apple", "passionfruit& ...
-
动画: ThemeAnimation(主题动画)
背水一战 Windows 10 之 动画 PopInThemeAnimation - 控件出现时的动画 PopOutThemeAnimation - 控件消失时的动画 FadeInThemeAnima ...
-
【转】lonekight@xmu&#183;ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
-
287. Find the Duplicate Number
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro ...
-
(转)javascript深入理解js闭包
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
-
mongodb 聚合查询
操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的字段排序结 ...
-
业务线B/C端业务组件总结
/** * 业务线组件总结 * */ /* B端组件的总结 1.组件cssBase的总结 1像素底部边框 */ @mixin border - 1px - b($background: $gray - ...
-
SpringCloud学习笔记:负载均衡Ribbon(3)
1. RestTemplate简介 RestTemplate是Spring Resource中一个访问第三方RESTful API接口的网络请求框架. RestTemplate是用来消费REST服务的 ...
-
matlab数组和矩阵
数组创建 要创建每行包含四个元素的数组,请使用逗号 (,) 或空格分隔各元素. a = [1 2 3 4] a = 1×4 1 2 3 4 这种数组为行向量. 要创建包含多行的矩阵,请使用分号分隔各行 ...
-
构建搞性能可扩展asp.net网站文摘
第1章 原则与方法 网页加载的过程: 关注感知性能,减少阻塞调用,减少往返,在所有架构层次采用缓存,优化硬盘I/O 了解浏览器的工作方式,使用ajax,silverlight和纯javascript避 ...