Codeforcesグローバルラウンド問題への解決策7(未完)(ABCD)

ゲームhttps://codeforces.ml/contest/1326/

A.悪い醜い番号

最初の質問泥棒とデジタルDPなどの問題を見て、実際には、私が間違っていた、と長い時間のために間違いました

私のアプローチは、出力である(N-1 \)\ \(5 \)\(1 \)\(4 \)、\ (N-1 = \)どんな特別な裁判官

グループのメソッドについての統計:

433333

277777

433333

333334

999998

333353

233 333(強いです!)

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
typedef long long ll; const int inf=~0u>>2; const ll INF=~0ull>>2; ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
signed main(){
    ios::sync_with_stdio(0); cin.tie(0);
    ll t=read();
    while(t--){
        ll n=read();
        if(n==1)cout<<-1<<endl;
        else{
            repeat(i,1,n)cout<<'5';
            cout<<'4'<<endl;
        }
    }
    return 0;
}

B.マキシマ

シミュレートどんな特定の戦略

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
typedef long long ll; const int inf=~0u>>2; const ll INF=~0ull>>2; ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
const int N=200010;
ll a[N];
signed main(){
    ios::sync_with_stdio(0); cin.tie(0);
    int n=read();
    repeat(i,0,n)a[i]=read();
    cout<<a[0]<<' '; ll m=a[0];
    repeat(i,1,n)cout<<m+a[i]<<' ',m=max(m,m+a[i]);
    return 0;
}

C.順列パーティション

探している\(K \)とブロックの最大値の最大値は、発見と同等である(K \)\最大値及び数、すなわち最大\(Kを\)番号が加算

第2の質問に、我々は、選択された\(K \)に、元の配列を桁(K \)\セクション、各含有だけ選択された数。したがって、ブロックの境界は、2つの隣接するデジタルの位置が選択されている場合、数値の間で選択しなければならない\(pos_i、POS_。1} + {I \) 自由度が境界である\(POS_ -pos_i。1} + I {\) \(K-1 \)の自由度が乗算第二の質問の答えであります

コードは混乱のビット

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
typedef long long ll; const int inf=~0u>>2; const ll INF=~0ull>>2; ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
typedef pair<int,int> pii;
const int N=200010,mod=998244353;
pii a[N];
ll ans1=0,ans2=1;
bool f[N];
signed main(){
    ios::sync_with_stdio(0); cin.tie(0);
    int n=read(),k=read();
    repeat(i,0,n)a[i].first=read(),a[i].second=i;
    sort(a,a+n,greater<pii>());
    repeat(i,0,k)f[a[i].second]=1,ans1+=a[i].first;
    int cnt=0,flag=0;
    repeat(i,0,n){
        if(f[i])ans2=ans2*(cnt+1)%mod,cnt=0,flag=1;
        else if(flag)cnt++;
    }
    cout<<ans1<<' '<<ans2<<endl;
    return 0;
}

D2。プリフィックス・サフィックス回文(ハードバージョン)

様々なアプローチはビッグダディのブログを見ることができます。https://wzyxv1n.top/2020/03/20/Codeforces-1326D2/

私のアプローチは、接尾辞の前に可能な限り最大の対称性に削除され、その後、馬の上で実行中の文字列は、馬車車はすべての非常に長い回文配列(もはや側面が拡張することができます回文配列)、各カウントを計算することができます中間文字列か否かの境界を決定します

例えば\(abcdedghhgfcba \) 両側を取るために、すなわち(\ ABC \)\(CBA \) 残り\(dedghhgf \)最長のサブ境界上にある(DED \)\\ (ghhg \) の境界線上にないので、答えは\(abcdedcba \)

これは、私のコードです真の醜いバッチ(エスケープ)

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
typedef long long ll; const int inf=~0u>>2; const ll INF=~0ull>>2; ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
const int N=2000010,mod=998244353;
int len[N],nxt[N];
char s[N],s2[N];
int ans=0,nn,p,x;
void solve(char s[]){
    int n=strlen(s)*2+1;
    repeat_back(i,0,n){
        if(i%2==0)s[i+1]='*';
        else s[i+1]=s[i/2];
    }
    n+=2;
    s[0]='#'; s[n-1]=0;
    len[0]=0;
    int mx=0,id=0;
    repeat(i,1,n-1){
        if(i<mx)len[i]=min(mx-i,len[2*id-i]);
        else len[i]=1;
        while(s[i-len[i]]==s[i+len[i]])len[i]++;
        if(len[i]+i>mx){
            mx=len[i]+i;
            id=i;
        }
        int l=(i-len[i]+1)/2;
        int r=l+len[i]-1-1;
        if(l>r)continue;
        //cout<<l<<' '<<r<<endl;
        if((l==0 || r==nn-1-x-x )&& ans<len[i]-1){
            ans=len[i]-1,p=(l==0);
        }
    }
}
signed main(){
    ios::sync_with_stdio(0); cin.tie(0);
    int T=read(); gets(s);
    while(T--){
        gets(s); ans=0;
        nn=strlen(s);
        strcpy(s2,s);
        x=nn;
        repeat(i,0,nn){
            if(s[i]!=s[nn-1-i])
                x=min(x,i);
        }
        if(x==nn){
            puts(s);
            continue;
        }
        s2[nn-x]=0;
        solve(s2+x);
        repeat(i,0,nn)
            if(i<x || i>nn-1-x ||
            (p==1 && i<x+ans) ||
            (p==0 && i>nn-1-x-ans))putchar(s[i]);
        puts("");
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/axiomofchoice/p/12530703.html