手动SPJ
前言
题目为内部题库联赛模拟测试17第三题,gjk.cpp为AC代码,lsx.cpp为被检测代码
已经被拍挂的名单:
\(DarthVictor\)
\(Midoria\)
\(B041016\)
\(youxam\)
\(HEOI \text{动动}\)
check
#include<bits/stdc++.h>
#define re register
using namespace std;
const int lzw=2e5+3;
int n,a[lzw],g[lzw],l[lzw];
int num[lzw],Max;
bool flag;
int main(){
freopen("check.out","w",stdout);
freopen("in.in","r",stdin);
scanf("%d",&n);
for(re int i=1;i<=n;i++) scanf("%d",&a[i]);
system("./gjk");
// fclose(stdin);
freopen("gjk.out","r",stdin);
int gjk;
scanf("%d",&gjk);
// cin>>gjk
if(gjk!=-1) for(re int i=1;i<=n;i++) scanf("%d",&g[i]);
// fclose(stdin);
system("./lsx");
freopen("lsx.out","r",stdin);
int lsx;
scanf("%d",&lsx);
if(lsx!=-1) for(re int i=1;i<=n;i++) scanf("%d",&l[i]);
// cout<<gjk<<' '<<lsx<<endl;
if(lsx!=gjk) return cout<<"最大的不一样WA1"<<endl,0;
if(lsx==-1) return cout<<"AC"<<endl,0;
memset(num,0,sizeof(num));
for(re int i=1;i<=n;i++){
if(a[i]&&a[i]!=g[i]) cout<<"凯爹出错WA2"<<endl,flag=1;
num[g[i]]++;
if(num[g[i]]>5) cout<<"凯爹出错WA3"<<endl,flag=1;
if(g[i]<g[i-1]||abs(g[i]-g[i-1])>1) cout<<"凯爹出错WA4"<<endl,flag=1;
}
for(re int i=1;i<=gjk;i++) if(num[i]<2) cout<<"凯爹出错WA5"<<endl,flag=1;
memset(num,0,sizeof(num));
for(re int i=1;i<=n;i++){
if(a[i]&&a[i]!=l[i]) cout<<"sir出错WA2"<<endl,flag=1;
num[l[i]]++;
if(num[l[i]]>5) cout<<"sir出错WA3"<<endl,flag=1;
if(l[i]<l[i-1]||abs(l[i]>l[i-1])>1) cout<<"sir出错WA4"<<endl,flag=1;
}
for(re int i=1;i<=lsx;i++) if(num[i]<2) cout<<"sir出错WA5"<<endl,flag=1;
if(!flag) cout<<"AC"<<endl;
}
run
#include<bits/stdc++.h>
using namespace std;
int main(){
system("g++ check.cpp -o check");
system("g++ gjk.cpp -o gjk -O2");
system("g++ lsx.cpp -o lsx -O2");
system("g++ data.cpp -o data");
int cnt=0;
while(++cnt){
system("./data");
system("./check");
freopen("check.out","r",stdin);
string s;
cin>>s;
if(s!="AC") return cout<<s<<endl,0;
cout<<cnt<<' '<<s<<endl;
if(cnt==10000) return 0;
}
}
data
#include<bits/stdc++.h>
#define re register
#define rint register int
using namespace std;
vector<int> v;
int tag[200000];
const int maxn=1e2;
int main(){
srand((unsigned int)(new char));
freopen("in.in","w",stdout);
rint n=rand()%maxn+5;
printf("%d\n",n);
for(rint i=rand()%3+1;i<=n;i+=rand()%3+2)
tag[i]=1;
for(rint i=1;i<=n;i++) tag[i]+=tag[i-1];
tag[n+1]=tag[n]+1;
for(rint i=2;i<=n;i++)
{
if(rand()%3) tag[i]=tag[i-1];
if(rand()%3) tag[i]=tag[i+1];
}
for(rint i=2;i<=n;i++)
{
if(rand()%3) tag[i]=tag[i-1];
if(rand()%3) tag[i]=tag[i+1];
}
for(rint i=1;i<=n;i++)
if(rand()%4)
tag[i]=0;
for(rint i=1;i<=n;i++)
if(rand()%2333==0)
swap(tag[rand()%n+1],tag[rand()%n+1]);
for(rint i=1;i<=n;i++)
printf("%d ",tag[i]);
}
gjk.cpp
#include <cstdio>
const int maxn=2e5+10;
int dp[maxn][10];
int tmp[maxn];
int a[maxn];
void get(int wh,int hm){
if(!wh)
return;
for(int i=1,now=tmp[wh];i<=hm;i++,now--)
a[now]=a[tmp[wh]];
if(dp[wh][hm]==1)
a[tmp[wh-1]+1]=a[tmp[wh-1]];
get(wh-1,dp[wh][hm]);
}
int n;
void solve(){
int lst=1;
int lsts=0;
for(int i=1;i<=n;i++){
if(!a[i]&&a[i-1]){
lst=i;
lsts=a[i-1];
}
if(!a[i]&&a[i+1]){
int now=i-lst+1;
int cz=a[i+1]-lsts-1;
if(!cz){
for(int j=i;j>=lst;j--)
a[j]=lsts;
}
if(cz*5<now){
int nowf=0;
int s=a[i+1]-1;
for(int j=i;j>=lst;j--){
a[j]=s;
nowf++;
if(nowf==5){
nowf=0;
s--;
}
}
}
else{
int tmp=now/cz;
int d=now-tmp*cz;
int s=a[i+1]-1;
int ha=0;
for(int j=i;j>=lst;j--){
a[j]=s;
ha++;
if((ha==tmp&&a[i+1]-s>d)||ha==tmp+1){
ha=0;
s--;
}
}
}
}
}
}
int main(){
freopen("in.in","r",stdin);
freopen("gjk.out","w",stdout);
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i])
tmp[++cnt]=i;
}
dp[0][5]=1;
for(int i=1;i<=cnt;i++){
if(dp[i-1][1]){
int cz=a[tmp[i]]-a[tmp[i-1]];
int jl=tmp[i]-tmp[i-1];
if(!cz){
if(1+jl<=5&&!dp[i][1+jl])
dp[i][1+jl]=1;
}
else{
if((cz-1)*2+2<=jl&&(cz-1)*5+5>=jl)
if(!dp[i][1])
dp[i][1]=1;
if((cz-1)*2+3<=jl&&(cz-1)*5+6>=jl)
if(!dp[i][2])
dp[i][2]=1;
if((cz-1)*2+4<=jl&&(cz-1)*5+7>=jl)
if(!dp[i][3])
dp[i][3]=1;
if((cz-1)*2+5<=jl&&(cz-1)*5+8>=jl)
if(!dp[i][4])
dp[i][4]=1;
if((cz-1)*2+6<=jl&&(cz-1)*5+9>=jl)
if(!dp[i][5])
dp[i][5]=1;
}
}
if(dp[i-1][2]){
int cz=a[tmp[i]]-a[tmp[i-1]];
int jl=tmp[i]-tmp[i-1];
if(!cz){
if(2+jl<=5&&!dp[i][2+jl])
dp[i][2+jl]=2;
}
else{
if((cz-1)*2+1<=jl&&(cz-1)*5+4>=jl)
if(!dp[i][1])
dp[i][1]=2;
if((cz-1)*2+2<=jl&&(cz-1)*5+5>=jl)
if(!dp[i][2])
dp[i][2]=2;
if((cz-1)*2+3<=jl&&(cz-1)*5+6>=jl)
if(!dp[i][3])
dp[i][3]=2;
if((cz-1)*2+4<=jl&&(cz-1)*5+7>=jl)
if(!dp[i][4])
dp[i][4]=2;
if((cz-1)*2+5<=jl&&(cz-1)*5+8>=jl)
if(!dp[i][5])
dp[i][5]=2;
}
}
if(dp[i-1][3]){
int cz=a[tmp[i]]-a[tmp[i-1]];
int jl=tmp[i]-tmp[i-1];
if(!cz){
if(3+jl<=5&&!dp[i][3+jl])
dp[i][3+jl]=3;
}
else{
if((cz-1)*2+1<=jl&&(cz-1)*5+3>=jl)
if(!dp[i][1])
dp[i][1]=3;
if((cz-1)*2+2<=jl&&(cz-1)*5+4>=jl)
if(!dp[i][2])
dp[i][2]=3;
if((cz-1)*2+3<=jl&&(cz-1)*5+5>=jl)
if(!dp[i][3])
dp[i][3]=3;
if((cz-1)*2+4<=jl&&(cz-1)*5+6>=jl)
if(!dp[i][4])
dp[i][4]=3;
if((cz-1)*2+5<=jl&&(cz-1)*5+7>=jl)
if(!dp[i][5])
dp[i][5]=3;
}
}
if(dp[i-1][4]){
int cz=a[tmp[i]]-a[tmp[i-1]];
int jl=tmp[i]-tmp[i-1];
if(!cz){
if(4+jl<=5&&!dp[i][4+jl])
dp[i][4+jl]=4;
}
else{
if((cz-1)*2+1<=jl&&(cz-1)*5+2>=jl)
if(!dp[i][1])
dp[i][1]=4;
if((cz-1)*2+2<=jl&&(cz-1)*5+3>=jl)
if(!dp[i][2])
dp[i][2]=4;
if((cz-1)*2+3<=jl&&(cz-1)*5+4>=jl)
if(!dp[i][3])
dp[i][3]=4;
if((cz-1)*2+4<=jl&&(cz-1)*5+5>=jl)
if(!dp[i][4])
dp[i][4]=4;
if((cz-1)*2+5<=jl&&(cz-1)*5+6>=jl)
if(!dp[i][5])
dp[i][5]=4;
}
}
if(dp[i-1][5]){
int cz=a[tmp[i]]-a[tmp[i-1]];
int jl=tmp[i]-tmp[i-1];
if(!cz){
if(5+jl<=5&&!dp[i][5+jl])
dp[i][5+jl]=5;
}
else{
if((cz-1)*2+1<=jl&&(cz-1)*5+1>=jl)
if(!dp[i][1])
dp[i][1]=5;
if((cz-1)*2+2<=jl&&(cz-1)*5+2>=jl)
if(!dp[i][2])
dp[i][2]=5;
if((cz-1)*2+3<=jl&&(cz-1)*5+3>=jl)
if(!dp[i][3])
dp[i][3]=5;
if((cz-1)*2+4<=jl&&(cz-1)*5+4>=jl)
if(!dp[i][4])
dp[i][4]=5;
if((cz-1)*2+5<=jl&&(cz-1)*5+5>=jl)
if(!dp[i][5])
dp[i][5]=5;
}
}
int bj=0;
for(int j=1;j<=5;j++)
bj|=dp[i][j];
if(!bj){
printf("-1");
return 0;
}
}
if(tmp[cnt]==n){
int bj=0;
for(int i=2;i<=5;i++)
bj|=dp[cnt][i];
if(!bj){
printf("-1");
return 0;
}
}
for(int i=2;i<=5;i==5?(i=1):i++){
if(dp[cnt][i]){
if(i==1){
printf("%d\n",(n-tmp[cnt]-1)/2+a[tmp[cnt]]);
a[tmp[cnt]+1]=a[tmp[cnt]];
int now=a[tmp[cnt]]+1;
int nown=tmp[cnt]+2;
for(int j=1;nown<=n;j++,nown++,now+=j&1)
a[nown]=now;
get(cnt,1);
if(a[n]!=a[n-1])
a[n]--;
}
else{
int tmp_=(n-tmp[cnt])/2+a[tmp[cnt]];
int now=a[tmp[cnt]]+1;
int nown=tmp[cnt]+1;
for(int j=1;nown<=n;j++,nown++,now+=j&1)
a[nown]=now;
get(cnt,i);
if(a[n]!=a[n-1]&&a[n-1]){
a[n]--;
if(tmp[cnt]==n-1&&i==5){
printf("-1");
return 0;
}
}
printf("%d\n",tmp_);
}
solve();
for(int j=1;j<=n;j++)
printf("%d ",a[j]);
return 0;
}
}
return 0;
}
签名:
我将轻轻叹息,叙述这一切,
许多许多年以后:
林子里有两条路,我——
选择了行人稀少的那一条,
它改变了我的一生。