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;
}
posted @ 2022-05-07 06:50  fengwu2005  阅读(51)  评论(0编辑  收藏  举报