CODE FESTIVAL 2017これはA题解

ポータル

\(\)

コキュ

const int N=25;
const char t[]={" YAKI"};
char s[N];int n;
int main(){
    scanf("%s",s+1),n=strlen(s+1);
    if(n<4)return puts("No"),0;
    fp(i,1,4)if(s[i]!=t[i])return puts("No"),0;
    puts("Yes");
    return 0;
}

\(Bの\)

反転した場合\(Iは\)\(J \)カラムを、次いで、グリッドの数が黒\(私は+ J Mタイムズ\タイムズ-N-2 \タイムズI \ Jタイムズ\を\) 次いで個数を保持しますライン上のカラム数

int n,m,k;
int main(){
    scanf("%d%d%d",&n,&m,&k);
    fp(i,0,n)fp(j,0,m)if(k==i*m+j*n-(i*j<<1))return puts("Yes"),0;
    puts("No");
    return 0;
}

\(C \)

中間奇数除去し、次いで、グリッドで最初の余分な行の行または列の数\((i、j)は\ ) 格子に等しくなければならない、他の3つ、4つの等しい回のこのような数で記録し、そして、時間の余分な二つの等しい数の中で奇数順位である行が合法であるかを判断します

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=105;
char s[N];int c[26],c1,c2,n,m;
inline int min(R int x,R int y){return x<y?x:y;}
int main(){
    scanf("%d%d",&n,&m);
    fp(i,1,n){
        scanf("%s",s+1);
        fp(j,1,m)++c[s[j]-'a'];
    }
    c1=(n>>1)*(m>>1),c2=(n&1)*(m>>1)+(m&1)*(n>>1);
    for(R int k,i=0;c1&&i<26;++i){
        k=min(c1,c[i]>>2);
        c1-=k,c[i]-=(k<<2);
    }
    if(c1)return puts("No"),0;
    for(R int k,i=0;c2&&i<26;++i){
        k=min(c2,c[i]>>1);
        c2-=k,c[i]-=(k<<1);
    }
//  printf("%d %d\n",c1,c2);
    if(c2)return puts("No"),0;
    puts("Yes");
    return 0;
}

\(D \)

脳は錆び推定......

マンハッタン距離は、最初のチェビシェフ距離、すなわち転送され、\((i、j)を\ ) になり((私はJ、)のIJを\ +)\その後、私たちは新しいマップ、およびポイントでそれをすべてカットすることがわかり、チェビシェフ距離\(D \)点は横または縦の差有していなければならない\(Dを\) 我々は押し\(Dの\時間D \)同じ色のグループにすべての点を、そしてあなたは確かに合法的な見つけることができるように、異なる色の隣接セットを囲むと、その8

各グループに隣接して、異なる色の8セット、周り限り、奇数ラインを埋めるよう\(12121212 ... \) 満たされた偶数ライン\(343434 ... \)をうまく

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=505;
const char c[]={"RYGB"};
char mp[N][N];int n,m,d;
int main(){
    scanf("%d%d%d",&n,&m,&d);
    fp(i,1,n)fp(j,1,m){
        R int x=i+j,y=i-j+m-1;
        mp[i][j]=c[((y/d)&1)+((x/d)&1)*2];
    }
    fp(i,1,n){
        fp(j,1,m)putchar(mp[i][j]);
        putchar('\n');
    }
    return 0;
}

\(E \)

