社区讨论
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
怀疑是 Windows 和 Linux 系统差异问题。
#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 条回复,欢迎继续交流。
正在加载回复...