题目链接: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. java类的静态属性值获取

    获取某个类实例的静态属性: public class ErrorCode { private String code; private String message; private ErrorCod ...

  2. JAVA多线程提高八:线程锁技术

    前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...

  3. java多线程机制1(线程创建的两种方式)

    进程:正在运行的程序.(即程序在内存中开辟了一片空间) 线程:是进程的执行单元. 一个进程至少包含了一个多个线程. 多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的.因为cp ...

  4. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  5. js布尔值转化

    JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值.转换规则是除了下面六个值被转为false,其他值都视为true. undefined null false 0 Na ...

  6. 在Perl中使用Getopt::Long模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...

  7. 生成器(generator)和迭代(iterable , iterator, iteration)

    在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration 1.Iterable 我们知道,在Python中所有东西都是object, 比如说变量,容 ...

  8. gdb安装

    1.卸载原有gdb  以root用户登录  1.1 查询原有gdb包名,执行命令: rpm -q gdb  1.2 卸载原有gdb包,假设gdb包名为gdb-7.0-0.4.16,执行命令:rpm - ...

  9. FusionCharts 用法心得

    现在主流的很多jQuery+js结合的图表展示插件,有HighCharts,ECharts等等,今天我们先来了解一下FusionCharts,也是一个非常不错的图表制作工具.希望我的同事以及其他需要帮 ...

  10. geoip 扩展包根据ip定位详情

    教程:https://laravel-china.org/courses/laravel-package/2024/get-the-corresponding-geo-location-informa ...