WA on #32
比答案少一
挺形象的,看了半天也没看出来哪里挂了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <ctime>
#define N 5001
#define M 5000001
#define INF 0x3f3f3f3f
using namespace std;
int n,pcnt,a[N],p[N][4],mp1[100010],mp2[7];
int tot=1,S,T,s,t,mcmf,head[N<<3],cur[N<<3],vis[N<<3],dis[N<<3];
struct Node { int to,nxt,dis,val; }e[M<<1];
void add(int u,int v,int w,int k) { e[++tot]=Node{v,head[u],w,k},head[u]=tot; }
bool SPFA() {
memcpy(cur,head,sizeof head);
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
queue<int> q; q.push(S); dis[S]=0;
while (!q.empty()) {
int u=q.front(); q.pop();
vis[u]=0;
for (int i=head[u];i;i=e[i].nxt) {
int v=e[i].to;
if (e[i].dis and dis[v]>dis[u]+e[i].val) {
dis[v]=dis[u]+e[i].val;
if (!vis[v]) q.push(v),vis[v]=1;
}
}
}
return dis[T]!=INF;
}
int dfs(int u,int flow) {
if (u==T) return flow;
int res=0; vis[u]=1;
for (int i=cur[u];i and flow;i=e[i].nxt) {
int v=e[i].to; cur[u]=i;
if (e[i].dis and dis[v]==dis[u]+e[i].val and !vis[v]) {
int k=dfs(v,min(flow,e[i].dis));
e[i].dis-=k,e[i^1].dis+=k,res+=k,flow-=k,mcmf+=k*e[i].val;
}
}
vis[u]=0; return res;
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",a+i);
S=++pcnt,s=++pcnt; add(S,s,2,0),add(s,S,0,0);
for (int i=1;i<=n;i++) p[i][0]=++pcnt,p[i][1]=++pcnt,p[i][2]=++pcnt,p[i][3]=++pcnt;
t=++pcnt,T=++pcnt; add(t,T,2,0),add(T,t,0,0);
for (int i=1;i<=n;i++) {
add(s,p[i][0],1,0),add(p[i][0],s,0,0);
add(p[i][0],p[i][1],1,-1),add(p[i][1],p[i][0],0,1);
add(p[i][2],p[i][0],INF,0),add(p[i][0],p[i][2],0,0);
add(p[i][3],p[i][0],INF,0),add(p[i][0],p[i][3],0,0);
add(p[i][1],t,1,0),add(t,p[i][1],0,0);
if (mp1[a[i]]) add(p[mp1[a[i]]][2],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]]][2],0,0);
if (mp2[a[i]%7]) {
add(p[mp2[a[i]%7]][1],p[i][3],INF,0),add(p[i][3],p[mp2[a[i]%7]][1],0,0);
add(p[mp2[a[i]%7]][3],p[i][3],INF,0),add(p[i][3],p[mp2[a[i]%7]][3],0,0);
}
if (mp1[a[i]-1]) add(p[mp1[a[i]-1]][1],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]-1]][1],0,0);
if (mp1[a[i]+1]) add(p[mp1[a[i]+1]][1],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]+1]][1],0,0);
mp1[a[i]]=i,mp2[a[i]%7]=i;
}
int ans=0;
while (SPFA()) ans+=dfs(S,INF);
// printf("%d\n",ans);
printf("%d\n",-mcmf);
return 0;
}