我第一题样例全过。
但是wa 0分,和暴力程序对拍也没发现问题。
我甚至写了一个全自动对拍(如下)
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int a[N];
int b[N];
signed main()
{
system("start 数据.exe");
Sleep(500);
system("start 代码1.exe");
system("start 代码2.exe");
Sleep(14000);
cout<<"start\n";
freopen("ce1.cpp","r",stdin);
for(int i=1;i<=200;i++)a[i]=rd;
freopen("ce2.cpp","r",stdin);
for(int i=1;i<=200;i++)b[i]=rd;
for(int i=1;i<=200;i++)
{
if(a[i]!=b[i])
{
cout<<"NO";
return 0;
}
}
cout<<"YES";
system("start 测试.exe");
return 0;
}
所以,有没有人告诉我怎么做,或者看看我的代码。
#include<bits/stdc++.h>
#define int long long
#define gc getchar()
#define rd read()
#define N 2000005
using namespace std;
inline int read()
{
register int x=0,ss=1;
register char s=gc;
while(!isdigit(s)&&s!='-')s=gc;
if(s=='-')ss*=-1,s=gc;
while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc;
return ss*x;
}
int T,n,ans;
int a[N];
int b[N],pt[N];
void solve()
{
ans=0;
n=rd;
for(int i=1;i<=n;i++)a[i]=rd,pt[i]=a[i]%2,b[i]=0;
if(n<=3)
{
cout<<n-1;
return;
}
int pos=1,fpos=1,fl=0;
for(int i=2;i<=n;i++)if(pt[i]!=pt[i-1])fl++;
for(int i=1;i<n;i++)
{
b[a[i]]=1;
while(b[pos])pos++;
while(b[n-fpos+1])fpos++;
if(pos==i+1||fpos==i+1||(i==1&&(a[i]==1||a[i]==n))||(i==2&&(a[i]==1&&a[i-1]==n||a[i-1]==1&&a[i]==n)))ans++;
}
cout<<ans+(fl==1);
}
signed main()
{
T=rd;
while(T--)solve(),putchar('\n');
return 0;
}