求助 单调队列 40 pts 预期 100
查看原帖
求助 单调队列 40 pts 预期 100
1251949
STDLRZ楼主2024/4/10 16:28

为啥 40 pts40~pts?

前 88 个点都过了

#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;
}

后面的点全都是 WAWA,没有一个 TLETLE。

2024/4/10 16:28
加载中...