【51nod】2564 格子染色

这道题原来是网络流……

感觉我网络流水平不行……

这种只有两种选择的可以源点向该点连一条容量为b的边,该点向汇点连一条容量为w的边,如果割掉了b证明选w,如果割掉了w证明选b

那么\(p\)的限制怎么加呢,新建一个点\(i'\),然后\(i\)往\(i'\)流一条容量为\(p\)的边

\(i'\)再向所有不合法的\(j\)连一条容量为正无穷的边,这样如果\(i\)选了\(b\),\(j\)选了\(w\),会有水流从\(i\rightarrow i' \rightarrow j\)

由于\(n^2\)的边太多了,我们用可持久化线段树优化建图可以改成\(O(n \log n)\)

最后的答案是每个点黑白价值的和减去最大流

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next,cap;
}E[MAXN * 10];
int head[MAXN],sumE = 1;
int N,S,T;
int dis[MAXN],Ncnt,cur[MAXN];
int a[5005],b[5005],w[5005],l[5005],r[5005],p[5005];
int val[5005],tot;
queue<int> Q;
void add(int u,int v,int c) {
E[++sumE].to = v;
E[sumE].cap = c;
E[sumE].next = head[u];
head[u] = sumE;
}
void addtwo(int u,int v,int c) {
add(u,v,c);add(v,u,0);
}
bool BFS() {
memset(dis,0,sizeof(dis));
while(!Q.empty()) Q.pop();
dis[S] = 1;
Q.push(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(!dis[v] && E[i].cap > 0) {
dis[v] = dis[u] + 1;
if(v == T) return true;
Q.push(v);
}
}
}
return false;
}
int dfs(int u,int aug) {
if(u == T) return aug;
for(int &i = cur[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(E[i].cap && dis[v] == dis[u] + 1) {
int t = dfs(v,min(aug,E[i].cap));
if(t) {
E[i].cap -= t;
E[i ^ 1].cap += t;
return t;
}
}
}
return 0;
}
int Dinic() {
int res = 0;
while(BFS()) {
for(int i = 1 ; i <= Ncnt ; ++i) cur[i] = head[i];
while(int d = dfs(S,0x7fffffff)) res += d;
}
return res;
}
int lc[MAXN],rc[MAXN],rt[5005],nw;
void Insert(int x,int &y,int l,int r,int pos,int v) {
y = ++Ncnt;
addtwo(y,x,2e9);
lc[y] = lc[x];rc[y] = rc[x];
if(l == r) {addtwo(y,v,2e9);return;}
int mid = (l + r) >> 1;
if(pos <= mid) {
Insert(lc[x],lc[y],l,mid,pos,v);
addtwo(y,lc[y],2e9);
}
else {
Insert(rc[x],rc[y],mid + 1,r,pos,v);
addtwo(y,rc[y],2e9);
}
}
void addE(int y,int l,int r,int ql,int qr) {
if(!y) return;
if(l == ql && qr == r) {addtwo(nw,y,2e9);return;}
int mid = (l + r) >> 1;
if(qr <= mid) addE(lc[y],l,mid,ql,qr);
else if(ql > mid) addE(rc[y],mid + 1,r,ql,qr);
else {addE(lc[y],l,mid,ql,mid);addE(rc[y],mid + 1,r,mid + 1,qr);}
}
void Solve() {
read(N);S = N + 1;T = N + 2;Ncnt = N + 2;
int res = 0;
for(int i = 1 ; i <= N ; ++i) {
read(a[i]);read(b[i]);read(w[i]);read(l[i]);read(r[i]);read(p[i]);
addtwo(S,i,b[i]);addtwo(i,T,w[i]);
res += w[i] + b[i];
val[++tot] = a[i];
}
sort(val + 1,val + tot + 1);
tot = unique(val + 1,val + tot + 1) - val - 1;
for(int i = 1 ; i <= N ; ++i) {
nw = ++Ncnt;
addtwo(i,nw,p[i]);
int s = lower_bound(val + 1,val + tot + 1,l[i]) - val;
int t = upper_bound(val + 1,val + tot + 1,r[i]) - val - 1;
if(s <= t) addE(rt[i - 1],1,tot,s,t);
s = lower_bound(val + 1,val + tot + 1,a[i]) - val;
Insert(rt[i - 1],rt[i],1,tot,s,i);
}
res -= Dinic();
out(res);enter;
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【51nod】2564 格子染色的更多相关文章

  1. Codevs 1744 格子染色==BZOJ 1296 粉刷匠

    1744 格子染色  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有 n 条木板需要被粉 ...

  2. 【51nod】1655 染色问题

    题解 首先每个颜色出现的次数应该是一样的 \(\frac{C_{n}^{2}}{n} = \frac{n - 1}{2}\) 所以n如果是偶数那么就无解了 然后我们需要让每个点连颜色不同的四条边 只要 ...

  3. 51nod 1448 二染色问题 (逆向考虑)

    题目: 注意,这题不是把一块区域的黑翻成白.白翻成黑. 是把一块区域全部翻成白或者翻成黑. 初始为全白,看能否翻出题中的情况. 我们假设翻转若干次能得到图中的形状,那么我们找出最后一次的翻转,即全W或 ...

  4. 【51nod 1824】染色游戏

    题目 有 n 个红球, m 个蓝球,从中取出 x 个红球和 y 个蓝球排成一排的得分是 rx⋅by ,其中 r0=b0=1 . 定义 f(t) 表示恰好取出 t 个球排成一排的所有可能局面的得分之和. ...

  5. 1050 棋盘染色 2 - Wikioi

    题目描述 Description 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入描述 Input Description 第一行一个 ...

  6. MT【241】红蓝两色染色

    用红蓝两色给$3*3$的格子染色,要求每行每列每种颜色都有,则不同的染色方法_____ 分析:按红色格子数分类,1)红色3或者6个有6种.2)红色4或者5个有45种.故一共有2*(6+45)=102种 ...

  7. poj1681 Painter's Problem(高斯消元法,染色问题)

    题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次?  ...

  8. [CodeVs1050]棋盘染色2(状态压缩DP)

    题目大意:有一个5*N(≤100)的棋盘,棋盘中的一些格子已经被染成了黑色,求最少对多少格子染色,所有的黑色能连成一块. 这题卡了我1h,写了2.6k的代码,清明作业一坨还没做啊...之前一直以为这题 ...

  9. 牛客网 提高组第8周 T1 染色

    染色 链接: https://ac.nowcoder.com/acm/contest/176/A 来源:牛客网 题目描述 \(\tt{fizzydavid}\)和\(\tt{leo}\)有\(n\)个 ...

