奇葩dp循环挂分NOIP2023T3
  • 板块题目总版
  • 楼主Klein_Fish
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/20 13:15
  • 上次更新2023/11/21 22:53:47
查看原帖
奇葩dp循环挂分NOIP2023T3
1045605
Klein_Fish楼主2023/11/20 13:15

我的奇葩循环

#include <bits/stdc++.h>
using namespace std;
const int N=2010;
inline int read(){
	int x=0;bool f=0;
	char s=getchar();
	while(!isdigit(s)) {if(s=='-') f=1;s=getchar();}
	while(isdigit(s)) x=(x<<3)+(x<<1)+s-'0',s=getchar();
	return f?-x:x;
}
int num,n,m,q,a[N],b[N],aa[N],bb[N];
bool dp[N][N];
bool solve(bool k){ //k 1> 0<
	if(aa[1]==bb[1]) return 0;
	memset(dp,0,sizeof(dp));
	dp[1][1]=1;
	for(int i=3;i<=n+m;i++){
		for(int l=max(1,i-m),r=i-l;l<=n&&r>=1;l++,r--){
			if(k){
				if(aa[l]<=bb[r]){
				dp[l][r]=0;
				continue;
				}
			}
			else{
				if(aa[l]>=bb[r]){
					dp[l][r]=0;
					continue;
				}
			}
			if(l>1) dp[l][r]=dp[l][r]||dp[l-1][r];
			if(r>1) dp[l][r]=dp[l][r]||dp[l][r-1];
		}
	}
	return dp[n][m];
}
int ans[100];
signed main(){
	num=read(),n=read(),m=read(),q=read();
	if(num<=7){
		for(int i=1;i<=n;i++) a[i]=read(),aa[i]=a[i];
		for(int j=1;j<=m;j++) b[j]=read(),bb[j]=b[j];
		solve(a[1]>b[1])?ans[1]=1:ans[1]=0;
		for(int i=1;i<=q;i++){
			int dx=read(),dy=read(),x,y;
			for(int j=1;j<=n;j++) aa[j]=a[j];
			for(int j=1;j<=m;j++) bb[j]=b[j];
			for(int j=1;j<=dx;j++){
				x=read(),y=read();
				aa[x]=y;
			}
			for(int j=1;j<=dy;j++){
				x=read(),y=read();
				bb[x]=y;
			}
			solve(aa[1]>bb[1])?ans[i+1]=1:ans[i+1]=0;
		}
		for(int i=1;i<=q+1;i++) printf("%d",ans[i]);
	}
	else{
		for(int i=1;i=q+1;i++) putchar('1');
	}
	return 0;
}

(请忽视i=q+1i=q+1)

正常循环

#include <bits/stdc++.h>
using namespace std;
const int N=2010;
inline int read(){
	int x=0;bool f=0;
	char s=getchar();
	while(!isdigit(s)) {if(s=='-') f=1;s=getchar();}
	while(isdigit(s)) x=(x<<3)+(x<<1)+s-'0',s=getchar();
	return f?-x:x;
}
int num,n,m,q,a[N],b[N],aa[N],bb[N];
bool dp[N][N];
bool solve(bool k){ //k 1> 0<
	if(aa[1]==bb[1]) return 0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			dp[i][j]=0;
		}
	}
	dp[1][1]=1;
	for(int l=1;l<=n;l++){
		for(int r=1;r<=m;r++){
			if(k){
				if(aa[l]<=bb[r]){
					dp[l][r]=0;
					continue;
				}
			}
			else{
				if(aa[l]>=bb[r]){
					dp[l][r]=0;
					continue;
				}
			}
			if(l>1) dp[l][r]=dp[l][r]||dp[l-1][r];
			if(r>1) dp[l][r]=dp[l][r]||dp[l][r-1];
		}
	}
	return dp[n][m];
}
int ans[100];
signed main(){
	num=read(),n=read(),m=read(),q=read();
	if(num<=7){
		for(int i=1;i<=n;i++) a[i]=read(),aa[i]=a[i];
		for(int j=1;j<=m;j++) b[j]=read(),bb[j]=b[j];
		solve(a[1]>b[1])?ans[1]=1:ans[1]=0;
		for(int i=1;i<=q;i++){
			int dx=read(),dy=read(),x,y;
			for(int j=1;j<=n;j++) aa[j]=a[j];
			for(int j=1;j<=m;j++) bb[j]=b[j];
			for(int j=1;j<=dx;j++){
				x=read(),y=read();
				aa[x]=y;
			}
			for(int j=1;j<=dy;j++){
				x=read(),y=read();
				bb[x]=y;
			}
			solve(aa[1]>bb[1])?ans[i+1]=1:ans[i+1]=0;
		}
		for(int i=1;i<=q+1;i++) printf("%d",ans[i]);
	}
	return 0;
}
2023/11/20 13:15
加载中...