【Nowcoder71E】组一组(差分约束,最短路)
【Nowcoder71E】组一组(差分约束,最短路)
题面
题解
看到二进制显然就直接拆位,那么区间的按位或和按位与转成前缀和之后,可以写成两个前缀和的值的差的大小关系,那么直接差分约束就好了。
注意几个细节,首先相等是要两侧都要连边,不要直连了一侧;然后这题卡常,所以对于区间内全是一的情况,处理出哪些位置确定是一,然后求个前缀和,直接从\(0\)连过去,这样子可以优化大量时间。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,A[MAX],dis[MAX],d[MAX];
int L[MAX],R[MAX],X[MAX],O[MAX];
struct Line{int v,next,w;}e[MAX*5];
int h[MAX],cnt=1;
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
bool vis[MAX];
void SPFA()
{
queue<int> Q;for(int i=0;i<=n;++i)dis[i]=-1e9;
Q.push(0);dis[0]=0;vis[0]=true;
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
if(dis[e[i].v]<dis[u]+e[i].w)
{
dis[e[i].v]=dis[u]+e[i].w;
if(!vis[e[i].v])vis[e[i].v]=true,Q.push(e[i].v);
}
vis[u]=false;
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)O[i]=read(),L[i]=read(),R[i]=read(),X[i]=read();
for(int i=0;i<20;++i)
{
for(int j=0;j<=n;++j)h[j]=d[j]=0;cnt=1;
for(int j=1;j<=m;++j)
if(O[j]==1)
{
if(X[j]&(1<<i))Add(L[j]-1,R[j],1);
else Add(L[j]-1,R[j],0),Add(R[j],L[j]-1,0);
}
else
{
if(X[j]&(1<<i))Add(L[j]-1,R[j],R[j]-L[j]+1),Add(R[j],L[j]-1,-R[j]+L[j]-1),++d[L[j]],--d[R[j]+1];
else Add(R[j],L[j]-1,L[j]-R[j]);
}
for(int j=1;j<=n;++j)Add(j-1,j,0);
for(int j=1;j<=n;++j)Add(j,j-1,-1);
for(int j=1;j<=n;++j)d[j]+=d[j-1];
for(int j=1;j<=n;++j)if(d[j])d[j]=1;
for(int j=1;j<=n;++j)d[j]+=d[j-1];
for(int j=1;j<=n;++j)Add(0,j,d[j]);
SPFA();
for(int j=1;j<=n;++j)A[j]|=(dis[j]-dis[j-1])*(1<<i);
}
for(int i=1;i<=n;++i)printf("%d ",A[i]);puts("");
return 0;
}
【Nowcoder71E】组一组(差分约束,最短路)的更多相关文章
- 牛客Wannafly9E 组一组 差分约束
正解:差分约束 解题报告: 传送门! 首先肯定要想到把他们分开来考虑,就是说,把数二进制拆分掉,这样就可以分开考虑了嘛 然后考虑设f[i]:前i个数中的1的个数 然后就可以得到一堆差分约束的式子 然后 ...
- POJ 3159 Candies(差分约束+最短路)题解
题意:给a b c要求,b拿的比a拿的多但是不超过c,问你所有人最多差多少 思路:在最短路专题应该能看出来是差分约束,条件是b - a <= c,也就是满足b <= a + c,和spfa ...
- POJ 3169 Layout(差分约束+最短路)题解
题意:有一串数字1~n,按顺序排序,给两种要求,一是给定u,v保证pos[v] - pos[u] <= w:二是给定u,v保证pos[v] - pos[u] >= w.求pos[n] - ...
- [CCPC2019 哈尔滨] A. Artful Paintings - 差分约束,最短路
Description 给 \(N\) 个格子区间涂色,有两类限制条件 区间 \([L,R]\) 内至少 \(K\) 个 区间 \([L,R]\) 外至少 \(K\) 个 求最少要涂多少个格子 Sol ...
- Layout---poj3169(差分约束+最短路spfa)
题目链接:http://poj.org/problem?id=3169 有n头牛站成一排 在他们之间有一些牛的关系比较好,所以彼此之间的距离不超过一定距离:也有一些关系不好的牛,希望彼此之间的距离大于 ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
- 【牛客网71E】 组一组(差分约束,拆位)
传送门 NowCoder Solution 考虑一下看到这种区间或与区间与的关系,拆一下位. 令\(s_i\)表示前缀和,则: 那么如果现在考虑到了第\(i\)为,有如下4种可能: \(opt=1\) ...
- 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】
在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
随机推荐
- mysql常用命令行操作(二):表和库的操作、引擎、聚合函数
一.查看.创建.删除数据库 create database library default character set utf8 collate utf8_general_ci; # 创建数据库并设置 ...
- 使用json读写文件中的数据
把json的数据写入到文件中 import json with open('data.json','w+') as f: json.dump({"name":"张彪&qu ...
- Laravel 获取 Route Parameters (路由参数) 的 5 种方法
Laravel 获取路由参数的方式有很多,并且有个小坑,汇总如下. 假设我们设置了一个路由参数: 现在我们访问 http://test.dev/1/2 在 TestController ...
- keras中TimeDistributed的用法
TimeDistributed这个层还是比较难理解的.事实上通过这个层我们可以实现从二维像三维的过渡,甚至通过这个层的包装,我们可以实现图像分类视频分类的转化. 考虑一批32个样本,其中每个样本是一个 ...
- python爬虫之正则表达式
一.简介 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念 ...
- Delphi 限制Edit输入 多个例子
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [ '.',#8]) then ...
- jdbc 接口的用法 Statement和PreparedStatement的区别!
package cn.zhouzhou; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Resu ...
- Windows上安装 TensorFlow及简单命令
1.官网及帮助文档 官网: https://www.tensorflow.org/install/install_windows 中文帮助文档:https://efeiefei.gitbooks.io ...
- Windows & RabbitMQ:Shovel
RabbitMQ的集群和高可用不适合跨域的情况,如果跨域可以使用Shovel或Federation. 描述:我们需要配置三台服务器:ServerA, ServerB, ServerC Step 1:安 ...
- 【python练习题】程序1
#题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? count = 0 for i in range(1,5): for j in range(1,5): for k ...