题意

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. CP防火墙使用命令批量创建对象和策略

    Step1:批量创建网络对象 使用mgmt_cli 命令批量创建host对象,注意该命令需要管理员账号和密码 mgmt_cli add host name Host_10.133.1.100 ip-a ...

  2. 【Ubuntu】查看端口占用及关闭

    1.查看已连接的服务端口 (ESTABLISHED) netstat有一个快捷键[ss] netstat -a ss -a 2.查看所有的服务端口(LISTEN,ESTABLISHED) netsta ...

  3. 安装OpenSsh8.1+LibreSSL 3.0.2(ssh升级)

    zlib下载地址: http://www.zlib.net/ LibreSSL下载地址: https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/ OpenSSH下载 ...

  4. 记录我的 python 学习历程-Day11 两个被忽视的坑、补充知识点、函数名的应用、新版格式化输出、迭代器

    补充知识点 函数形参中默认参数的陷阱 针对不可变数据类型,它是没有陷阱的 def func(name, sex='男'): print(name) print(sex) func('Dylan') # ...

  5. [梁山好汉说IT] 如何理解脑裂问题

    [梁山好汉说IT] 如何理解脑裂问题 这个系列是通过梁山好汉的例子来阐述一些IT概念. 1. 问题描述 Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群.每个子集群都选出 ...

  6. POJ - 3177 Redundant Paths 说说连通分量吧

    ----我想说说双联通分量还有割点和桥 1.割点(一个点,如果没有这一个点,图就会变得不连通) 2.桥(一条边,断开这条边就会让图不连通) 3.点双连通(没割点的图) 4.边双连通(没桥的图) 5.割 ...

  7. selenium自动化之xpath定位*必会技能*

    相信写过ui自动化,对xpath定位感觉会特别亲戚,那么下面给大家分享些我们常常在写脚本时易忽略的一些小细节和技巧.首先使用xpath定位时切忌 不要使用带有空格的属性 不要使用自动生成的id.cla ...

  8. 1032 挖掘机技术哪家强 (20 分)C语言

    题目描述 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入描述: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每 ...

  9. Python 愤怒的小鸟代码实现:物理引擎pymunk使用

    游戏介绍 最近比较忙,周末正好有时间写了python版本的愤怒的小鸟,使用了物理引擎pymunk,图片资源是从github上下载的,实现了一个可玩的简单版本. 功能实现如下: 支持小鸟类型:红色小鸟, ...

  10. Nginx流量复制

    1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...