[集训]dance
题意
思考
显然能转化为最小割模型。若没有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的更多相关文章
- QDEZ集训笔记【更新中】
这是一个绝妙的比喻,如果青岛二中的台阶上每级站一只平度一中的猫,差不多站满了吧 自己的理解 [2016-12-31] [主席树] http://www.cnblogs.com/candy99/p/61 ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- Malek Dance Club(递推)
Malek Dance Club time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...
- BZOJ-1305 dance跳舞 建图+最大流+二分判定
跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...
- UVA 1291 十四 Dance Dance Revolution
Dance Dance Revolution Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- UVALive 4222 Dance 模拟题
Dance 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...
- 2015UESTC 暑假集训总结
day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...
- JS省队集训记
不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...
随机推荐
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
- 【Linux】Terminal中输入一行命令快速移动光标至行首行尾
Linux: ①快速移动光标至行首 Home或Ctrl+A ②快速移动光标至行尾 End或Ctrl+E ③从光标处开始删除,直到行尾 Ctrl+K ④到下一行 Ctrl+N 或 方向键:↓ ⑤到上一行 ...
- 魅族--魅蓝metal
评论:金属潮流平民化
- lumen 笔记一
可以用config()函数和evn()函数来获取 .evn里面的配置内容 config('app.timezone') 获取配置config(['app.timezone' => 'China/ ...
- 浅析 Nginx 网络事件
Nginx 是一个事件驱动的框架,所谓事件主要指的是网络事件,Nginx 每个网络连接会对应两个网络事件,一个读事件一个写事件.在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时,需要 ...
- 互联网 Java 工程师进阶知识完全扫盲
互联网 Java 工程师进阶知识完全扫盲:https://github.com/doocs/advanced-java
- IntelliJ IDEA使用说明
1.IntelliJ IDEA简介: IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提 ...
- HTTP 安全头配置
在本篇中,我将介绍常用的安全头信息设置,并对每个响应头设置给出一个示例. HTTP安全头说明 Content-Security-Policy 内容安全策略(CSP)常用来通过指定允许加载哪些资源来防止 ...
- HTML和JavaScript代码分离、平稳退化(1)
使用的编辑器是Hbuilder,浏览器是Chrome. HTML和JavaScript代码分离,会使得修改网页功能和代码的阅读与维护会轻松的许多,不用在DOM中阅读大量的JavaScript代码. 文 ...
- $Poj2083/AcWing118\ Fractal$ 模拟
$AcWing$ $Sol$ 一年前做过差不多的南蛮图腾,当时做出来还是很有成就感的$OvO$ $N<=7$,就是模拟模拟,预处理一下,$over$ $Code$ #include<bit ...