LA-4255 Guess (拓扑排序+构造)

题目大意:一个未知的整数序列,给出其任意一个区间和的正负,还原这个序列。任意一个满足条件的序列即可。

题目分析:将连续区间和转化为前缀和之差,sumx-1与sumy的大小关系已知,以此建立一条有向边,做拓扑排序。根据sum0=0,可以构造出所有的前缀和,再取两前缀和之差便得答案。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;

char p[15][15];
int in[15],ans[15],mp[15][15],mp1[15][15];
vector<int>v;
queue<int>q;

void kahn(int n)
{
    v.clear();
    while(!q.empty())   q.pop();
    for(int i=0;i<=n;++i)
        if(in[i]==0)
            q.push(i);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        v.push_back(u);
        for(int i=0;i<=n;++i){
            if(mp[u][i]){
                mp[u][i]=0;
                --in[i];
                if(in[i]==0)
                    q.push(i);
            }
        }
    }
}

void solve(int n)
{
    ans[0]=0;
    int pos;
    for(int i=0;i<=n;++i){
        if(v[i]==0){
            pos=i;
            break;
        }
    }
    for(int i=pos-1;i>=0;--i){
        if(!mp1[v[i]][v[i+1]])///如果跟相邻点没有明确的大小关系,则取相等。。下同。。。
            ans[v[i]]=ans[v[i+1]];
        else
            ans[v[i]]=ans[v[i+1]]-1;
    }
    for(int i=pos+1;i<=n;++i){
        if(!mp1[v[i-1]][v[i]])
            ans[v[i]]=ans[v[i-1]];
        else
            ans[v[i]]=ans[v[i-1]]+1;
    }
}

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        memset(in,0,sizeof(in));
        memset(mp,0,sizeof(mp));
        memset(mp1,0,sizeof(mp1));
        scanf("%d",&n);
        getchar();
        for(int i=0;i<n;++i){
            for(int j=i+1;j<=n;++j){
                p[i][j]=getchar();
                if(p[i][j]==‘+‘){
                    mp1[i][j]=mp[i][j]=1;
                    ++in[j];
                }
                if(p[i][j]==‘-‘){
                    mp1[j][i]=mp[j][i]=1;
                    ++in[i];
                }
            }
        }
        kahn(n);
        solve(n);
        for(int i=1;i<=n;++i)
            printf("%d%c",ans[i]-ans[i-1],(i==n)?‘\n‘:‘ ‘);
    }
    return 0;
}

  

时间: 2024-10-10 06:13:05

LA-4255 Guess (拓扑排序+构造)的相关文章

HDU 3213 Box Relations(拓扑排序构造)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3231 题意:有n个长方体,四种限制条件.(1)I x y x和y有相交:(2)X/Y/Z  x y x的最大X/Y/Z坐标小于y的最大X/Y/Z.构造出这样的n个长方体. 思路:首先,XYZ三个方向是可以分开考 虑的.那么我们可以一个个分别求解.将每个长方体拆成左上角右下角两个点,我们假设现在考虑X方向,也即是一个长方体对应两个X方向的点,共2*n个点, 边<i,j>表示i小于j,那么首先有边&l

Guess UVALive - 4255 (拓扑排序)

Guess UVALive - 4255 题意: 拓扑排序 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=12; 5 int p[maxn][maxn],b[maxn]; 6 int in[maxn]; 7 int n; 8 9 void top_sort(){ 10 queue<int> q; 11 for(int i=0;i<=n;i++) if(in[i]==0) q.push(

【bzoj2815】[ZJOI2012]灾难 拓扑排序+构造+倍增LCA

题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统.如果蚂蚱灭绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾难. 我们现在从专业一点的角度来看这个问题.我们用一种叫做食物网的有向图来描述生物之间的关系: 一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连一个

拓扑排序之变量序列代码

/* Name: Copyright: Author: Date: 17-11-14 21:02 Description: 拓扑排序之变量序列 假设有n个变量(1<=n<=26,变量名用单个小写字母表示),还有m个二元组(u,v),分别表示变量u小于v.那么,所有变量从小到大排列起来应该是什么样子的呢? 例如有4个变量a,b,c,d,若以知a<b,c<b,d<c,则这4个变量的排序可能是a<d<c<b.尽管还有可能其他的可能,你只需找出其中的一个即可. In

LA 4255 (拓扑排序 并查集) Guess

设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 15; 5 int n; 6 int G[maxn][maxn]; 7 char s[100]; 8 int sum[maxn], a[maxn]; 9 10

UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排序,后来知道是,可是还是不会写. 既然要拼成无限大,那么只要拼的时候拼出一个环来,又由于每个是无限多的,那么可以一直重复, 就能拼起来无限大的东西,把每个正方形看成一条边,那么不就是一个拓扑排序,看看能不能找到一个环么, 如果能找到,那么就可以,找不到,就不可以.注意的是正方形可以从四面都拼,所以要

D - Guess UVALive - 4255 拓扑排序

Given a sequence of integers, a1, a2, . . . , an, we define its sign matrix S such that, for 1 ≤ i ≤ j ≤ n, Sij = " + " if ai + . . . + aj > 0; Sij = " ? " if ai + . . . + aj < 0; and Sij = "0" otherwise. For example, i

UVALive - 4255 - Guess (拓扑排序)

Guess 题目传送:Guess 白书例题 注意拓扑排序时,,入度同一时候为0的前缀和须要赋值为同一个数(这个数能够随机取.由于前缀和是累加的,每个a的数值都仅仅和前缀和之差有关).,由于此时能够看成他们的前缀和是相等的,不存在大小关系,,而存在大小关系的都连了一条有向边. .假设此时不赋值为同一个数,,可能对于符号0不是正解.,从而产生错误的结果.. AC代码: #include <map> #include <set> #include <list> #includ

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c