20pts 求助
查看原帖
20pts 求助
203008
山田リョウ楼主2022/9/14 20:55
// Problem: P7078 [CSP-S2020] 贪吃蛇
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7078
// Memory Limit: 256 MB
// Time Limit: 2000 ms

#include<stdio.h>
int a[1000001],b[1000002],q1[1000001],q2[1000001],l1,l2,r1,r2,n;
inline void init(){
	l1=1,r1=n,l2=1,r2=0,b[0]=0,b[n+1]=0x3f3f3f3f;
	for(int i=1;i<=n;++i)q1[i]=i,q2[i]=0,b[i]=a[i];
}
inline int cmp(int x,int y){return b[x]==b[y]?x>y:b[x]>b[y];}
inline int min(int x,int y){return cmp(x,y)?y:x;}
inline int max(int x,int y){return cmp(x,y)?x:y;}
inline int mx1(){return l1<=r1?q1[r1]:0;}
inline int mx2(){return l2<=r2?q2[r2]:0;}
inline int mn1(){return l1<=r1?q1[l1]:n+1;}
inline int mn2(){return l2<=r2?q2[l2]:n+1;}
int res=0;
void work(){
	init();
	int flag=-1,cnt=0;
	for(int i=n;i>1;--i){
		if(i==2){
			cnt+=!(~flag);
			break;
		}
		int mx=max(mx1(),mx2()),mn=min(mn1(),mn2());
		if(l1<=r1&&q1[r1]==mx)--r1;
		else --r2;
		if(l1<=r1&&q1[l1]==mn)++l1;
		else ++l2;
		b[mx]-=b[mn];
		if(cmp(min(mn1(),mn2()),mx)){
			if(~flag)flag^=1;
			else flag=0;
		}else{
			if(~flag)break;
			++cnt;
		}
		q2[++r2]=mx;
	}
	printf("%d\n",n-cnt-((~flag)?flag:0));
}
int main(){
	int t,x,y,k;
	scanf("%d%d",&t,&n);
	for(int i=1;i<=n;++i)scanf("%d",a+i);
	for(init(),work();--t;work())
		for(scanf("%d",&k);k--;)
			scanf("%d%d",&x,&y),a[x]=y;
	return 0;
}
2022/9/14 20:55
加载中...