社区讨论

蒟蒻TLE 60求卡常

P3308[SDOI2014] LIS参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo3azgjh
此快照首次捕获于
2023/10/24 03:41
2 年前
此快照最后确认于
2023/10/24 03:41
2 年前
查看原帖
rt,有没有巨佬能给蒟蒻提供一下卡常技巧啊。。。
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long

#define rep(i,a,b) for(int i=a;i<=b;i++)

const int N=2e3+10;
unordered_map<int,int> to[N],copier[N];
int n,m,s,t;
int dep[N];
queue<int> q;
bool bfs(){
    for(int i=1;i<=n*2+2;i++)dep[i]=0;
    q.push(s);
    dep[s]=1;
    while(!q.empty()){
        auto u=q.front();q.pop();
        for(auto& [v,w]:to[u]){
            if(w&&!dep[v]){
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }return dep[t];
}
bool spc_bfs(int f,int T){
    for(int i=1;i<=n*2+2;i++)dep[i]=0;
    q.push(f);
    dep[f]=1;
    while(!q.empty()){
        auto u=q.front();q.pop();
        for(auto& [v,w]:to[u]){
            if(w&&!dep[v]){
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }return dep[T];
}
int dfs(int u,int fl){
    if(u==t)return fl;
    int out=0;
    for(auto& [v,w]:to[u]){if(!fl)break;
        if(w&&dep[v]==dep[u]+1){
            int fw=dfs(v,min(w,fl));
            to[u][v]-=fw;
            to[v][u]+=fw;
            fl-=fw; 
            out+=fw;
        }
    }
    return out;
}
int dinic(){
    int ans=0;
    while(bfs())ans+=dfs(s,1e18);
    return ans;
}
int a[N],b[N],c[N],f[N];
vector<int> yxls,ansl;
void slove(){
    yxls.clear();ansl.clear();
    cin>>n;
    rep(i,1,n*2+2)to[i].clear();
    rep(i,1,n)cin>>a[i];
    rep(i,1,n)cin>>b[i];
    rep(i,1,n)cin>>c[i];
    rep(i,1,n)f[i]=0;
    rep(i,1,n){
        rep(j,1,i-1){
            if(a[j]<a[i])f[i]=max(f[i],f[j]+1);
        }f[i]=max(f[i],1ll);
    }
    int maxn=0;
    rep(i,1,n)maxn=max(maxn,f[i]);
    s=2*n+1,t=2*n+2;
    rep(i,1,n){
        if(f[i]==1){
            to[s][i]=1e18;
        }
        if(f[i]==maxn){
            to[i+n][t]=1e18;
        }
        to[i][i+n]=b[i];
        rep(j,1,i-1){
            if(a[j]<a[i]&&f[i]==f[j]+1){
                to[j+n][i]=1e18;
            }
        }
    }
    rep(i,1,n*2+2)copier[i]=to[i];
    int wa=dinic();
    rep(i,1,n)yxls.push_back(i);
    sort(yxls.begin(),yxls.end(),[](int a,int b){return c[a]<c[b];});
    int qzh=0;
    for(auto i:yxls){
        bool rsl=spc_bfs(i,i+n);
        if(!rsl){
            ansl.push_back(i);
            qzh+=b[i];
            rep(i,1,n*2+2)to[i]=copier[i];
            to[i][i+n]=0;
            copier[i][i+n]=0;
            dinic();
        }
    }
    cout<<qzh<<' '<<(int)ansl.size()<<'\n';
    sort(ansl.begin(),ansl.end());
    for(auto i:ansl)cout<<i<<' ';cout<<'\n';
}
signed main(){
	ios::sync_with_stdio(0);
    int t;cin>>t;
    while(t--)slove();
}

回复

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

正在加载回复...