题意

http://uoj.ac/problem/77


思考

显然能转化为最小割模型。若没有pi的代价,则对于第i个格子,可以让源点连向第i个点,容量为黑色收益,再连向汇点,容量为白色收益。再考虑pi的代价,对1~n的每个点新建一个哨兵节点,并向它连容量为pi的边。若前面存在点j落在当前区间中,再将哨兵节点连向点j,容量为正无穷。

但这样边数达到O(n^2)级别,不能接受。

发现哨兵节点所连的边对于ai来说都是一个连续的区间,可用主席树优化建图,边数将为O(nlogn)级别。


代码

 #pragma GCC optimize 2
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll inf=INT_MAX;
int n;
int head[*+],size=;
int dfn[*],S,T;
int what[],tmp[],Last[];
ll valBoy[],valGirl[],a[],l[],r[],p[];
struct edge
{
int to,next;
ll w;
}E[*+];
inline ll max(ll x,ll y)
{
return x>y?x:y;
}
inline ll min(ll x,ll y)
{
return x<y?x:y;
}
inline void addEdge(int u,int v,ll w)
{
E[++size].to=v;
E[size].next=head[u];
E[size].w=w;
head[u]=size;
}
inline void add(int u,int v,ll w)
{
addEdge(u,v,w);
addEdge(v,u,);
}
bool bfs()
{
memset(dfn,-,sizeof(dfn));
queue<int>Q;
Q.push(S);
dfn[S]=;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(dfn[v]!=-||E[i].w==)
continue;
dfn[v]=dfn[u]+;
Q.push(v);
}
}
return dfn[T]!=-;
}
ll dinic(int u,ll up)
{
if(u==T)
return up;
ll sum=;
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(dfn[v]!=dfn[u]+||E[i].w==)
continue;
ll g=dinic(v,min(E[i].w,up-sum));
E[i].w-=g;
E[i^].w+=g;
sum+=g;
if(g==)
dfn[v]=-;
if(sum==up)
break;
}
return sum;
}
struct czyTree
{
int t[*],cur,root[],son[*][];
int tot;
void addPos(int pos,int l,int r,int&num,int pre,int from)
{
num=++tot;
son[num][]=son[pre][],son[num][]=son[pre][];
if(l==r)
{
add(num+T,from,inf);
if(Last[pos])
add(num+T,Last[pos]+T,inf);
Last[pos]=num;
return;
}
int mid=(l+r)>>;
if(pos<=mid)
addPos(pos,l,mid,son[num][],son[pre][],from);
else
addPos(pos,mid+,r,son[num][],son[pre][],from);
if(son[num][])
add(num+T,son[num][]+T,inf);
if(son[num][])
add(num+T,son[num][]+T,inf);
}
void addS(int L,int R,int l,int r,int num,int from)
{
if(!num)
return;
if(L<=l&&r<=R)
{
add(from,num+T,inf);
return;
}
int mid=(l+r)>>;
if(R<=mid)
addS(L,R,l,mid,son[num][],from);
else if(mid<L)
addS(L,R,mid+,r,son[num][],from);
else
addS(L,R,l,mid,son[num][],from),addS(L,R,mid+,r,son[num][],from);
}
}Tree;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
int tot=;
for(int i=;i<=n;++i)
{
cin>>a[i]>>valBoy[i]>>valGirl[i]>>l[i]>>r[i]>>p[i];
tmp[++tot]=a[i];
}
sort(tmp+,tmp+tot+);
// tot=unique(tmp+1,tmp+tot+1)-tmp-1;
S=,T=*n+;
for(int i=;i<=n;++i)
{
add(S,i,valBoy[i]);
add(i,T,valGirl[i]);
add(i,i+n,p[i]);
}
for(int i=;i<=n;++i)
{
int L=,R=tot;
while(tmp[L]<l[i]&&L<=tot)
++L;
while(r[i]<tmp[R]&&R)
--R;
Tree.addS(L,R,,tot,Tree.root[i-],i+n);
Tree.addPos(lower_bound(tmp+,tmp+tot+,a[i])-tmp,,tot,Tree.root[i],Tree.root[i-],i);
}
ll ans=;
while(bfs())
ans+=dinic(S,inf);
for(int i=;i<=n;++i)
ans-=valBoy[i]+valGirl[i];
cout<<-ans<<endl;
return ;
}

细节

如下图所示,若此题使用dinic,左右两个建图方式是不等价的,且左图是正确的,右图是错误的,并且右图的最小割结果会变小。(假设有很多蓝色边)

事实上,哨兵节点连出的边必须连在左边一排点上。

考虑下图所示情况。在dinic中,若先走了红色路径,则无法经过蓝色路径。原因是蓝色正无穷边此时不存在反向边,蓝色路径不连通。这样,最小割就少了一些流量。

此外,在主席树建图中,要注意相同ai的点要连向前一个相同ai的点。

(CORRECTED BY CZY)

[集训]dance的更多相关文章

  1. QDEZ集训笔记【更新中】

    这是一个绝妙的比喻,如果青岛二中的台阶上每级站一只平度一中的猫,差不多站满了吧 自己的理解 [2016-12-31] [主席树] http://www.cnblogs.com/candy99/p/61 ...

  2. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  3. Malek Dance Club(递推)

    Malek Dance Club time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  4. iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合

    1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...

  5. BZOJ-1305 dance跳舞 建图+最大流+二分判定

    跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...

  6. UVA 1291 十四 Dance Dance Revolution

    Dance Dance Revolution Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  7. UVALive 4222 Dance 模拟题

    Dance 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...

  8. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  9. JS省队集训记

    不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...

随机推荐

  1. UI 素材相关收集

    图标素材收藏网址  阿里:iconfont.cn 图片压缩:https://tinypng.com/ gif动图压缩:https://tool.gifhome.com

  2. 【Linux】Mac好用虚拟机 Parallels Desktop、FinalShell-多终端连接工具(支持Windows,macOS,Linux)

    一.Mac好用虚拟机 Parallels Desktop 1.下载安装: 2.新建虚拟机: 3.配置管理: 二.FinalShell-多终端连接工具(支持Windows,macOS,Linux) 1. ...

  3. Liquibase 使用(全)

    聊一个数据库脚本的版本工具 Liquibase,官网在这里 ,初次看到,挺神奇的,数据库脚本也可以有版本管理,同类型的工具还有 flyway . 开发过程经常会有表结构和变更,让运维来维护的话,通常会 ...

  4. C# 字符串与二进制的相互转换

    /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name="s"></para ...

  5. iptables详细参数讲解

    table 表 --> chain 链 --->rule 规则Commands:Either long or short options are allowed. --append -A ...

  6. vc++简单的vector动态数组实现

    #ifndef __MYVECTOR__ #define __MYVECTOR__ #include <Windows.h> #define SUCCESS 1 // 成功 #define ...

  7. java通过freemarker模板导出pdf

    需求:将网页内容导出为pdf文件,其中包含文字,图片,echarts图 原理:利用freemarker模板与数据渲染所得到的html内容,通过ITextRenderer对象解析html内容生成pdf ...

  8. 【原创】(十五)Linux内存管理之RMAP

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  9. AntDesign getFieldDecorator 获取自定义组件的值

    AntDesign getFieldDecorator 获取自定义组件的值 1.自定义或第三方的表单控件,也可以与 Form 组件一起使用.只要该组件遵循以下的约定: (1)提供受控属性 value ...

  10. POJ 2456 Aggressive cows (二分)

    题目传送门 POJ 2456 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) s ...