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. Phpstorm之快捷键

    常用快捷键 1.ctrl+alt+s 快速打开setting系统设置 2.CTRL+/ 单行注释/取消注释 CTRL+SHIFT+/ 块状注释/取消块状注释 3.方法体上面打入'/**' 再按回车键 ...

  2. webpack之基本使用

    webpack是一个模块打包器(module bundler),webpack视HTML,JS,CSS,图片等文件都是一种 资源 ,每个资源文件都是一个模块(module)文件,webpack就是根据 ...

  3. 基于rsync+sersync的服务器文件同步

    参考:https://github.com/wsgzao/sersync 原理 Synchronize files and folders between servers -using inotiy ...

  4. 2023-05 多校联合训练 HZNU站

    我想要原石 然而,由于提瓦特大陆实在是太大了,游戏中设置了许多传送锚点.众所周知,每个传送锚点附近都有若干个原石(其实并没有),曾经有一位丰富经验的旅行者开辟了 \(n−1\) 条路和 \(n\) 个 ...

  5. .NET Core 锁(Lock)底层原理浅谈

    CPU原子操作 原子操作,指一段逻辑要么全部成功,要么全部失败.概念上类似数据库事物(Transaction). CPU能够保证单条汇编的原子性,但不保证多条汇编的原子性 那么在这种情况下,那么CPU ...

  6. k8s~service和deployment中的spec.selector

    service和deployment中的spec.selector 在 Kubernetes 中,Service 和 Deployment 的 spec.selector 在使用上是有一些不同之处的, ...

  7. 【Linux】CentOS7 远程联机

    # CentOS7 远程联机 哔哩哔哩 萌狼蓝天 博客:https://mllt.cc 微信公众号:萌狼蓝天 检查与安装配置OpenSSH [CentOS7]检查系统是否安装OpenSSH yum - ...

  8. /etc/rancher/k3s/registries.yaml

    mirrors: "192.168.50.3": endpoint: - "https://192.168.50.3"configs: "192.16 ...

  9. IntelliJ IDEA 导入项目后出现非法字符解决方法

    1.Ctrl+Alt+S进入设置页面如图,更改为UTF-8 2.Ctrl+Alt+S进入设置页面如图,在箭头所指的位置填上 -encoding UTF8 3.清除文件中的BOM特殊不可见字符 选择项目 ...

  10. Qt数据库应用18-横向纵向排版

    一.前言 近期用户提了个需求,需要打印一个文档,要求其中部分页横向排版部分页面纵向排版,这个在之前的通用打印导出pdf类中是不具备的,通用的打印导出pdf只能统一设置一个排版方式,要么横向要么纵向,而 ...