社区讨论

警示后人:若看过其他“警示后人”没调出来

P7078[CSP-S 2020] 贪吃蛇参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhizdgvd
此快照首次捕获于
2025/11/03 18:11
4 个月前
此快照最后确认于
2025/11/03 18:11
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1000005];
deque<ll> q1,q2;
int solve(){
	int ans;
	while(1){
		if(q1.size()+q2.size()==2){
			ans=1;
			break;
		}
		ll strongest,weakest=q1.front();
		q1.pop_front();
		if(q2.empty()||((!q1.empty())&&(q1.back()>q2.back()))){
			strongest=q1.back();
			q1.pop_back();
		}else{
			strongest=q2.back();
			q2.pop_back();
		}
		ll newsnake=strongest-((weakest>>32)<<32);
		if(!q1.empty()&&(newsnake>q1.front())){
			q2.push_front(newsnake);
		}else{
			ans=q1.size()+q2.size()+2;
			int cc=0;
			while(1){
				cc++;
				if(q1.size()+q2.size()==1){
					if(cc%2==0)ans--;
					break;
				}
				ll strongest;
				if(q2.empty()||((!q1.empty())&&(q1.back()>q2.back()))){
					strongest=q1.back();
					q1.pop_back();
				}else{
					strongest=q2.back();
					q2.pop_back();
				}
				newsnake=strongest-((newsnake>>32)<<32);
				if(!q1.empty()&&(newsnake>q1.front()||(q2.empty()&&newsnake>q2.front()))){
					if(cc%2==0)ans--;
					break;
				}
			}
			break;
		}
	}
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin>>T;
	bool first=true;
	int N;
	while(T--){
		q1.clear();
		q2.clear();
		int n;
		cin>>n;
		if(first){
			for(int i=1;i<=n;i++){
				cin>>a[i];
				q1.push_back((a[i]<<32)|i);
			}
			first=false;
			N=n;
		}else{
			for(int i=1;i<=n;i++){
				int x,y;
				cin>>x>>y;
				a[x]=y;
			}
			for(int i=1;i<=N;i++){
				q1.push_back((a[i]<<32)|i);
			}
		}
		cout<<solve()<<'\n';
	}
	return 0;
}

这个代码会 WA 50pts.
看这里:
CPP
if(!q1.empty()&&(newsnake>q1.front()||(q2.empty()&&newsnake>q2.front())))
请不要相信自己的直觉,此处q2.empty()应该为!q2.empty().
教训:不要盲目相信自己的直觉,要 列个真值表 实际验证或者换个写法.

回复

0 条回复,欢迎继续交流。

正在加载回复...