正题

题目链接:https://www.luogu.com.cn/problem/P3308


题目大意

三个nnn个数字的序列A,B,CA,B,CA,B,C。要求删除其中某些位置iii使得AAA的最长上升子序列至少减少111且删去位置BBB的权值和最小的情况下满足删去位置的CCC值升序排序后字典序最小。


解题思路

首先BBB值最小很好求,跑一遍LISLISLIS的dpdpdp,然后每个点拆成两个点,然后如果f[x]f[x]f[x]转移到f[y]f[y]f[y]是最优的就建边然后跑最小割就好了。
大体和P2766 最长不下降子序列问题差不多

也就是现在我们要求字典序最小的最小割,需要利用到最小割的性质。

如果一条边x,yx,yx,y是可行割,那么它满足在残量网络上xxx到达不了yyy。

首先如果x−>yx->yx−>y没有满流那么肯定不是最小割,其次如果满流了但是还有一条xxx到yyy的路径,那么证明如果走这条增广路一定可以使最大流更大,所以也不是最小割。

那么这样我们就可以判断一条边是否可行了,然后需要消去其他等价边的影响,大体方法是从TTT到yyy跑一次dinicdinicdinic,再从xxx到SSS跑一次dinicdinicdinic。这个操作叫退流,这样残量网络就变成了满流边x−>yx->yx−>y的残量网络了。

先跑一次dinicdinicdinic,然后按照CCC值排序,从小到大判断加入边即可。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
using namespace std;
const ll N=710*2,inf=1e18;
struct node{ll to,next,w;
}a[N*N];
ll T,n,tot,ls[N],dep[N],A[N],B[N],C[N],f[N],p[N];
vector<ll> prt;queue<ll> q;
void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
bool bfs(ll s,ll t){while(!q.empty())q.pop();q.push(s);memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty()){ll x=q.front();q.pop();for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dep[y]||!a[i].w)continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;
}
ll dinic(ll x,ll t,ll flow){if(x==t)return flow;ll rest=0,k;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,t,min(flow-rest,a[i].w)));a[i].w-=k;a[i^1].w+=k;if(rest==flow)return flow;}if(!rest)dep[x]=0;return rest;
}
bool cmp(ll x,ll y)
{return C[x]<C[y];}
signed main()
{scanf("%lld",&T);while(T--){memset(ls,0,sizeof(ls));tot=1;scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&A[i]);for(ll i=1;i<=n;i++)scanf("%lld",&B[i]);for(ll i=1;i<=n;i++)scanf("%lld",&C[i]);ll maxs=0,s=2*n+1,t=s+1;for(ll i=1;i<=n;i++){f[i]=1;p[i]=i;for(ll j=1;j<i;j++)if(A[i]>A[j])f[i]=max(f[i],f[j]+1);maxs=max(maxs,f[i]);}for(ll i=1;i<=n;i++){if(f[i]==1)addl(s,i,inf);if(f[i]==maxs)addl(i+n,t,inf);addl(i,i+n,B[i]);for(ll j=i+1;j<=n;j++)if(A[i]<A[j]&&f[i]+1==f[j])addl(i+n,j,inf);}ll ans=0;prt.clear();while(bfs(s,t))ans+=dinic(s,t,inf);printf("%lld ",ans);sort(p+1,p+1+n,cmp);for(ll i=1;i<=n;i++){ll x=p[i];if(bfs(x,x+n))continue;while(bfs(t,x+n))dinic(t,x+n,inf);while(bfs(x,s))dinic(x,s,inf);prt.push_back(x);}printf("%lld\n",prt.size());sort(prt.begin(),prt.end());for(ll i=0;i<prt.size();i++)printf("%lld ",prt[i]);putchar('\n');}return 0;
}

P3308-[SDOI2014]LIS【最小割】相关推荐

  1. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis

    http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...

  2. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  3. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  4. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  5. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  6. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  7. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  8. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

  9. 最小割 ---- 集合冲突模型

    集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...

最新文章

  1. Ubuntu 18.04 固件的烧录方法
  2. 年中盘点:2020年炙手可热的10家数据科学和机器学习初创公司
  3. linux samba 空目录,linux Samba搭建
  4. python中importlib模块安装_importlib模块
  5. python统计图原理_AB测试原理及样本量计算的Python实现
  6. mac版python安装pandas_Mac OS 安装pandas
  7. gitlab 开源项目 星_Docker实战之Gitlab搭建
  8. Java的正则表达式
  9. 渗透测试入门23之OSCP渗透测试认证经验分享
  10. android stop 服务,当调用stopService方法时服务不会停止
  11. Using的三种使用方法
  12. 信息系统项目管理师考前建议
  13. mactxt文件如何转换成html,最佳的用于Mac上的PDF文件转换到HTML文件的转换器
  14. python+sklearn实现决策树模型
  15. win10+NVIDIA GTX 960M+CUDA 8.0+cudnn6.0+tensorflow安装
  16. android车机蓝牙,安卓APP通过蓝牙串口模块控制DSP车机收音机
  17. RFID仓库管理解决方案-RFID智能仓储-RFID智能仓储-新导智能
  18. 摩拜单车的“黑科技”
  19. 基于51单片机数字频率计的设计与实现
  20. bootstrap和css样式兼容(ie、360、qq)不同浏览器的解决办法

热门文章

  1. 互联网加大赛历届作品_匠心筑梦 ——家具漆服务系统2020年度涂装大赛成功举办...
  2. navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库
  3. java文件调用脚本_Java中调用文件中所有bat脚本
  4. 评价的等级优良差_满意程度等级划分
  5. mysql如何和qt连接使用_Qt5学习:连接MySQL数据库
  6. 上传文件白名单_十大常见web漏洞——文件上传漏洞
  7. python frame用法_python—dataframe用法
  8. krc 编辑 linux,Linux网络编程
  9. labuladong 的算法小抄_关于算法笔试的几个套路,一点就透
  10. Java使用TCP实现群聊 聊天室(多线程和tcp的使用)