题目链接

戳我

\(Solution\)

题目为什么是\(a\ +\ b\ Problem\)啊?这和题面半毛钱关系都没有。

现在来讲一下这题的解法吧,我们首先看看没有奇怪的方格这一个条件吧.

其实没有这个条件还是很简单的,就只要将每个点连向原点表示选流量为\(B\)表示选黑色的,在将这个点连向汇点流量为\(W\)表示选白色的,跑一遍最小割就好了

现在来看看有奇怪的方格这一个条件吧,我们可以对于每个节点\(i\)新建一个节点\(i'\),我们将每个\(i\)连向\(i'\)流量为\(P\),在对于满足奇怪方格限制的\(j\),将\(i'\)相\(j\)连一条流量为\(inf\)的边再跑最小割就好了

但是这一题明显不是这么简单就好了,观察数据范围,发现这\(n^2\)的连边是过不去的.所以我们应该想想优化,至于怎么优化用一个主席树就好了.

\(Code\)

#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
struct node{
int to,next,v;
}a[1000010];
int head[500010],cnt,n,m,s,t,x,y,z,dep[85010];
void add(int x,int y,int c){
a[++cnt].to=y,a[cnt].next=head[x],a[cnt].v=c,head[x]=cnt;
a[++cnt].to=x,a[cnt].next=head[y],a[cnt].v=0,head[y]=cnt;
}
queue<int> q;
int bfs(){
memset(dep,0,sizeof(dep));
q.push(s),dep[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=head[now];i;i=a[i].next){
int v=a[i].to;
if(!dep[v]&&a[i].v>0)
dep[v]=dep[now]+1,q.push(v);
}
}
if(dep[t])
return 1;
return 0;
}
int dfs(int k,int list){
if(k==t||!list)
return list;
for(int i=head[k];i;i=a[i].next){
int v=a[i].to;
if(dep[v]==dep[k]+1&&a[i].v>0){
int p=dfs(v,min(list,a[i].v));
if(p){
a[i].v-=p;
if(i&1) a[i+1].v+=p;
else a[i-1].v+=p;
return p;
}
}
}
dep[k]=0;
return 0;
}
int Dinic(){
int ans=0,k;
while(bfs()){
while((k=dfs(s,inf)))
ans+=k;
}
return ans;
}
struct node1{
int l,r;
}tree[1000010];
int tot,goal;
void update(int &k,int f,int l,int r,int c){
k=++tot;
tree[k]=tree[f];
if(l==r){
add(k+t,goal,inf);
if(f) add(k+t,f+t,inf);
return ;
}
int mid=(l+r)>>1;
if(c<=mid) update(tree[k].l,tree[f].l,l,mid,c);
else update(tree[k].r,tree[f].r,mid+1,r,c);
if(tree[k].l) add(k+t,tree[k].l+t,inf);
if(tree[k].r) add(k+t,tree[k].r+t,inf);
}
void insert(int k,int l,int r,int L,int R) {
if(L>r||l>R) return;
if(L<=l&&r<=R) {
add(n+goal,t+k,inf);
return;
}
int mid=(l+r)>>1;
if(tree[k].l) insert(tree[k].l, l, mid, L,R);
if(tree[k].r) insert(tree[k].r, mid+1,r,L,R);
}
int A[5011],B,W,L[5011],R[5011],P,sum,o[100010];
int len,rt,p;
main(){
n=read(),s=0,t=n*2+1;
for(int i=1;i<=n;i++){
A[i]=read(),B=read(),W=read(),L[i]=read(),R[i]=read(),P=read(),sum+=B+W;
add(s,i,B),add(i,t,W),add(i,i+n,P),o[++len]=A[i],o[++len]=L[i],o[++len]=R[i];
}
sort(o+1,o+len+1);
len=unique(o+1,o+len+1)-o-1;
for (int i=1;i<=n;++i){
goal=i;
A[i]=lower_bound(o+1,o+len+1,A[i])-o;
L[i]=lower_bound(o+1,o+len+1,L[i])-o;
R[i]=lower_bound(o+1,o+len+1,R[i])-o;
insert(p,1,len,L[i],R[i]);
update(rt,p,1,len,A[i]);
p=rt;
}
printf("%d\n",sum-Dinic());
}

「BZOJ 3218」 a + b Problem的更多相关文章

  1. 「BZOJ 4228」Tibbar的后花园

    「BZOJ 4228」Tibbar的后花园 Please contact lydsy2012@163.com! 警告 解题思路 可以证明最终的图中所有点的度数都 \(< 3\) ,且不存在环长是 ...

  2. 「BZOJ 3645」小朋友与二叉树

    「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...

  3. 「BZOJ 4502」串

    「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...

  4. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

  5. 「BZOJ 2534」 L - gap字符串

    「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...

  6. 「BZOJ 2956」模积和

    「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...

  7. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  8. 「BZOJ 1001」狼抓兔子

    题目链接 luogu bzoj \(Solution\) 这个貌似没有什么好讲的吧,直接按照这个给的图建图就好了啊,没有什么脑子,但是几点要注意的: 建双向边啊. 要这么写,中间还要写一个\(whil ...

  9. 「BZOJ 5188」「Usaco2018 Jan」MooTube

    题目链接 luogu bzoj \(Describe\) 有一个\(n\)个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你\(Q\)个询问,问你与点\(v\)的距离大于等 ...

随机推荐

  1. Composer安装使用

    Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 1.下载 2.安装成功 3.配置地址 4.安装代码库 镜像 配置json

  2. microtime() 测试代码执行时间,提高编码效率

    <?php $b_time = microtime(true); $a = array("); $count = ; foreach ($a as $key => $value) ...

  3. Linux学习笔记 -- 目录与文件的管理

    目录结构 Linux的目录结构为树状结构,最顶级的目录为根目录 “/”. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什么是. 绝对路径与相对路径 绝 ...

  4. unicode gbk 转换函数

    typedef unsigned short WCHAR; //字库信息结构体定义 //用来保存字库基本信息,地址,大小等 __packed typedef struct { u8 fontok; / ...

  5. MFC调试的几个技巧

    TCHAR pStr[] = _T("this is a test!"); void* p = (void*)pStr; TRACE(_T("pStr is %s\n&q ...

  6. python web指纹获取加目录扫描加端口扫描加判断robots.txt

    前言: 总结上几次的信息收集构造出来的. 0x01: 首先今行web指纹识别,然后在进行robots是否存在.后面是目录扫描 然后到使用nmap命令扫描端口.(nmap模块在windows下使用会报停 ...

  7. python学习——练习题(2)

    """ 题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元 ...

  8. 玩转angularJs——通过自定义ng-model,不仅仅只是input可以实现双向数据绑定

    体验更优排版请移步原文:http://blog.kwin.wang/programming/angularJs-user-defined-ngmodel.html angularJs双向绑定特性在开发 ...

  9. angularJS笔记之过滤器

    angular的过滤器用法: 1.模板中使用 {{expression|filter}} 也可以多个filter连用 {{expression|filter1|filter2|...}} filter ...

  10. java多线程编程核心技术-笔记

    一.第一章 1.自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程2.当多个线程去访问一个局部变量是会产 ...