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表示前缀和)的符号(正负零),求一 ...
随机推荐
- Luogu P1080 [NOIP2012]国王游戏
题目 按\(a_i*b_i\)升序排序即可. 证明考虑交换法. 对于排序后相邻的两个人\(i,j(a_ib_i\le a_jb_j)\),设前面的总的积为\(s\),则当前答案为\(\max(\fra ...
- 【转载】jquery版的网页倒计时效果
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- vue动态渲染图片,引用路径需要注意的地方
1.把图片放在和src同级的static里面,这用按照正常的方式进行引入,例如: 2.图片可以在其他文件夹,但是在script引入是必须加上require <img :src="ite ...
- 为什么现在UML很少用了
新霸哥发现UML在面向对象的设计中的需求,相关行为.一些体系结构的实现提供了一套综合完整的表示法,但是由于使用的人比较少,初学者不容易快速入门,所以就导致了UML不是那么的受欢迎. UML在开发中有什 ...
- 关于WPA/WPA2 4次握手
简单描述一下WPA/WPA2的4次握手中的一些关键词: WPA/WPA2使用4次握手的方式来产生所需要的密钥.四次握手通过一系列的交互,从PMK(Pairwise Master Key)生成PTK(P ...
- hash_table
#include <ext/pb_ds/hash_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using name ...
- 【洛谷P3723】礼物
题目大意:给定两个序列 A.B,现可以将 A 序列的每一个元素的值增加或减少 C,求 \(\sum\limits_{i=0}^{n-1}(a_i-b_{i+k})^2\) 的最小值是多少. 题解:先不 ...
- java选做猜数字
程序设计思想 第一步:使用随机数生成1-100的数字 第二步:让用户输入数字 第三步:输入的数字与生成数字不同执行下一步,相同执行第五步 第四步:比较两数大小并输出结果,并返回第二步 第五步:输出猜对 ...
- CodeForces-585B(BFS)
链接: https://vjudge.net/problem/CodeForces-585B 题意: The mobile application store has a new game calle ...
- 2016.09.03【初中部 NOIP提高组 】模拟赛A总结
今天班主任不知道出了什么事,把整个班留了40多分钟,各种吹水谈人生.耽误了很多时间. #$%^& 这次第一题很神奇,通过枚举矩阵来确定三个单元格的位置,没想到,结果爆零. 刚开始看见这道题有费 ...