社区讨论

WA on #10,#11,#13,下载数据本地测试发现答案无误,求调

P2766最长不下降子序列问题参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhjdhuc6
此快照首次捕获于
2025/11/04 00:47
4 个月前
此快照最后确认于
2025/11/04 00:47
4 个月前
查看原帖
如题,WA 79pts,下载#10数据后发现输出无误:

怀疑是 Windows 和 Linux 系统差异问题。
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF deep[0]
const int N=10000;
inline int read(){
  register int temp1=0,temp2=1;
  register char temp3=getchar();
  while(temp3<48||temp3>'9'){
    if(temp3=='-') temp2=-1;
    temp3=getchar();
  }
  while(temp3>47&&temp3<='9'){
    temp1=temp1*10+temp3-48;
    temp3=getchar();
  }
  return temp1*temp2;
}
inline void write(int x) {
  static int sta[65];
  register int top=0;
  if(x<0) putchar('-'),x=-x;
  do{
    sta[top++]=x%10,x/=10;
  }while(x);
  while(top) putchar(sta[--top]+48);
}
struct edge{
	int v,w;
	edge(){}
	edge(int a,int b){v=a,w=b;}
}e[200005];
int n,m,s,t;
int he[502],nxt[200005],cnt=-1,dp[502],a[502],maxs;
void addedge(int u,int v,int w){
	e[++cnt]=edge(v,w),nxt[cnt]=he[u],he[u]=cnt;
}
int deep[502],sta[502];
bool bfs(int s,int t){
	memset(deep,127,sizeof(deep));
	deep[s]=1,sta[s]=he[s];
	queue<int>q;
	q.push(s);
	while(!q.empty()){
		int now=q.front();
		q.pop();
		for(int i=he[now];~i;i=nxt[i]){
			if(e[i].w>0&&deep[e[i].v]==INF){
				sta[e[i].v]=he[e[i].v],deep[e[i].v]=deep[now]+1;
				q.push(e[i].v);
				if(e[i].v==t) return true;
			}
		}
	}
	return false;
}
int dfs(int pos,int flow){
	if(pos==t) return flow;
	int sum=0;
	for(int i=sta[pos];(~i)&&flow>0;i=nxt[i]){
		sta[pos]=i;
		if(e[i].w>0&&(deep[pos]+1==deep[e[i].v])){
			int f=dfs(e[i].v,min(flow,e[i].w));
			if(!f) deep[e[i].v]=INF;
			e[i].w-=f,e[i^1].w+=f;
			flow-=f,sum+=f;
		}
	}
	return sum;
}
int dinic(int s,int t){
	int ans=0;
	while(bfs(s,t)) ans+=dfs(s,INF);
	return ans;
}
signed main(){
	n=read();
	if(n==1){
		printf("1\n1\n1");
		return 0;
	}
	for(int i=1;i<=n;i++) a[i]=read(),dp[i]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[j]<=a[i]){
				dp[i]=max(dp[i],dp[j]+1);
			}
		}
		maxs=max(maxs,dp[i]);
	}
	write(maxs),putchar('\n');
	if(maxs==1){
		printf("%d\n%d",n,n);
		return 0;
	}
	memset(he,-1,sizeof(he));
	s=2*n+1,t=2*n+2;
	for(int i=1;i<=n;i++){
		if(dp[i]==1) addedge(s,i,1),addedge(i,s,0);
		if(dp[i]==maxs) addedge(i+n,t,1),addedge(t+n,i,0);
		addedge(i,i+n,1),addedge(i+n,i,0);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[j]<=a[i]&&dp[j]+1==dp[i]){
				addedge(j+n,i,1),addedge(i,j+n,0);
			}
		}
	}
	int flow=dinic(s,t);
	write(flow),putchar('\n');
	addedge(s,1,INF),addedge(1,s,0),addedge(1,1+n,INF),addedge(1+n,1,0);
	if(dp[n]==maxs) addedge(2*n,t,INF),addedge(t,2*n,0),addedge(n,2*n,INF),addedge(2*n,n,0);
	flow+=dinic(s,t);
	write(flow);
    return 0;
}

回复

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

正在加载回复...