社区讨论
蒟蒻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 条回复,欢迎继续交流。
正在加载回复...