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;
}
QQ:2953174821