题目很好很有意思。

告诉你n个序列中,任意一个连续子序列的和与0相比较的结果。

构造一个满足条件的序列。

对于从x->y这一段的和,如果大于0,那么sum[x]>sum[y-1],显然我们可以得到每一个sum的大小关系。由于这个满足条件的sum关系已经考虑了所有的源系列的大小关系,所以只要我们生成了一个满足条件的sum序列能够满足其大小关系,那么a[i]=sum[i]-sum[i-1]就一定是满足条件的。

根据拓扑排序我们可以知道每一个sum之间的大小关系,中间包含于sum[0]=0的大小关系,我们只要依次按照大小一个一个往里面填数字就好了。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std; int a[][],d[],eq[],Q[],top,totdone,tmp,father;
int f[];
bool vis[];
int n,T;
char s[]; int main()
{
int cur;
scanf("%d",&T);
while (T--)
{
memset(a,,sizeof a);
memset(d,,sizeof d);
scanf("%d",&n);
for (int i=; i<=n; i++) eq[i]=-,vis[i]=false;
scanf("%s",s);
cur=;
for (int i=; i<=n; i++)
for (int j=i; j<=n; j++,cur++)
{
if (s[cur]=='+')
{
a[i-][j]=;
d[j]++;
}
else if (s[cur]=='-')
{
a[j][i-]=;
d[i-]++;
}
}
top=totdone=;
while (totdone<n+)
{
tmp=;
for (int i=; i<=n; i++)
if (!vis[i] && d[i]<tmp) tmp=d[i]; queue<int> que;
for (int i=; i<=n; i++)
if (!vis[i] && d[i]==tmp) que.push(i); father=-;
while (!que.empty())
{
int i=que.front();
que.pop();
vis[i]=true;
totdone++;
if (father==-) { father=i,Q[++top]=i; }
else eq[i]=father;
for (int j=; j<=n; j++)
if (a[i][j]) d[j]--;
}
}
for (int i=; i<=top; i++)
if (Q[i]==)
{
tmp=i;
break;
}
if (eq[]!=-)
for (int i=; i<=n; i++)
if (Q[i]==eq[]) tmp=i;
cur=;
for (int i=tmp+; i<=top; i++) f[Q[i]]=cur++;
cur=-;
for (int i=tmp-; i>; i--) f[Q[i]]=cur--;
for (int i=; i<=n; i++)
if (eq[i]!=-) f[i]=f[eq[i]];
for (int i=; i<=n; i++)
{
printf("%d",f[i]-f[i-]);
if (i<n) printf(" ");
}
printf("\n");
}
return ;
}

UVAlive4255_Guess的更多相关文章

随机推荐

  1. jQuery js 格式化数字

    写程序与的时候,有些地方需要js或者jQuery取值,然后将50000000.00格式化成50,000,000.00这种形式: 首先创建formatCurrency.js,代码如下: function ...

  2. Windows:打开MSDTC,恢复Windows任务栏,查看windows日志,打开远程桌面,打开Services,资源监控

    Windows 服务器系列: Windows:查看IP地址,IP地址对应的机器名,占用的端口,以及占用该端口的应用程 Windows:使用Dos命令管理服务(Services) Windows:任务调 ...

  3. 处于同一域中的两台SQL Server 实例无法连接

    处于同一个域中的两台Sql server 实例无法连接,报的错误信息如下: A network-related or instance-specific error occurred while es ...

  4. 【Python Learning第一篇】Linux命令学习及Vim命令的使用

    学了两天,终于把基本命令学完了,掌握以后可以当半个程序员了♪(^∇^*) 此文是一篇备忘录或者查询笔记,如果哪位大佬看上了并且非常嫌弃的话,还请大佬不吝赐教,多多包涵 以下是我上课做的一些笔记,非常的 ...

  5. sublime text 安装json插件

    1.安装JSON插件(直接安装或在线插件安装均可) 1-1.直接安装 下载安装包https://github.com/dzhibas/SublimePrettyJson,解压缩到Packages目录( ...

  6. WebGL之shaderToy初使用

    做图形就要玩shader,我的shader进阶之路,从学习怎么使用shaderToy开始.首先介绍我是看哪篇文章学习的,给出参考文章地址:https://blog.csdn.net/xufeng099 ...

  7. Halcon三 依据点关系计算物体三维位姿Halcon

    1.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 平移POSEIN的原点,输出为新的原点.注意,平移沿着OBJ的坐标新进行,而非沿着 ...

  8. git push失败

    不知道弄错了什么上传项目到github上失败 git commit的时候提示 On branch masternothing to commit, working tree clean git pus ...

  9. SparkRDD编程实战

    通过spark实现点击流日志分析案例 1. 访问的pv package cn.itcast import org.apache.spark.rdd.RDD import org.apache.spar ...

  10. Playfair加密

    前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组.比如双图加密就是两个字母加密两个字母,这 ...