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表示前缀和)的符号(正负零),求一 ...
随机推荐
- keepalived 容器在宿主机重启后无法启动问题:报错:daemon is already running
初步猜测原因是:keepalived容器内的keepalived.pid文件在keepalived容器非正常退出时,没有正确删除,造成第二次启动时容器检查到pid文件已经存在,认为该进程已经存在,因为 ...
- goods商品类
- selenium与页面交互之一:webdriver浏览器的属性
selenium提供了许多API方法与页面进行交互,如点击.键盘输入.打开关闭网页.输入文字等. webdriver对浏览器提供了很多属性来对浏览器进行操作,常用的如图: get(url).quit( ...
- [.net core]6.launchSettings.json,调试配置
展开properties, 双击查看内容, { "iisSettings": { "windowsAuthentication": false, "a ...
- 编写优秀 CSS 代码的 8 个策略
编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一.然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性. 我认为这主要是因为许多开发人员对组织CSS / H ...
- 手把手带你了解sass
sass的使用 减少重复的工作 1.变量的声明: 是以$开头给变量命名; $height-color: #F30 2.变量的使用范围: 变量可以在多个地方存在,不一定限制在代码块中.但是如果定义在了代 ...
- 采购合同的条件价格取值逻辑(如ME35K/ME3M显示报表的多个日期范围的条件价格)
1.根据采购订单合同和行项目和类型(合同是M)在A016表中取值条件号, 2.根据A016的条件号在KONP中取得价格 ME35K.ME3M的增强点在子程序LMEREPI02下的 METHOD if ...
- Hash介绍
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就 ...
- Linux基础命令练习题(附答案)
1.分别用cat \tac\nl三个命令查看文件/etc/ssh/sshd_config文件中的内容,并用自己的话总计出这三个文档操作命令的不同之处? [root@localhost ~]# cat ...
- 设备中LPC2368芯片个例参数问题导致故障的分析
最近公司的设备客户报告在终端客户那里出现了板卡加热不受控,出现了持续加热导致设备一些贵重部件损坏.由于历史上很多现场问题,板卡什么拆到别的地方搭复现平台,基本都是以失败告终,所以出差去现场分析. 过程 ...