まず、第1の時間は確かに全体の行または列であるため、我々は初めてこと列全体を想定し、その間隔の列全体着色仮定\([L、R] \) \(L、Rの\) 2本のマストを)塗装することができ、ように塗装することができ、上部および下部セクションの列数を設定\(k個の\)を、このセクションの寄与がある)\(2 ^ k個の\

その後、我々は二つの側面が最初に横に、後に自由に描かれていた強制、両面を考慮してください。左側に、例えば、ダウンがこの部分を覚えて\(Y軸\)個体、上方が\(Z軸\)個体、右側に存在\(X \)個体、クロスは、青色として見た場合には、赤色縦最終溶液のその後輪郭考慮した後、反応後の部分を取るために描かれた、からである\((0,0)\)来る\(O(X、Y + )Zを\) プログラム番号(\ {X + Y + Z \} X \上)、およびクロスの観点から描い持っているので、行かなければならない(X-1 \)\、そう回の最終的な数は、プログラムの直後にダウンしていますされている\({X + Y + Z \ X上} -オーバー{X + Y + Zの1- \ =} {X + Y + Z-X 1 \ Xオーバー1。。} \) そして、接頭辞と接尾辞はそれぞれ、ライン上に出ます、

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=998244353;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
    R int res=1;
    for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
    return res;
}
const int N=2e5+5,M=1e6+5;
int fac[M],ifac[M],bin[M],ibin[M];
inline int C(R int n,R int m){return m>n?0:1ll*fac[n]*ifac[m]%P*ifac[n-m]%P;}
void init(int n=1e6){
    fac[0]=ifac[0]=bin[0]=ibin[0]=1;
    fp(i,1,n)fac[i]=mul(fac[i-1],i);
    ifac[n]=ksm(fac[n],P-2);
    fd(i,n-1,1)ifac[i]=mul(ifac[i+1],i+1);
    fp(i,1,n)bin[i]=mul(bin[i-1],2);
    fp(i,1,n)ibin[i]=mul(ibin[i-1],499122177);
}
char mp[4][N];int sum[4][N],f[N],b[N],s[N];
int n,m,res;
void calc(){
    memset(f,0,sizeof(f));
    memset(b,0,sizeof(b));
    memset(s,0,sizeof(s));
    R int x=sum[0][n],y,z;
    fp(i,0,m){
        if(mp[2][i+1]=='0'&&mp[3][i+1]=='0')continue;
        y=sum[2][i],z=sum[3][i];
        f[i]=(x?C(x+y+z-1,x-1):(!y&&!z));
    }
    x=sum[1][n];
    fd(i,m+1,1){
        if(mp[2][i-1]=='0'&&mp[3][i-1]=='0')continue;
        y=sum[2][m]-sum[2][i-1],z=sum[3][m]-sum[3][i-1];
        b[i]=(x?C(x+y+z-1,x-1):(!y&&!z));
    }
    fp(i,1,m)s[i]=s[i-1]+(mp[2][i]=='1'&&mp[3][i]=='1');
    fp(i,0,m)f[i]=mul(f[i],ibin[s[i]]);
    fd(i,m+1,1)b[i]=add(b[i+1],mul(b[i],bin[s[i-1]]));
    fp(i,1,m)upd(res,mul(f[i-1],b[i+1]));
}
int main(){
//  freopen("testdata.in","r",stdin);
    init();
    scanf("%d%d",&n,&m);
    fp(i,0,3)scanf("%s",mp[i]+1);
    fp(i,0,3){
        R int t=(i<=1?n:m);
        fp(j,1,t)sum[i][j]=sum[i][j-1]+(mp[i][j]=='1');
    }
    if(!sum[0][n]&&!sum[1][n]&&!sum[2][m]&&!sum[3][m])return puts("1"),0;
    calc();
    swap(mp[0],mp[2]),swap(mp[1],mp[3]);
    swap(sum[0],sum[2]),swap(sum[1],sum[3]);
    swap(n,m);
    calc();
    printf("%d\n",res);
    return 0;
}

\(F \)

まず、それぞれの番号に分けて考えるならば、上限は間違いです\(\ a_iを\をログ)

ただし、一部の操作は数がされ、間で合併することができます(2 \)\そうでない場合は、すべての操作が唯一の左右にある必要があります、それは問題ではない程度の力ですべての操作のを

その後貪欲、レコードの背中に右、フロント左からどのくらいの余分な時間を私たちは前方転送することができます

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
int a[N],b[N],c[N],n,res,lst,tmp;
int main(){
    scanf("%d",&n);
    for(R int i=1,x;i<=n;++i){
        scanf("%d",&x),a[i]=x,b[i]=-1;
        while(a[i])++b[i],a[i]>>=1;
        c[i]=((x&-x)!=x),res+=b[i]+c[i];
    }
    fp(i,1,n){
        tmp=min(lst,b[i]),res-=tmp,lst-=tmp;
        if(lst&&c[i])--res,--c[i];
        lst=b[i]+c[i];
    }
    printf("%d\n",res);
    return 0;
}

おすすめ

転載: www.cnblogs.com/yuanquming/p/11609878.html