1. 程式人生 > 其它 >NOI模擬4

NOI模擬4

最後一個小時腦力大爆發,生生的把規律找出來了,還看出來幾個錯誤的地方,我真是個天才啊哈哈哈哈

遺憾的是,第一題和第二題只會最最最最基礎的暴力

但是猜第一題結論的時候屬實是給我爽了一會......

T1 魔法球

其實二分是非常顯然的,但是check的時候出現了一點點小問題

我一直都在想實際意義上的check,沒有做出一點改動

於是就死在這裡的,正解是直接判斷給出的個數和能容下的個數的大小關係

AC_code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
    int s=0,t=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
    while(isdigit(ch)){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
    return s*t;
}
const int N=1e6+5;
int T,n,a[N];
int rp,it,sm;
bool jud(int md){
    int sum=0;
    fu(i,n-md,1){
        sum+=a[i];
        if(sum-(n-md-i+1)*md>(i-1)*(n-md-i+1))return false;
    }
    return true;
}
signed main(){
    freopen("magic.in","r",stdin);
    freopen("magic.out","w",stdout);
    T=read();
    while(T--){
        n=read();
        fo(i,1,n)a[i]=read();
        sort(a+1,a+n+1);
        int l=1,r=n,mid;
        while(l<r){
            mid=l+r>>1;
            if(jud(mid))r=mid;
            else l=mid+1;
        }
        printf("%d\n",l);
    }
    return 0;
}

T2 基因切割

考場上只想到了暴力KMP

可以根號分治一下,短串使用hash

還有一種做法,用26個bitset...

沒寫,懶了

T3 細菌培養

看出來了是個多項式,於是我就找規律去了...

AC_code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
    int s=0,t=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
    while(isdigit(ch)){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
    return s*t;
}
const int N=1e6+5;
const int mod=5;
int ksm(int x,int y,int mo){
    int ret=1;
    while(y){
        if(y&1)ret=ret*x%mod;
        x=x*x%mod;y>>=1;
    }return ret;
}
int n,T,a[2][N],pw[N],cf[N];
signed main(){
    freopen("bacteria.in","r",stdin);
    freopen("bacteria.out","w",stdout);
    n=read();T=read();
    int now=0;bool flag=false;
    fo(i,1,n){
        a[now][i]=read()%mod;
        if(a[now][i]==0){
            // cerr<<"SB"<<endl;
            if(T*2+1>=n){flag=true;}int ps;
            ps=i-T%n;
            if(ps<=0){
                ps+=n;
                cf[ps]++;cf[n+1]--;
                cf[1]++;cf[i+1]--;
            }
            else cf[ps]++,cf[i+1]--;
            ps=i+T%n;
            if(ps>n){
                ps-=n;
                cf[1]++;cf[ps+1]--;
                cf[i]++;cf[n+1]--;
            }
            else cf[i]++,cf[ps+1]--;
        }
    }
    if(flag){
        fo(i,1,n)printf("0 ");
        return 0;
    }
    fo(i,1,n)cf[i]+=cf[i-1];
    fo(i,1,60)if(T&(1ll<<i)){
        now^=1;int ds=(1ll<<i-1)%n,ps;
        fo(j,1,n){
            a[now][j]=a[now^1][j]*a[now^1][j]*a[now^1][j]%mod;
            ps=j-2*ds%n;if(ps<=0)ps+=n;a[now][j]=a[now][j]*a[now^1][ps]%mod;
            ps=j-ds;if(ps<=0)ps+=n;a[now][j]=a[now][j]*a[now^1][ps]%mod*a[now^1][ps]%mod;
            ps=j+2*ds%n;if(ps>n)ps-=n;a[now][j]=a[now][j]*a[now^1][ps]%mod;
            ps=j+ds;if(ps>n)ps-=n;a[now][j]=a[now][j]*a[now^1][ps]%mod*a[now^1][ps]%mod;
        }
    }
    if(T&1){now^=1;
        // cerr<<"SB"<<endl;
        fo(j,1,n){
            a[now][j]=a[now^1][j];
            if(j==1)a[now][j]=a[now][j]*a[now^1][n]%mod;
            else a[now][j]=a[now][j]*a[now^1][j-1]%mod;
            if(j==n)a[now][j]=a[now][j]*a[now^1][1]%mod;
            else a[now][j]=a[now][j]*a[now^1][j+1]%mod;
        }
    }
    fo(i,1,n){
        if(cf[i])a[now][i]=0;
        printf("%lld ",a[now][i]);
    }
    return 0;
}