wannafly 挑战赛9 E 组一组 (差分约束)
链接:https://www.nowcoder.com/acm/contest/71/E
时间限制:C/C++ 3秒,其他语言6秒
Special Judge, 64bit IO Format: %lld
题目描述
1、对于区间 [l,r],其区间元素按位或和等于 x
2、对于区间 [l,r],其区间元素按位与和等于 x
求出一个数列 A,使得满足给定的 m 个条件,保证有解。
输入描述:
输入第一行两个正整数 n,m,意义如上
接下来 m 行,每行四个整数 op,l,r,x,表示一组限制
op = 1 表示是限制 1,op = 2 表示是限制 2
输出描述:
输出仅一行,n 个整数 ai表示数列 A。要求 0 <= ai< 1e9
输入例子:
4 3
1 1 2 9
2 3 4 2
1 2 3 11
输出例子:
1 9 2 6
-->
输入
4 3
1 1 2 9
2 3 4 2
1 2 3 11
输出
1 9 2 6
备注:
1<=n,m<=10^5, 1<=l<=r<=n, 0<=x<2^20
////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
#include <bits/stdc++.h>
#define mst(a,b) memset((a),(b), sizeof a)
#define lowbit(a) ((a)&(-a))
#define IOS ios::sync_with_stdio(0);cin.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int mod=1e9+;
const int maxn=1e5+;
int od[maxn],l[maxn],r[maxn],x[maxn];
int ans[maxn];
bool vis[maxn];
int head[maxn],dist[maxn];
int s[maxn];
struct edge{
int to,nx,val;
}ed[maxn<<];int cnt; void addedge(int from,int to,int val){
ed[++cnt].to=to;ed[cnt].val=val;
ed[cnt].nx=head[from];head[from]=cnt;
} void init(int n){
cnt=;
mst(head,);mst(s,);
for(int i=;i<n;++i){
addedge(i+,i,);
addedge(i,i+,);
}
} void spfa(int n){
mst(vis,false);
mst(dist,0x3f);
vis[]=true;dist[]=;
stack<int>sta;
sta.push();
while(!sta.empty()){
int u=sta.top();sta.pop();
vis[u]=false;
for(int i=head[u];i;i=ed[i].nx){
int v=ed[i].to;
if(dist[v]>dist[u]+ed[i].val){
dist[v]=dist[u]+ed[i].val;
if(!vis[v]){
vis[v]=true;
sta.push(v);
}
}
}
}
} int main() {
#ifdef local
freopen("inpp","r",stdin);
// freopen("outpp","w",stdout);
#endif
int n,m;scanf("%d%d",&n,&m);
for(int i=;i<=m;++i)scanf("%d%d%d%d",&od[i],&l[i],&r[i],&x[i]);
for(int d=;d>=;--d){
init(n);
for(int i=;i<=m;++i){
if(od[i]==){
if((x[i]>>d)&)addedge(l[i]-,r[i],-);
else addedge(r[i],l[i]-,);
}else{
if((x[i]>>d)&)addedge(l[i]-,r[i],l[i]--r[i]),++s[l[i]],--s[r[i]+];
else addedge(r[i],l[i]-,r[i]-l[i]);
}
}
for(int i=;i<=n;++i)s[i]+=s[i-];
for(int i=;i<=n;++i)s[i]=s[i]?:;
for(int i=;i<=n;++i)s[i]+=s[i-],addedge(,i,-s[i]);
spfa(n);
for(int i=;i<=n;++i){
ans[i]<<=;
if(dist[i]-dist[i-])ans[i]|=;
}
}
for(int i=;i<=n;++i)printf("%d\n",ans[i]);
return ;
}
很神奇,,,,代码一直超时,然后对比了了别人的代码,加了这几行,就过了,不是很理解为什么会快那么多
for(int i=;i<=n;++i)s[i]+=s[i-];
for(int i=;i<=n;++i)s[i]=s[i]?:;
for(int i=;i<=n;++i)s[i]+=s[i-],addedge(,i,-s[i]);
然后把queue换成stack也确实变快了
wannafly 挑战赛9 E 组一组 (差分约束)的更多相关文章
- 牛客Wannafly9E 组一组 差分约束
正解:差分约束 解题报告: 传送门! 首先肯定要想到把他们分开来考虑,就是说,把数二进制拆分掉,这样就可以分开考虑了嘛 然后考虑设f[i]:前i个数中的1的个数 然后就可以得到一堆差分约束的式子 然后 ...
- Wannafly挑战赛9 E - 组一组
链接:https://www.nowcoder.net/acm/contest/71/E来源:牛客网 题目描述 有一个长为 n 的数列 A,其中有 m 个限制条件,条件有两种: 1.对于区间 [l,r ...
- 【Nowcoder71E】组一组(差分约束,最短路)
[Nowcoder71E]组一组(差分约束,最短路) 题面 Nowcoder 题解 看到二进制显然就直接拆位,那么区间的按位或和按位与转成前缀和之后,可以写成两个前缀和的值的差的大小关系,那么直接差分 ...
- 【牛客网71E】 组一组(差分约束,拆位)
传送门 NowCoder Solution 考虑一下看到这种区间或与区间与的关系,拆一下位. 令\(s_i\)表示前缀和,则: 那么如果现在考虑到了第\(i\)为,有如下4种可能: \(opt=1\) ...
- poj 1201 Intervals(差分约束)
做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...
- ☆ [POJ1021] Intervals 「差分约束」
传送门 >Here< 题意:给出N段区间,并告诉你每段区间里有几个数(一个位置只能放一个数) 问总共至少有几个数 解题思路 差分约束题,本蒟蒻也是第一次做差分约束题…… 所谓差分约束,常常 ...
- UVALive - 4885 Task 差分约束
Task 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page ...
- 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】
在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...
- 【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...
随机推荐
- ZOJ 2836 Number Puzzle 题解
题面 lcm(x,y)=xy/gcd(x,y) lcm(x1,x2,···,xn)=lcm(lcm(x1,x2,···,xn-1),xn) #include <bits/stdc++.h> ...
- git部分命令笔记
目录 配置user信息 建Git仓库 清空暂存区 git变更文件名 查看暂存区状态 查看历史 查看本地分支 查看所有分支(包含远程) 创建分支 基于远程分支创建本地新分支 查看图形化分支日志 图形化界 ...
- Python:什么是进阶,如何进阶?
目录 Python:什么是进阶,如何进阶? 1. 什么是进阶? 2. 如何进阶? 3. 除此之外呢? Python:什么是进阶,如何进阶? 1. 什么是进阶? 一门编程语言的基础部分,往往非常简单.如 ...
- vi命令(待更新)
第一部分: 0:光标到本行行首$:光标到本行行尾 ^:本行第一个非blank的位置g_:本行最后一个非blank的位置 a:光标后插入(insert是光标前插入字符)o:当前行后加入新行O:当前行钱加 ...
- oracle链接报错shared memory realm does not exist
问题描述: 前两天能够正常链接,今天来了突然不能链接,原因不详. 处理方法: 连接linux进行如下操作: 1.sqlplus /nolog 2.conn / as sysdba 3.startup ...
- Java的GUI框架如何选择? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot、BeautyEye框架(美观)?
AWT 是swing的基础,运行良好,但缺少高级组件.如果您打算创建丰富的应用程序,那么AWT可能不是最好的方法.但是对于不需要丰富用户界面的较小gui应用程序来说.这可能非常适合,因为它是一个久经考 ...
- Ajax轮询请求
Ajax轮询请求 什么是轮询? 轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. Ajax轮询需要服务器有很快的处理速度与快速响应. ...
- MWPhotoBrowser.bundle: bundle format unrecognized, invalid, or unsuitable
今天在github下载了MWPhotoBrowser的demo想跑一下,却发现报了MWPhotoBrowser.bundle: bundle format unrecognized, invalid, ...
- (转)linux chattr lsattr 命令
转http://www.ha97.com/5172.html PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功 ...
- OpenCV笔记(I)
这里记一下开始入手OpenCV碰到的一些问题以及解决办法.学习参考书是<OpenCV 4 计算机视觉项目实战(原书第2版)>,ISBN:978-7-111-63164-4. Ubuntu ...