01Sequence:比较板的差分约束,但有一个很妙的转化。

朴素差分约束

设 \(x_i\) 表示第 \(i\) 位的前缀和。

我们要最小化 \(1\) 的个数,就要求最小解,就要求最长路。因为约束条件都是大于等于号,所以求最长路才能满足所有条件。求最大解也是同理。

我们可以对于每一个条件,列出如下不等式:

\[x_b \ge x_{a-1}+c
\]
\[x_{i} \ge x_{i+1}-1
\]
\[x_{i+1} \ge x_i+0
\]

显然我们跑一遍 spfa 最长路即可求解。

时间复杂度最劣 \(O(n^2)\),容易被卡。

优化差分约束

我们考虑正难则反,把制约必须使用 spfa 的负权边化为正权边,就能跑 dijkstra 了。

设 \(x_i\) 表示第 \(i\) 位的 \(0\) 的个数的前缀和。

于是我们要求最大解,也就是最短路。

不等式如下:

\[x_b \le x_{a-1}+(b-a+1)-c
\]
\[x_{i+1} \le x_{i}+1
\]
\[x_i \le x_{i+1}+0
\]

这样就可以跑 dijkstra 了。

时间复杂度 \(O(n \log n)\)。

用 dijkstra 或者缩点拓扑来优化差分约束的 spfa 是很常用的优化,一定要掌握。因为他们的本质都是求最短路或最长路,差分约束只是一种思想而已。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,m,d[200005];
bitset<200005>vis;
vector<pi>g[200005];
priority_queue<pi,vector<pi>,greater<pi> >q;
void dijkstra(int s)
{
memset(d,0x3f,sizeof(d));
vis.reset();
q.push({0,s});
d[s]=0;
while(!q.empty())
{
auto y=q.top();
q.pop();
int u=y.se;
if(vis[u])continue;
vis[u]=1;
for(auto ed:g[u])
{
int v=ed.fi,w=ed.se;
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
q.push({d[v],v});
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
g[a-1].push_back({b,b-a+1-c});
}
for(int i=0;i<n;i++)
{
g[i+1].push_back({i,0});
g[i].push_back({i+1,1});
}
dijkstra(0);
for(int i=1;i<=n;i++)cout<<(1-(d[i]-d[i-1]))<<" ";
return 0;
}

这题还可以上线段树贪心,也是比较容易的做法。

Atcoder ABC216G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]的更多相关文章

  1. Codeforces Gym 100015G Guessing Game 差分约束

    Guessing Game 题目连接: http://codeforces.com/gym/100015/attachments Description Jaehyun has two lists o ...

  2. poj 1201 Intervals(差分约束)

    题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...

  3. POJ 3167 Layout(差分约束)

    题面 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  4. 【POJ1275】Cashier Employment 差分约束

    [POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...

  5. POJ - 3169 差分约束

    题意:n头牛,按照编号从左到右排列,两头牛可能在一起,接着有一些关系表示第a头牛与第b头牛相隔最多与最少的距离,最后求出第一头牛与最后一头牛的最大距离是多少,如         果最大距离无限大则输出 ...

  6. zoj4028 LIS,差分约束

    题意:给你以i为结尾的最长上升子序列的值,和每个值的区间范围求可行的a[i] 题解:差分约束,首先满足l[i]<=a[i]<=r[i],可以建一个虚拟节点n+1,那么有a[n+1]-a[i ...

  7. [SCOI2008]天平 差分约束

    ---题面--- 题解: 差分约束学得实在是太烂了,,,,QAQ 这里先记下: a - b >= x  ---> a >= b + x     ---->        b - ...

  8. POJ3159:Candies(差分约束)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 39666   Accepted: 11168 题目链接:h ...

  9. 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)

    裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...

  10. 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)

    看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...

随机推荐

  1. 基于docker的常用服务搭建

    使用docker搭建相关服务: 1. MySQL服务 1) 拉取镜像 docker pull mysql:5.7 # 拉取 mysql 5.7 docker pull mysql # 拉取最新版mys ...

  2. 全网最详细的Spring入门教程

    为什么用Spring 什么是Spring Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性. Spring的一个最大的目的就是使JAVA EE开发更加 ...

  3. taro 编译报:模块引入顺序不一致报错

    前情 最近在开发一个小程序项目,基于公司的技术栈是React,于是使用Taro来开发小程序. 坑位 在开发中经常性的报类似如下的错误,大致意思是说你引入模块的顺序在不同模块中不一致 Why? 主要是m ...

  4. python多版本

    1.分别下载并安装两个版本的python 2.去安装的文件夹中将python.exe 和pythonw.exe改名加上版本号 3.将python.exe文件目录和当前目录下的Scripts目录都加到用 ...

  5. 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)

    问题分析 int selectDeviceMonthRepairCount(String deviceType, String month); <select id="selectDe ...

  6. 使用 Docker Compose 安装 MongoDB

    最近学习 Docker ,试着在 Docker 里安装 MongoDB,按照镜像 mongo 文档一顿操作猛如虎. 快速开始 写个 docker-compose.yml 文件: version: '3 ...

  7. shell 获取 目录名 当前目录名

    Four ways to extract the current directory name By  Sergio Gonzalez Duran on November 06, 2007 (9:00 ...

  8. Qt音视频开发15-动态切换解码内核的设计

    一.前言 动态切换解码内核这个需求也是源自客户的真实需求,既然是动态切换,那肯定是运行期间切换,而不是通过改变标志位重新编译程序来切换,最开始做的就是这种方式,这样就是实现起来简单,但是用起来不够方便 ...

  9. 【杂谈】Kafka的日志段为什么不用内存映射?

    什么是内存映射(Memory-Mapped File)? 内存映射(mmap)是一种将文件内容映射到内存中的技术,应用程序可以像操作内存一样对文件内容进行读写,而不需要显式地进行磁盘 I/O 操作.修 ...

  10. vs2017 iisexpress 绑定自定义域名

    1.项目根目录找到 项目/.vs/config/applicationhost.config 2.添加绑定域名 <site name="demo" id="2&qu ...