NOI模擬4
阿新 • • 發佈:2022-05-07
最後一個小時腦力大爆發,生生的把規律找出來了,還看出來幾個錯誤的地方,我真是個天才啊哈哈哈哈
遺憾的是,第一題和第二題只會最最最最基礎的暴力
但是猜第一題結論的時候屬實是給我爽了一會......
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; }