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连边

将每个点拆点求最小割

对于字典序最小,

按C从小到大排序,

对于C第i小的点,将b减去$2^{-i}$

最后最小总代价为最大流的整数部分+1

方案的二进制表示为1-最大流的小数部分

用高精度二进制,压62位

#include<cstdio>
#include<algorithm>
typedef long long ll;
const int N=1410,BIT=12;
const ll MOD=(1LL<<62)-1;
struct Num{
int x;ll ex[BIT];
Num(){for(int i=x=0;i<BIT;i++)ex[i]=0;}
Num(int _x){
for(int i=0;i<BIT;i++)ex[i]=0;
x=_x;
}
Num(int _x,int y){
for(int i=0;i<BIT;i++)ex[i]=0;
x=_x;
ex[y/62]=1LL<<(61-y%62);
}
Num operator+(Num b){
Num c;
c.x=x+b.x;
for(int i=0;i<BIT;i++)c.ex[i]=ex[i]+b.ex[i];
for(int i=BIT-1;i;i--)if(c.ex[i]>MOD)c.ex[i-1]++,c.ex[i]&=MOD;
if(c.ex[0]>MOD)c.x++,c.ex[0]&=MOD;
return c;
}
Num operator-(Num b){
Num c;
c.x=x-b.x;
for(int i=0;i<BIT;i++)c.ex[i]=ex[i]-b.ex[i];
for(int i=BIT-1;i;i--)if(c.ex[i]<0)c.ex[i-1]--,c.ex[i]+=MOD+1;
if(c.ex[0]<0)c.x--,c.ex[0]+=MOD+1;
return c;
}
void operator+=(Num b){*this=*this+b;}
void operator-=(Num b){*this=*this-b;}
bool operator<(Num b){
if(x!=b.x)return x<b.x;
for(int i=0;i<BIT;i++)if(ex[i]!=b.ex[i])return ex[i]<b.ex[i];
return 0;
}
bool operator==(Num b){
if(x!=b.x)return 0;
for(int i=0;i<BIT;i++)if(ex[i]!=b.ex[i])return 0;
return 1;
}
}inf,maxflow,zero,tmp;
int Test,n,i,j,S,T,h[N],gap[N],f[N],maxf,cnt,flag;
struct edge{int t;Num f;edge *nxt,*pair;}*g[N],*d[N];
struct Point{int a,b,c,id;bool del;}val[N];
bool cmp1(Point a,Point b){return a.c<b.c;}
bool cmp2(Point a,Point b){return a.id<b.id;}
inline Num min(Num a,Num b){return a<b?a:b;}
inline void add(int s,int t,Num f){
edge *p=new(edge);p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
p=new(edge);p->t=s;p->nxt=g[t];
g[t]=p;g[s]->pair=g[t];g[t]->pair=g[s];
}
Num sap(int v,Num flow){
if(v==T)return flow;
Num rec;
for(edge *p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&zero<p->f){
Num ret=sap(p->t,min(flow-rec,p->f));
p->f-=ret;p->pair->f+=ret;d[v]=p;
rec+=ret;
if(rec==flow)return flow;
}
d[v]=g[v];
if(!(--gap[h[v]]))h[S]=T;
gap[++h[v]]++;
return rec;
}
void work(){
scanf("%d",&n);
S=n*2+1;T=S+1;
for(i=1;i<=T;i++)g[i]=NULL,gap[i]=h[i]=0;
for(i=1;i<=n;i++)scanf("%d",&val[i].a),val[i].id=i,val[i].del=0;
for(i=1;i<=n;i++)scanf("%d",&val[i].b);
for(i=1;i<=n;i++)scanf("%d",&val[i].c);
maxf=0;
for(i=1;i<=n;i++){
f[i]=1;
for(j=1;j<i;j++)if(val[j].a<val[i].a&&f[i]<f[j]+1)f[i]=f[j]+1;
for(j=1;j<i;j++)if(val[j].a<val[i].a&&f[i]==f[j]+1)add(j*2,i*2-1,inf);
if(maxf<f[i])maxf=f[i];
}
for(i=1;i<=n;i++){
if(f[i]==1)add(S,i*2-1,inf);
if(f[i]==maxf)add(i*2,T,inf);
}
std::sort(val+1,val+n+1,cmp1);
for(i=1;i<=n;i++)add(val[i].id*2-1,val[i].id*2,Num(val[i].b)-Num(0,i-1));
maxflow=Num();
for(gap[i=0]=T;i++<T;)d[i]=g[i];
while(h[S]<T)maxflow+=sap(S,inf);
tmp=Num(maxflow.x+1)-maxflow;
for(i=cnt=0;i<n;i++)if(tmp.ex[i/62]&(1LL<<(61-i%62)))val[i+1].del=1,cnt++;
printf("%d %d\n",maxflow.x+1,cnt);
std::sort(val+1,val+n+1,cmp2);
for(i=1,flag=0;i<=n;i++)if(val[i].del)printf(flag?" %d":"%d",i),flag=1;
puts("");
}
int main(){
inf.x=~0U>>2;
for(i=0;i<BIT;i++)inf.ex[i]=MOD;
zero=Num();
scanf("%d",&Test);
while(Test--)work();
return 0;
}

  

