题目链接: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的更多相关文章

  1. HDU 3440 House Man(编号排序+线性差分约束跑最短路)

    House Man Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)

    洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...

  3. BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]

    收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...

  4. D2欧拉路,拓扑排序,和差分约束

    第一题:太鼓达人:BZOJ3033 题意:给出k,求一个最长的M位01串,使其从每一个位置向后走k个得到 的M个k位01串互不相同(最后一个和第一个相邻,即是一个环).输出 字典序最小的答案. 2 ≤ ...

  5. uvalive 4255 Guess(拓扑排序)

    算好题目,反正我没想到可以用图论做(虽然现在做的是图论专题= =) 首先是要把求每个位置上的值转化为求 “前缀和之差”,这是一个很有用的技巧 其次,由输入的(n+(n-1)+...+2+1)个符号,可 ...

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

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

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

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

  8. bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...

  9. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

    题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...

随机推荐

  1. [转]C/C++作用域详解

    原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777433.html 作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在 ...

  2. 重构改善既有代码设计--重构手法09:Substitute Algorithm (替换算法)

    你想要把某个算法替换为另一个更清晰地算法.将函数本体替换为另一个算法. string FoundPerson(string[] people) { for (int i = 0; i < peo ...

  3. git使用(1)----推送代码到远程

    git使用(1) 首先要明白git上有三个区域 1.工作区 2.暂存区 3.历史记录区 步骤: 1.git  init 2.配置环境(如果配置一次了以后就不用再继续配置) git  config  - ...

  4. 12款jQuery幻灯片插件和幻灯片特效教程

    jQuery 使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入一些非常好的效果.滑块和幻灯片效果是常用的内容展示方式之一,这是一种在有限的网页空间内展示系列项目时非常好的方法.今 ...

  5. js设置html区域隐藏和显示

    if(message != "指派") { document.getElementById("appoint").style.display="non ...

  6. jQuery.Event的一些用法

    直接写用法 //创建一个事件 var event = $.Event("事件类型",["定义的事件参数最终将出现在e1中"]); //绑定一个处理器 $(obj ...

  7. [POJ 2559]Largest Rectangle in a Histogram 题解(单调栈)

    [POJ 2559]Largest Rectangle in a Histogram Description A histogram is a polygon composed of a sequen ...

  8. 【洛谷 P3227】 [HNOI2013]切糕(最小割)

    题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...

  9. 【leetcode 简单】第四十一题 Excel表列序号

    给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...

  10. Django之组合搜索组件(二)--另附simple_tag的创建使用方法

    这次的代码为Django之组合搜索组件(一)的改版,实现的结果和(一)相同,不同的是,这次运用simple_tag方式,使.html程序简化 所以现在就开始编程吧! 首先想使用simple_tag方法 ...