sgu-279. Bipermutations

题目大意:

定义一个符号i?j表示序列中i在j的前面。

现在有一个由1,2,.......,N,1′,2′,........,N′满足i?j?i ′?j ′。现在定义bij={j ′,if  j<ij  ,if  j>i,然后有ai=∑Nj=1[i?bij](bij无意义)。

现在给你所有的ai,如果存在一个数列满足上述条件,那么输出“ YES ”,并且输出这个数列,否则输出“NO”。

解题思路:

我们考虑贪心构造,每次优先将当前ai=0的最小的i,并将i ′压入队列,如果不存在,那么就考虑放置队首的k ′(因为如果存在ai=0但是去放k ′,那么会有ai=?1,而且又要满足i?j?i ′?j ′)。如果都不能放置,那么就是无解。

AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

int N;
int a[1010]={0};
int hash[1010]={0};
int ans[2020]={0};
int dui[1010]={0};
int st=1,en=0;

int main()
{
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
        scanf("%d",&a[i]);
    a[0]=2e9;
    for(int p=1;p<=N*2;p++)
    {
        int i;
        for(i=1;i<=N;i++)
            if(a[i]==0 && hash[i]==0)
                break;
        if(i<=N)
        {
            ans[p]=i;
            for(int j=1;j<i;j++)
                if(a[j]>0)
                    a[j]--;
            dui[++en]=i;
            hash[i]=1;
        }
        else
        {
            if(st>en)
            {
                puts("NO");
                return 0;
            }
            ans[p]=-dui[st];
            for(int j=dui[st]+1;j<=N;j++)
                if(a[j]>0)
                    a[j]--;
            st++;
        }
    }
    puts("YES");
    for(int i=N*2;i>=1;i--)
        printf("%d ",ans[i]);
    return 0;
}
时间: 2024-10-19 09:10:25

sgu-279. Bipermutations的相关文章

【SGU 390】Tickets (数位DP)

Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell tickets to the passengers. So no wonder that once upon a time in a faraway galaxy one conductor decided to diversify this occupation. Now this conductor

ACM: SGU 101 Domino- 欧拉回路-并查集

sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Description Dominoes – game played with small, rectangular blocks of wood or other material, each identified by a number of dots, or pips, on its face. The bl

SGU 116 Index of super-prime 数论+完全背包+输出方案

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=116 题意好晦涩 给你一个不超过一万的数 问它最少可以用多少个“超级素数”来表示 使“超级素数”之和等于它 如果无法这样表示 输出0 否则 按非降序形式输出方案 数论部分就模板的问题 没什么说的 完全背包方面也很常规 说说[输出方案] 背包九讲的伪码给的是二维dp[]的方法 实际上稍加改动就可以用在一维数组上 用一个rec[]记录dp[]的当前状态是从哪个状态转移而来(即上一个状态) 通过

SGU 乱搞日志

SGU 100 A+B :太神不会 SGU 101 Domino: 题目大意:有N张骨牌,两张骨牌有两面有0到6的数字,能相连当且仅当前后数字相同,问能否有将N张骨牌连接的方案?思路:裸的欧拉回路,注意自环,连通 1 //sgu101 2 #include<iostream> 3 #include<cstdio> 4 #include <math.h> 5 #include<algorithm> 6 #include<string.h> 7 #i

SGU 275 To xor or not to xor (高斯消元)

题目地址:SGU 275 首先,贪心的思想,每一二进制位上要尽量是1,而能不能是1用高斯消元来解决.当该位有一个可以使之为1的变元时,就说明这位可以为1,而且令该变元控制该位,然后向低位消元. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h>

SGU 221.Big Bishops(DP)

题意: 给一个n*n(n<=50)的棋盘,放上k个主教(斜走),求能放置的种类总数. Solution : 同SGU 220,加个高精度就好了. code #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; string f[2][250][250], ans;

SGU 193.Chinese Girls&#39; Amusement

/* 实际上就是求一个k,满足k<=n/2,且gcd(n,k)=1 如果n为奇数,k为[n/2] 如果n为偶数,k=n/2-1-(n/2)%2 */ #include <iostream> using namespace std; string s; void div2() { string t; int l = s.size() - 1, tem = s[0] - '0'; if (tem > 1) t += '0' + tem / 2; tem &= 1; for (i

sgu 495 Kids and Prizes

计算出每个人得到礼物的概率,然后加起来即可 1 #include<iostream> 2 #include<string.h> 3 #include<algorithm> 4 #include<stdio.h> 5 using namespace std; 6 double dp[101010]; 7 int main(){ 8 int n,m; 9 while(cin>>n>>m){ 10 dp[1]=1; 11 for(int i

SGU 112 a^b-b^a

JAVA大数.... a^b-b^a Time Limit: 250MS   Memory Limit: 4096KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description You are given natural numbers a and b. Find ab-ba. Input Input contains numbers a and b (1≤a,b≤100). Output Write

【容斥+大数】SGU 476 Coach&#39;s Trouble

通道 题意:有3*n个人,分成n组,每组三个人.给出k个三元组,这三个人不可组队,问最后可以组队的总方案数 思路: 当k=0时,有(C[3*n][3]*C[3*n-3][3]*……*C[3][3])/n!种方案,展开以后可以得到dp[n]=(3*n)!/n!/6^n. 显然可以写成递推式:dp[n]=dp[n-1]*(3*n-1)*(3*n-2)/2. 那么容斥一下,答案=总方案数-至少含一个禁止组合的+至少含两个禁止组合的-…… 二进制暴力TLE了.DFS的话会有很多剪枝,当前几个已经出现冲突