BZOJ3532 : [Sdoi2014]Lis的更多相关文章

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

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

  2. [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流

    题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...

  3. BZOJ3532 [Sdoi2014]Lis 【网络流退流】

    题目 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序 ...

  4. 【BZOJ-3532】Lis 最小割 + 退流

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 704  Solved: 264[Submit][Status] ...

  5. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  6. 【bzoj3532】 Sdoi2014—Lis

    http://www.lydsy.com/JudgeOnline/problem.php?id=3532 (题目链接) 题意 给出$n$个数的数列,三个值$a[i],b[i],c[i]$.将其中一些数 ...

  7. BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)

    BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...

  8. [SDOI2014]LIS

    这道题还是非常好的 首先第一问可以让我们联想到某网络流二十四题里的一道题,发现建图方式应该和这道题差不多啊 所以首先跑一遍\(dp\),求出\(dp[i]\)表示\(i\)位置结束的\(LIS\)长度 ...

  9. BZOJ 3532: [Sdoi2014]Lis (最大流)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532 题意:给出三个数列ABC,长度均为n.删除A中的某些数字,使得A的最长上升子 ...

随机推荐

  1. Unity模型导入的若干问题

    原地址:http://tieba.baidu.com/p/2807225555 我觉得有三点感觉在导出时比较重要的1.单位的设置3dsmax系统单位设置就设成厘米显示单位公制也设成厘米这样在max里的 ...

  2. C++中的memset()函数 ------------转自:http://www.360doc.com/content/10/1006/18/1704901_58866679.shtml

    memset()函数可以对大内存的分配进行很方便的操作(初始化),所谓“初始化”,当然是指将你定义的变量或申请的空间赋予你所期望的值,例如语句int i=0;就表明定义了一个变量i,并初始化为0:如果 ...

  3. 影像工作站的数据库安装错误之Win7系统下pg服务无法启动

    1.关闭批处理 2.修改 PG安装路径下的Data文件下的pg_hba.conf文件中去掉IPv6的井号,如下图 3.结束pg进程 4.重启PG服务.

  4. 发个题目坑 二模03day1

    1.数列(seq2.pas/c/cpp) 题目描述 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.给定 A ...

  5. nc 常用命令

    nc(NetCat),在网络工具中有”瑞士军刀”的美誉,它短小精悍,功能强大,下面分享一些我平时经常用到的功能,更多的功能请google之. 1.基本参数想要连接到某处: nc [-options] ...

  6. 【SpringMVC】SpringMVC系列15之SpringMVC最佳实践

    15.SpringMVC最佳实践 15.1.遵循Restful API最佳实践 参考:http://segmentfault.com/a/1190000002949234 15.2.统一返回字段 15 ...

  7. Coin Change

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  8. MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

    背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.1 ...

  9. Windows系统时间同步出错解决办法

    有时候我们设置本地时间与Internet时间同步时,经常连接服务器time.windows.com超时,导致时间同步失败,解决办法如下: 利用快捷键"Win+R"调出运行框,输入: ...

  10. 17.Python笔记之memcached&redis

    作者:刘耀 博客:www.liuyao.me 博客园:www.cnblogs.com/liu-yao 一.Memcached 1.介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动 ...