社区讨论

奇葩dp循环挂分NOIP2023T3

题目总版参与者 2已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lp6gfmd0
此快照首次捕获于
2023/11/20 13:16
2 年前
此快照最后确认于
2023/11/21 22:53
2 年前
查看原帖
CPP
#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
CPP
#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;
}

回复

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

正在加载回复...