繁华模拟赛 Evensgn玩序列

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 5000;
int n,a[maxn],b[maxn],c[maxn],rka[maxn],rkb[maxn],rkc[maxn];
bool visa[maxn],visb[maxn],visc[maxn];
int rk,rec;
int main(){
    freopen("perm.in","r",stdin);
    freopen("perm.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i = n;i >= 1;i--){
        cin>>a[i];
        visa[a[i]] = true;
    }
    for(int i = n;i >= 1;i--){
        cin>>b[i];
        visb[b[i]] = true;
    }
    for(int i = n;i >= 1;i--){
        rk = -1;
        for(int j = 0;j <= a[i];j++) if(visa[j]) rk++;
        visa[a[i]] = false;
        rka[i] = rk;
    }
    for(int i = n;i >= 1;i--){
        rk = -1;
        for(int j = 0;j <= b[i];j++) if(visb[j])rk++;
        visb[b[i]] = false;
        rkb[i] = rk;
    }
    for(int i = 1;i <= n;i++){
        rkc[i] += rka[i] + rkb[i];
        rkc[i+1] += rkc[i] / i;
        rkc[i] %= i;
    }
    memset(visc,true,sizeof(visc));
    for(int i = n;i >= 1;i--){
        rec = rk = 0;
        while(1){
            if(visc[rec]) rk++;
            if(rk > rkc[i]) break;
            rec++;
        }
        visc[rec] = false;
        cout<<rec<<" ";
    }
    return 0;
}
时间: 2024-10-29 19:08:03

繁华模拟赛 Evensgn玩序列的相关文章

[繁华模拟赛]Evensgn 剪树枝

Evensgn 剪树枝 题目 繁华中学有一棵苹果树.苹果树有 n 个节点(也就是苹果),n − 1 条边(也就 是树枝).调皮的 Evensgn 爬到苹果树上.他发现这棵苹果树上的苹果有两种:一 种是黑苹果,一种是红苹果.Evensgn 想要剪掉 k 条树枝,将整棵树分成 k + 1 个 部分.他想要保证每个部分里面有且仅有一个黑苹果.请问他一共有多少种剪树枝 的方案? INPUT 第一行一个数字 n,表示苹果树的节点(苹果)个数. 第二行一共 n − 1 个数字 p0, p1, p2, p3,

繁华模拟赛 Evensgn与字符矩阵

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int maxn = 2050; int n,m,ans; char s[maxn][maxn]; bool ok; bool vis[maxn]; int main(){ freopen("evensg

繁华模拟赛 Evensgn的债务

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define ll int using namespace std; const int maxn = 1000005; ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(

繁华模拟赛 Evensgn剪树枝

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; const int maxn = 100005; const ll mod = 1000000007; struct edge{ int t

繁华模拟赛 ljw分雕塑

/* 用f[i][k]表示考虑到第i个雕塑,分成k组,可不可行(这是一个bool类型的数组) 转移: f[i][k]=f[j][k-1],sum[i]-sum[j]合法 */ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int max_n = 2010;

繁华模拟赛 找十字架

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; int n; char s[205][205],cmd; int main(){ freopen("puzzle.in","r",stdin); freopen("puzzle

繁华模拟赛 Vincent的城堡

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll mod = 1000000007; ll n,k,c[20][20]; ll ansa,ansb,ans; void get_c(){ for(int i = 1;i

繁华模拟赛 ljw搭积木

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int maxn = 6005; int n,x[maxn]; int cmd,cnt,ans,max_x; int main(){ freopen("box.in","r"

繁华模拟赛 Vicent坐电梯

/*n<=5000­这样就不能用O(n)的转移了,而是要用O(1)的转移.­注意我们每次的转移都来自一个连续的区间,而且我们是求和­区间求和?­前缀和!­令sum[step][i]表示f[step][1~i]的和­还是以B下侧为例­ f[step][i]=sum[step-1][i-1]+sum[step-1][k]-sum[step-1][i] */#include <cstdio> #include <cstring> #include <cstdlib> #