BZOJ3532 [Sdoi2014]Lis 【网络流退流】
题目
给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci。请删除若
干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案。
如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。
输入格式
输入包含多组数据。
输入的第一行包含整数T,表示数据组数。接下来4*T行描述每组数据。
每组数据的第一行包含一个整数N,表示A的项数,接下来三行,每行N个整数A1..An,B1.,Bn,C1..Cn,满足1 < =Ai,Bi,Ci < =10^9,且Ci两两不同。
输出格式
对每组数据,输出两行。第一行包含两个整数S,M,依次表示删去项的代价和与数量;接下来一行M个整数,表示删去项在4中的的位置,按升序输出。
输入样例
1
6
3 4 4 2 2 3
2 1 1 1 1 2
6 5 4 3 2 1
输出样例
4 3
2 3 6
解释:删去(A2,43,A6),(A1,A6),(A2,43,44,A5)等都是合法的方案,但
{A2,43,A6)对应的C值的字典序最小。
提示
1 < =N < =700 T < =5
题解
被卡常了,,,
求LIS还是得二分
首先,由经典建模,我们可以求出问题的答案
每个点拆点,代价为权值,然后S向LIS为1的点连边,LIS最大的向T连边
最难的是求方案
割的判定:
对于边(u,v)如果残量网络中不存在任何一条从u到v的增广路,说明(u,v)为割
我们按C从小到大枚举点,如果为割则加入答案
然后要删掉(u,v)这条边,防止对其它点判定的影响
先撤回流量,再置容量为0
撤回流量:
跑一遍T到v的最大流,再跑一遍u到S的最大流
然后就可以A了 才怪,小心卡常
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
#define cls(x) memset(x,0,sizeof(x))
using namespace std;
const int maxn = 1405,maxm = 2000005;
const LL INF = 10000000000000000ll;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int h[maxn],ne = 2;
struct EDGE{int to,nxt; LL f;}ed[maxm];
inline void build(int u,int v,LL f){
ed[ne] = (EDGE){v,h[u],f}; h[u] = ne++;
ed[ne] = (EDGE){u,h[v],0}; h[v] = ne++;
}
int n,A[maxn],B[maxn],C[maxn],id[maxn],m;
LL vis[maxn],d[maxn];
int S,T,oute[maxn],cur[maxn];
inline bool cmp(const int& a,const int& b){
return C[a] < C[b];
}
int f[maxn],bac[maxn];
int find(int x){
int l = 0,r = n,mid;
while (l < r){
mid = l + r + 1 >> 1;
if (bac[mid] < x) l = mid;
else r = mid - 1;
}
return l;
}
void init(){
ne = 2;
n = read(); m = (n << 1 | 1);
for (int i = 0; i <= m; i++) h[i] = 0,bac[i] = INF;
REP(i,n) A[i] = read();
REP(i,n) B[i] = read();
REP(i,n) C[i] = read(),id[i] = i;
sort(id + 1,id + 1 + n,cmp);
S = 0; T = 2 * n + 1;
for (int i = 1; i <= n; i++){
f[i] = max(1,find(A[i]) + 1);
bac[f[i]] = min(bac[f[i]],A[i]);
}
int ans = 0;
for (int i = 1; i <= n; i++) ans = max(ans,f[i]);
for (int i = 1; i <= n; i++){
if (f[i] == 1) build(S,i,INF);
else if (f[i] == ans) build(i + n,T,INF);
oute[i] = ne;
build(i,i + n,B[i]);
for (int j = i + 1; j <= n; j++)
if (f[j] == f[i] + 1 && A[i] < A[j])
build(i + n,j,INF);
}
}
int q[2 * maxn],head,tail;
bool bfs(){
for (int i = 0; i <= m; i++) d[i] = -1;
q[head = tail = 1] = S;
d[S] = 1;
int u;
while (head <= tail){
u = q[head++];
Redge(u) if (ed[k].f && d[to = ed[k].to] == -1){
d[to] = d[u] + 1;
q[++tail] = to;
if (to == T) return true;
}
}
return false;
}
LL dfs(int u,LL minf){
if (u == T || !minf) return minf;
LL flow = 0,f; int to;
if (cur[u] == -1) cur[u] = h[u];
for (int& k = cur[u]; k; k = ed[k].nxt)
if (d[to = ed[k].to] == d[u] + 1 && (f = dfs(to,min(minf,ed[k].f)))){
ed[k].f -= f; ed[k ^ 1].f += f;
minf -= f; flow += f;
if (!minf) break;
}
return flow;
}
LL maxflow(){
LL flow = 0;
while (bfs()){
for (int i = 0; i <= m; i++) cur[i] = -1;
flow += dfs(S,INF);
}
return flow;
}
int ans[maxn],ansi;
void solve(){
printf("%lld ",maxflow());
ansi = 0;
for (int i = 1; i <= n; i++){
int u = id[i];
if (!ed[oute[u]].f){
S = u; T = u + n;
if (bfs()) continue;
ans[++ansi] = u;
S = 2 * n + 1; T = u + n;
maxflow();
S = u; T = 0;
maxflow();
ed[oute[u]].f = ed[oute[u] ^ 1].f = 0;
}
}
printf("%d\n",ansi);
if (ansi){
sort(ans + 1,ans + 1 + ansi);
printf("%d",ans[1]);
for (int i = 2; i <= ansi; i++)
printf(" %d",ans[i]);
puts("");
}
}
int main(){
int t = read();
while (t--){
init();
solve();
}
return 0;
}
BZOJ3532 [Sdoi2014]Lis 【网络流退流】的更多相关文章
- [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流
题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...
- bzoj千题计划141:bzoj3532: [Sdoi2014]Lis
http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...
- 洛谷$P3308\ [SDOI2014]LIS$ 网络流
正解:网络流 解题报告: 传送门$QwQ$ 恩先不考虑关于那个附加属性的限制,考虑这题怎么做? 首先这题从名字开始就让人忍不住联想起网络流24题里的那个最长不下降子序列?于是同样考虑预处理一个$f$呗 ...
- BZOJ3532 : [Sdoi2014]Lis
f[i]表示以i为结尾的LIS长度 对于所有f[i]=1的,由S向i连边 对于所有f[i]=maxf的,由i向T连边 对于j<i,a[j]<a[i],且f[j]+1=f[i]的,j向i连边 ...
- BZOJ 3532: [Sdoi2014]Lis (最大流)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532 题意:给出三个数列ABC,长度均为n.删除A中的某些数字,使得A的最长上升子 ...
- 【BZOJ-3532】Lis 最小割 + 退流
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 704 Solved: 264[Submit][Status] ...
- BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)
BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...
- P3308 [SDOI2014]LIS(最小割+退流)
传送门 设\(f[i]\)为以\(i\)结尾的最长上升子序列.可以考虑建这样一张图,对于所有的\(i<j,f[j]=f[i+1]\)连边\((i,j)\),\(f[i]=1\)的话连边\((S, ...
- 【bzoj3532】 Sdoi2014—Lis
http://www.lydsy.com/JudgeOnline/problem.php?id=3532 (题目链接) 题意 给出$n$个数的数列,三个值$a[i],b[i],c[i]$.将其中一些数 ...
随机推荐
- JavaEE汇总
1.简述Spring. a) Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,其目的是解决企业应用开发的复杂性,能够使用基本的JavaBean代替EJB,并提供了 ...
- Jenkins默认工作空间及更改默认工作空间
1.Jenkins安装到tomcat 需2步: ①官网下载Jenkins(一个war包) ②安装 所谓安装,也有两种形式: 一是在安装了jdk的情况下直接运行:java -jar jenkins.wa ...
- synchronized关键字修饰非静态方法与静态方法的区别
这里我们先创建ObjLock类,并实现Runnable接口.并创建一个Demo类,具有被synchronized关键字修饰的非静态方法与静态方法. 非静态方法 public class ObjLock ...
- C# DateTime.Now函数
// 2008年4月24日 System.DateTime.Now.ToString( " D " );// 2008-4-24 System.DateTime.Now.ToStr ...
- ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) : 第一次设置MySQL也适用
[MySQL的安装环境]:windows7 64位 [MySQL的版本]:mysql-8.0.16-winx64 [错误描述]: ERROR 2003 (HY000): Can't connect t ...
- vue父子传值的具体应用
最近我负责的项目已经迭代到第四版了,我作为一个没啥经验的小菜鸟也成长了很多. 在这一版开发开始之前,我老大就要求我在开发过程中尽量实现组件化,因此,我也遇到了很多问题,但基本都解决了,所以趁周末把这些 ...
- Python使用三种方法实现PCA算法[转]
主成分分析(PCA) vs 多元判别式分析(MDA) PCA和MDA都是线性变换的方法,二者关系密切.在PCA中,我们寻找数据集中最大化方差的成分,在MDA中,我们对类间最大散布的方向更感兴趣. 一句 ...
- vba练习资料
链接:https://pan.baidu.com/s/1E0e58rZ_3QCCorWNM-ehSA 提取码:jluf
- 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼
离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...
- django-ckeditor添加代码功能(codesnippet)
最近做了一个博客,使用python3+django2.1开发的,后台编辑器和前端显示用的Django-ckeditor富文本编辑器,由于发现没有代码块功能,写上去的代码在前端展示有点乱,于是一顿问度娘 ...