社区讨论

暴力代码,数组开得很大,但不知道怎么就RE了qwq

P9180[COCI 2022/2023 #5] Slastičarnica参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m04m7co9
此快照首次捕获于
2024/08/22 09:39
2 年前
此快照最后确认于
2025/11/04 22:47
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans=0;
int n,q;
int a[5000005],d[5000005],s[5000005];
void qwq(int x,int y,int num){//开搜
	if(num>q||d[num]>(y-x+1)){//如果当前所剩位置不够,返回
		ans=max(ans,num-1);
		return;
	}
	else{
		bool flag=true;
		int sum1=0;
		for(int i=x;i<(x+d[num]);i++){
			if(a[i]<s[num]){
				flag=false;
				sum1++;
			}
		}
		int sum=sum1;
		if(!flag){
			flag=true;
			for(int i=0;(i+x+d[num])<y;i++){
				if(a[i+x]<s[num]) sum--;
				if(a[i+x+d[num]]<s[num]) sum++;
				if(sum==0){
					flag=false;
					qwq(x+i+d[num]+1,y,num+1);
					break;
				} 
			}
			if(flag) ans=max(ans,num-1);
		}
		else qwq(x+d[num],y,num+1);
		flag=true;
		for(int i=y;i>(y-d[num]);i--){
			if(a[i]<s[num]) flag=false;
		}
		sum=sum1;
		if(!flag){
			flag=true;
			for(int i=0;(y-i-d[num])>x;i--){
				if(a[y-i]<s[num]) sum--;
				if(a[y-i-d[num]]<s[num]) sum++;
				if(sum==0){
					flag=false;
					qwq(x,y-i-d[num]-1,num+1);
					break;
				} 
			}
			if(flag) ans=max(ans,num-1);
		}
		else qwq(x,y-d[num],num+1);
	}
}
signed main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=q;i++){
		scanf("%d%d",&d[i],&s[i]);
	}
	qwq(1,n,1);//起点、终点和第几次操作 
	cout<<ans;
}

回复

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

正在加载回复...