随机推荐

  1. c++ 容器切片反转次序(拷贝到新容器)

    code: // rotate_copy algorithm example #include <iostream> // cout #include <algorithm> ...

  2. Matlab下imwrite,Uint16的深度图像

    Matlab下imwrite,Uint16的深度图像 1. 在Matlab命令窗口输入命令: help imwrite 会有如下解释: If the input array is of class u ...

  3. Protocol Buffers学习笔记

    Protocol Buffers学习笔记 1. 简介 Protocol Buffers是google发明的一种数据交换格式,独立于语言,独立于平台.与其他的数据交换格式有所不同,Protocol Bu ...

  4. 安装windows下安装mysql

    参考文档:https://www.cnblogs.com/reyinever/p/8551977.html  https://www.jb51.net/article/151213.htm 首先下载m ...

  5. django 后台静态文件不显示

    原文链接 https://my.oschina.net/VASKS/blog/874270 django admin svg 不显示.后台显示 xx.svg 200 但浏览器就是不显示. 百度了一圈, ...

  6. Mac下持续集成-与JMeter与Ant执行后自动发送邮件的整合+定时任务

    mac定时任务的开启: Last login: Tue Aug 13 22:49:54 on ttys004 (base) localhost:~ ligaijiang$ sudo launchctl ...

  7. python笔记5 接口类抽象类 封装 反射 设计模式 模块 :random随机数 josn shelve持久化存储

    接口类抽象类 接口类:接口类就是制定一个规则,让其他人按照我的规则去写程序. #!/usr/bin/env python from abc import ABCMeta,abstractmethod ...

  8. 实用的在线预览数据字典的工具(php编写)

    前言 无论是刚接手新项目,或者是维护老项目,有一个方便的数据字典可用是最棒哒! 本文是我为了方便使用数据字典而写的代码. 代码无版权,随便使用. 拷贝代码后,只需修改数据库名,主机,用户名,密码,开箱 ...

  9. 图解 HTTP 笔记(五)——Web 服务器

    该章的主要内容是讲解与 HTTP 协作的 Web 服务器 一.用单台虚拟主机实现多个域名 基于虚拟主机的功能,可以只使用一台物理机实现多个域名的网站部署. 在互联网上,域名通过 DNS 域名解析系统可 ...

  10. JAVA 基础编程练习题41 【程序 41 猴子分桃】

    41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...