【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 ...
随机推荐
-
043医疗项目-模块四:采购单模块—采购单明细查询(Dao,Service,Action三层)
前一篇文章我们做的是在医院的角度上添加在采购单里面添加药品.这一篇文章是查看我们添加的采购单信息. 我们先看一下要实现的效果:当: 按下确认添加时,会在这里 显示出刚才添加的数据. 好,我们就来做这个 ...
- win7开防火墙,允许别人远程
-
MyBatis与Hibernate对比
一.相同点 都屏蔽 jdbc api 的底层访问细节,使用我们不用与 jdbc api 打交道,就可以访问数据. jdbc api 编程流程固定,还将 sql 语句与 java 代码混杂在了一起,经常 ...
-
RHEL6.4记录一次添加一块新分区的操作
首先看了下挂载点及目录 fdisk /dev/sda [root@box ~]# fdisk /dev/sda WARNING: DOS-compatible mode is deprecated. ...
-
彻底卸载网易UU网游加速器的方法
昨天跟朋友一起玩游戏,网速感觉不怎么好就下了一个免费的网易UU加速器来给对战平台加速,结果加速了以后网速更差,我晕,于是想卸载,可这个加速器口只有一个exe文件,不用安装,但在第一次加速时记得安装了一 ...
-
ZeroBraneStudio之支持GBK文件编码
费了好大劲终于搞定了让ZBS支持打开GBK文件了.记录下过程: 看源码发现ZBS打开文件时会调用src\editor\commands.lua中的LoadFile函数,代码如下: local file ...
-
转载:遇到BITMAP CONVERSION TO ROWIDS 后解决与思考
今天遇到一个案例,有点价值写下来,以后多看看 SQL: select t.order_id, t.spec_name, t.staff_code, t.staff_code as xxbStaffCo ...
-
2018年12月份GitHub上最热门的Java开源项目
来自:开源最前线(ID:OpenSourceTop) 链接:https://www.itcodemonkey.com/article/12747.html 又到了公布 GitHub 上热门项目的时候啦 ...
-
Nest.js WebSocket
Docs: https://docs.nestjs.com/websockets/gateways λ yarn add @nestjs/websockets λ nest g ga events e ...
-
linux上单网卡配置使用多个IP地址
准备一台红帽系列的linux(例如rhel.red hat.centos.fredora等) 方法/步骤 新建配置文件. 首先说明一下规则: 新建配置文件,配置文件名称为ifcfg-适配器名称:0-2 ...