为啥 40 pts?
前 8 个点都过了
#include<bits/stdc++.h>
using namespace std;
int t,n,a[1000010];
const int mexx=2e9;
template<typename Name> void nread(Name &x){
x=0;
char ch=getchar();
bool f=0;
while(ch<'0' || ch>'9') f=(ch=='-' ? 1 : f),ch=getchar();
while(ch>='0' && ch<='9') x=x*10+(ch-'0'),ch=getchar();
if(f) x=-x;
return ;
}
struct node{
int x,id;
bool operator < (const node &o)const{
if(x!=o.x) return x<o.x;
return id<o.id;
}
};
node node_max(node a,node b){
if(a<b) return b;
return a;
}
node node_min(node a,node b){
if(a<b) return a;
return b;
}
bool dfs(deque<node> &q1,deque<node> &q2){
//1. 找到当前的最大蛇和最小蛇(q1 q2都有可能)
//2. 如果吃掉后的新蛇不是最小蛇,直接向下递归
//3. 向下递归 观察返回结果为 1 还是 0 得出结论并 return
if(q1.size()+q2.size()<2) return 0;
if(q2.size()==0 && q1.size()>1){
node Max=q1.back(),Min=q1.front();
q1.pop_back();
q1.pop_front();
// cout<<"Minid(will)="<<q1.front().id<<" "<<"Minnum(will)="<<q1.front().x<<"\n";
if(q1.size()==0 || Max.x-Min.x>q1.front().x || (Max.x-Min.x==q1.front().x && Max.id<q1.front().id)){
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"push Maxnum="<<Max.x<<" Minnum="<<Min.x<<" id="<<Max.id<<"\n";
return dfs(q1,q2);
}else{
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"It is min.\n";
if(dfs(q1,q2)==1) return 0;
q1.push_front(Min); // 把蛇吐回去
q1.push_back(Max); // 大的不变
return 1;
}
}
if(q1.size()==0 && q2.size()>1){
node Max=q2.front(),Min=q2.back();
q2.pop_front();
q2.pop_back();
// cout<<"Minid(will)="<<q2.back().id<<" "<<"Minnum(will)="<<q2.back().x<<"\n";
if(q2.size()==0 || Max.x-Min.x>q2.back().x || (Max.x-Min.x==q2.back().x && Max.id<q2.back().id)){
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"push Maxnum="<<Max.x<<" Minnum="<<Min.x<<" id="<<Max.id<<"\n";
return dfs(q1,q2);
}else{
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"It is min.\n";
if(dfs(q1,q2)==1) return 0;
q2.push_front(Max); // 那个大的不变
q2.push_back(Min); // 把蛇吐回去
return 1;
}
}
if(q1.back()<q2.front()){ // 最大值是 q2.front()
node Max=q2.front(),Min={mexx,mexx};
int mpos=0;
q2.pop_front();
// cout<<"Maxid="<<Max.id<<" Maxnum="<<Max.x<<"\n";
if(q1.size()>0 && (q2.size()==0 || q1.front()<q2.back())){
Min=q1.front(),q1.pop_front(),mpos=1;
}else Min=q2.back(),q2.pop_back(),mpos=2;
if(q1.size()==0 && q2.size()==0){
q2.push_back({Max.x-Min.x,Max.id});
return 0;
}
node mn={mexx,mexx};
if(q1.size()>0 && (q2.size()==0 || q1.front()<q2.back())){
mn=q1.front();
}else mn=q2.back();
// cout<<"Minid(will)="<<mn.id<<" "<<"Minnum(will)="<<mn.x<<"\n";
if(Max.x-Min.x>mn.x || (Max.x-Min.x==mn.x && Max.id<mn.id)){
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"push Maxnum="<<Max.x<<" Minnum="<<Min.x<<" id="<<Max.id<<"\n";
return dfs(q1,q2);
}else{
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"It is min.\n";
if(dfs(q1,q2)==1) return 0;
q2.push_front(Max); // 那个大的不变
if(mpos==1) q1.push_front(Min); // 把蛇吐回去
else q2.push_back(Max);
return 1;
}
}
if(q2.front()<q1.back()){ // 最大值是 q1.back()
node Max=q1.back(),Min={mexx,mexx};
int mpos=0;
q1.pop_back();
// cout<<"Maxid="<<Max.id<<" Maxnum="<<Max.x<<"\n";
if(q2.size()>0 && (q1.size()==0 || q2.back()<q1.front())){
Min=q2.back(),q2.pop_back(),mpos=2;
}else Min=q1.front(),q1.pop_front(),mpos=1;
if(q1.size()==0 && q2.size()==0){
q2.push_back({Max.x-Min.x,Max.id});
return 0;
}
node mn={mexx,mexx};
if(q2.size()>0 && (q1.size()==0 || q2.back()<q1.front())){
mn=q2.back();
}else mn=q1.front();
// cout<<"Minid="<<Min.id<<" Minnum="<<Min.x<<"\n";
// cout<<"Minid(will)="<<mn.id<<" "<<"Minnum(will)="<<mn.x<<"\n";
if(Max.x-Min.x>mn.x || (Max.x-Min.x==mn.x && Max.id<mn.id)){
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"push Maxnum="<<Max.x<<" Minnum="<<Min.x<<" id="<<Max.id<<"\n";
return dfs(q1,q2);
}else{
q2.push_back({Max.x-Min.x,Max.id});
// cout<<"It is min.\n";
if(dfs(q1,q2)==1) return 0;
q1.push_back(Max); // 那个大的不变
if(mpos==1) q1.push_front(Min); // 把蛇吐回去
else q2.push_back(Min);
return 1;
}
}
}
int main(){
// freopen("P7078_9.in","r",stdin);
nread(t);
for(int i=1;i<=t;++i){
if(i==1){
nread(n);
for(int j=1;j<=n;++j) nread(a[j]);
}else{
nread(n);
for(int j=1;j<=n;++j){
int x,y;
nread(x);
nread(y);
a[x]=y;
}
}
deque<node> q1,q2;
// cout<<"a:";
for(int j=1;j<=n;++j) q1.push_back({a[j],j});
// cout<<"\n";
dfs(q1,q2);
cout<<q1.size()+q2.size()<<"\n";
// cout<<"q1:";
// while(q1.size()) cout<<q1.front().x<<" ",q1.pop_front();
// cout<<"\nq2:";
// while(q2.size()) cout<<q2.front().x<<" ",q2.pop_front();
// cout<<"\n";
}
return 0;
}
后面的点全都是 WA,没有一个 TLE。