Codeforces #559 div2

D.求構造一個長度爲n的字符串使得此字符串中最小”獨特“子串的長度爲k  數據滿足n>=k 且n與k奇偶性相同

http://codeforces.com/contest/1159/problem/D

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
string cal(int n,int k)
{
    int  v=(n-k)/2;
    string res="";
    while(res.size()+(v+1)<=n)
    {
        int t1=v;
        while(t1--)res+='1';
        res+='0';
    }
    while(res.size()<n)res+='1';
    return res;
}
int main()
{
    cin>>n>>k;
    cout<<cal(n,k)<<endl;
    return 0;
}

E. 給出一個長度爲n的數列,指的是右邊第一個大於該位置的數所在位置,若爲-1指的是不清楚(都行),讓你把原來的長度爲n的全排列還原回去。

http://codeforces.com/contest/1159/problem/E

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
int a[500050];int n;
int position[500005];int b[500005];
bool ok=1;int pos=1;
int cnt=0;
//每次尋找能填的最小位置填上去
void dfs(int p,int limit)
{
    if(a[p]>limit){ok=0;return;}
    pos++;
    while(ok&&pos<a[p])dfs(pos,a[p]);
    position[++cnt]=p;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin>>T;
    while(T--)
    {
    
        pos=1;ok=1;cnt=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        while(ok&&pos<=n)
        {
            dfs(pos,n+1);
        }
        if(!ok){cout<<-1<<endl;continue;}
        else {
            for(int i=1;i<=n;i++)b[position[i]]=i;
            for(int i=1;i<=n;i++)cout<<b[i]<<" ";
            cout<<endl;
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章