Bi表示A1+...Ai
则题目中Sij可以表示为Bj-B(i-1) :即前缀和只差
利用大小关系,我们可以得到Bj和Bi-1的大小关系,连一条边从大的连到小的,统计入度,拓扑排序,先出队的为大的元素,B0为0,初始化所有元素为0,每次调整Bi的大小
Time Limit: 3000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
Description
Given a sequence of integers, a1, a2,..., an , we define its sign matrix S such that, for 1ijn , Sij = `` + " if ai +...+ aj > 0 ; Sij = `` - " if ai +...+ aj < 0 ; and Sij = ``0" otherwise.
For example, if (a1, a2, a3, a4) = (- 1, 5, - 4, 2) , then its sign matrix S is a 4×4 matrix:
1 | 2 | 3 | 4 | |
1 | - | + | 0 | + |
2 | + | + | + | |
3 | - | - | ||
4 | + |
We say that the sequence (-1, 5, -4, 2) generates the sign matrix. A sign matrix is valid if it can be generated by a sequence of integers.
Given a sequence of integers, it is easy to compute its sign matrix. This problem is about the opposite direction: Given a valid sign matrix, find a sequence of integers that generates the sign matrix. Note that two or more different sequences of integers can generate the same sign matrix. For example, the sequence (-2, 5, -3, 1) generates the same sign matrix as the sequence (-1,5, -4,2).
Write a program that, given a valid sign matrix, can find a sequence of integers that generates the sign matrix. You may assume that every integer in a sequence is between -10 and 10, both inclusive.
Input
Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case consists of two lines. The first line contains an integer n (1n10) , where n is the length of a sequence of integers. The second line contains a string of n(n + 1)/2 characters such that the first n characters correspond to the first row of the sign matrix, the next n - 1 characters to the second row, ... , and the last character to the n -th row.
Output
Your program is to write to standard output. For each test case, output exactly one line containing a sequence of n integers which generates the sign matrix. If more than one sequence generates the sign matrix, you may output any one of them. Every integer in the sequence must be between -10 and 10, both inclusive.
Sample Input
3 4 -+0++++--+ 2 +++ 5 ++0+-+-+--+-+--
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
vector<int> g[50];
int n,counts[20],v[20];
void topsort()
{
queue<int> q;
for(int i=0;i<=n;i++)
{
if(counts[i]==0)
q.push(i);
}
while(!q.empty())
{
int j=q.front();
q.pop();
for(int k=0;k<g[j].size();k++)
{
int t=g[j][k];
v[t]=min(v[t],v[j]-1);
if(--counts[g[j][k]]==0)
q.push(g[j][k]);
}
}
}
char str[300];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<=n;i++)
g[i].clear();
memset(counts,0,sizeof(counts));
scanf("%s",str);
for(int i=1,p=0;i<=n;i++)
for(int j=i;j<=n;j++,p++)
{
if(str[p]=='-')
{
counts[j]++;
g[i-1].push_back(j);
}
else if(str[p]=='+')
{
counts[i-1]++;
g[j].push_back(i-1);
}
}
for(int i=0;i<=n;i++)
v[i]=0;
topsort();
for(int i=1;i<=n;i++)
printf("%d%s",v[i]-v[i-1],i!=n?" ":"\n");
}
return 0;
}