da32s1da @ 2018-03-31 11:00:45
样例过,机子上跑没T,与题解拍了几个500的大数据也没T,luogu评测时发现进入mxflow()后就会TLE。
求大佬改正!!
#include<bits/stdc++.h>
#define INF 0x33333333
#define N 2000
using namespace std;
int n,mm;
struct edge{int to,cap,rev;};
vector<edge>g[N],G[N];
int level[N],iter[N];
int a[N],mx[N];
inline void rad(int &noi)
{
bool mark=false;
static char ch;
while(ch=getchar(),ch<'0'||ch>'9') if(ch=='-') mark=true;
noi=ch-'0';
while(ch=getchar(),ch<='9'&&ch>='0') noi=(noi<<3)+(noi<<1)+ch-'0';
if(mark) noi=-noi;
}
void add(int from,int to,int cap){
g[from].push_back((edge){to,cap,g[to].size()});
g[to].push_back((edge){from,0,g[from].size()-1});
}
void ADD(int from,int to,int cap){
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,0,G[from].size()-1});
}
void bfs(int s){
memset(level,-1,sizeof(level));
queue<int>q;
level[s]=0;
q.push(s);
while(!q.empty()){
int r=q.front();q.pop();
for(int i=0;i<g[r].size();i++){
edge &p=g[r][i];
if(p.cap>0&&level[p.to]<0){
level[p.to]=level[r]+1;
q.push(p.to);
}
}
}
}
int dfs(int v,int t,int f){
if(v==t) return f;
for(int &i=iter[v];i<g[v].size();i++){
edge &p=g[v][i];
if(p.cap>0&&level[p.to]==level[v]+1){
int d=dfs(p.to,t,min(f,p.cap));
if(d>0){
p.cap-=d;
g[p.to][p.rev].cap+=d;
return d;
}
}
}
}
void mxflow(int s,int t){
int flow=0;
for(;;){
bfs(s);
if(level[t]<0) {cout<<flow<<endl;return;}
memset(iter,0,sizeof(iter));
int f;
while((f=dfs(s,t,INF))>0)
flow+=f;
}
}
void BFS(int s){
memset(level,-1,sizeof(level));
queue<int>q;
level[s]=0;
q.push(s);
while(!q.empty()){
int r=q.front();q.pop();
for(int i=0;i<G[r].size();i++){
edge &p=G[r][i];
if(p.cap>0&&level[p.to]<0){
level[p.to]=level[r]+1;
q.push(p.to);
}
}
}
}
int DFS(int v,int t,int f){
if(v==t) return f;
for(int &i=iter[v];i<G[v].size();i++){
edge &p=G[v][i];
if(p.cap>0&&level[p.to]==level[v]+1){
int d=DFS(p.to,t,min(f,p.cap));
if(d>0){
p.cap-=d;
G[p.to][p.rev].cap+=d;
return d;
}
}
}
}
void MXFLOW(int s,int t){
int flow=0;
for(;;){
BFS(s);
if(level[t]<0) {cout<<flow<<endl;return;}
memset(iter,0,sizeof(iter));
int f;
while((f=DFS(s,t,INF))>0)
flow+=f;
}
}
int main()
{
cin>>n;int s=1,t=2*n+2;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[i]>=a[j]) mx[i]=max(mx[i],mx[j]+1);
for(int i=1;i<=n;i++)
mx[i]++,mm=max(mm,mx[i]);
cout<<mm<<endl;
for(int i=1;i<=n;i++){
if(mx[i]==1) add(s,i+1,1);
if(mx[i]==mm) add(i+n+1,t,1);
add(i+1,i+n+1,1);
for(int j=1;j<i;j++)
if(a[i]>=a[j]&&mx[i]==mx[j]+1)
add(j+n+1,i+1,1);
}
mxflow(s,t);
for(int i=1;i<=n;i++){
if(mx[i]==1) ADD(s,i+1,1);
if(mx[i]==mm) ADD(i+n+1,t,1);
ADD(i+1,i+n+1,1);
for(int j=1;j<i;j++)
if(a[i]>=a[j]&&mx[i]==mx[j]+1)
ADD(j+n+1,i+1,1);
}
ADD(s,2,INF);
ADD(2,2+n,INF);
if(mx[n]==mm) ADD(n+1,2*n+1,INF),ADD(n*2+1,t,INF);
MXFLOW(s,t);
return 0;
}
by da32s1da @ 2018-03-31 14:59:06
搞定了。。。
32次提交,前22次TLE,第32次Ac。。