20分求调 样例全对5~14WA回复就关注 (@我)QAQ
  • 板块学术版
  • 楼主____QAQ____
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/24 11:26
  • 上次更新2024/8/24 14:29:06
查看原帖
20分求调 样例全对5~14WA回复就关注 (@我)QAQ
1123756
____QAQ____楼主2024/8/24 11:26
#include<bits/stdc++.h>
#define pr pair<int,int>
using namespace std;
const int N=3e6+10;
int stchoose[N];//每条蛇最后一次做抉择 
int st[N];//死活 
int minlife[N];//每条有选择权的蛇认为在第几轮结束 
int T,n,k;
int arr[N],brr[N];
int ans;
void innt(){
	ans=0;
	for(int i=1;i<=n;i++)minlife[i]=n-1,st[i]=1,stchoose[i]=-1;
	for(int i=1;i<=n;i++)brr[i]=arr[i];
}
void cal(){
	priority_queue<pr,vector<pr>,less<pr> > q1; //less 大 greater 小 
	priority_queue<pr,vector<pr>,greater<pr> > q2;
	for(int i=1;i<=n;i++){
		q1.push(make_pair(arr[i],i));
		q2.push(make_pair(arr[i],i));
	}
	int id1=n,id2=1;
	int round=1;
	while(round<n){
		st[id2]=0;
		stchoose[id1]=round;
		brr[id1]-=brr[id2];
		if(stchoose[id2]!=-1){
			minlife[id2]=stchoose[id2]-1;//因为id2这条蛇在stchoose[id2]这一轮时选择吃了某人而最后被id1这条蛇吃掉所以他要在stchoose[id2]这一轮时结束 
		}
		q1.push(make_pair(brr[id1],id1));
		q2.push(make_pair(brr[id1],id1));
		while(!st[q1.top().second]||q1.top().first!=brr[q1.top().second])q1.pop();//优先队列求最小最大 
		while(!st[q2.top().second]||q2.top().first!=brr[q2.top().second])q2.pop(); 
		id1=q1.top().second;
		id2=q2.top().second;
		round++;
	}
}
void to(){
	int minn=1e9;
	for(int i=1;i<=n;i++){
		minn=min(minn,minlife[i]);
	}
	ans=n-minn;
}
int main(){
	cin>>T;T--;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>arr[i];
	innt();cal();to();
	cout<<ans<<endl;
	while(T--){
		cin>>k;
		for(int i=1;i<=k;i++){
			int idx,x;
			cin>>idx>>x;
			arr[idx]=x;
		}
		innt();
		cal();to();
		cout<<ans<<endl;
	}
	return 0;
}
2024/8/24 11:26
加载中...