链接:https://www.nowcoder.com/acm/contest/71/E

时间限制:C/C++ 3秒,其他语言6秒

空间限制:C/C++ 65536K,其他语言131072K
Special Judge, 64bit IO Format: %lld

题目描述

有一个长为 n 的数列 A,其中有 m 个限制条件,条件有两种:
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

-->

示例1

输入

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 组一组 (差分约束)的更多相关文章

  1. 牛客Wannafly9E 组一组 差分约束

    正解:差分约束 解题报告: 传送门! 首先肯定要想到把他们分开来考虑,就是说,把数二进制拆分掉,这样就可以分开考虑了嘛 然后考虑设f[i]:前i个数中的1的个数 然后就可以得到一堆差分约束的式子 然后 ...

  2. Wannafly挑战赛9 E - 组一组

    链接:https://www.nowcoder.net/acm/contest/71/E来源:牛客网 题目描述 有一个长为 n 的数列 A,其中有 m 个限制条件,条件有两种: 1.对于区间 [l,r ...

  3. 【Nowcoder71E】组一组(差分约束,最短路)

    [Nowcoder71E]组一组(差分约束,最短路) 题面 Nowcoder 题解 看到二进制显然就直接拆位,那么区间的按位或和按位与转成前缀和之后,可以写成两个前缀和的值的差的大小关系,那么直接差分 ...

  4. 【牛客网71E】 组一组(差分约束,拆位)

    传送门 NowCoder Solution 考虑一下看到这种区间或与区间与的关系,拆一下位. 令\(s_i\)表示前缀和,则: 那么如果现在考虑到了第\(i\)为,有如下4种可能: \(opt=1\) ...

  5. poj 1201 Intervals(差分约束)

    做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...

  6. ☆ [POJ1021] Intervals 「差分约束」

    传送门 >Here< 题意:给出N段区间,并告诉你每段区间里有几个数(一个位置只能放一个数) 问总共至少有几个数 解题思路 差分约束题,本蒟蒻也是第一次做差分约束题…… 所谓差分约束,常常 ...

  7. UVALive - 4885 Task 差分约束

    Task 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page ...

  8. 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】

    在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...

  9. 【拓扑排序或差分约束】Guess UVALive - 4255

    题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...

随机推荐

  1. python变量的内存管理

    python变量的内存管理 一.变量存在了哪里? 先让我们来看一段代码: height = 100 # 定义变量 # print(100) # print会自动帮你创建一个变量100,打印完之后,马上 ...

  2. chromedriver.exe下载

    淘宝的镜像地址可以下载: https://npm.taobao.org/mirrors/chromedriver/

  3. JavaEE--JSP指令

    JSP指令用于提供整个JSP页面的相关信息以及用于JSP页面与容器之间的通信.JSP指令有三种:page指令.include指令.taglib指令 1.page指令 用于设定整个JSP页面的属性和相关 ...

  4. C++中如何实现split的效果?

    C++中如何实现split的效果? 和Python等语言不同,C++的string类没有内置split函数,这对于实际应用中要经常分割字符串的情况非常不方便.有很多种方法来处理,这里讲一种比较方(to ...

  5. 通过web.xml监听器启动main方法

    web.xml中添加要启动的类 <listener> <listener-class>server.NettyServer</listener-class> < ...

  6. 剑指offer-1:旋转数组的最小数字

    旋转数组的最小数字1.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2 ...

  7. 将临时全局表中的符合字段导入test数据库中

    --表1 开户级别表 insert into test.dbo.crm_m_cust_summary(CUST_CERT_N O,ASSETAMT_GRADE_CD)select cust_no,cu ...

  8. uwsgi_response_write_body报错的几种情况

    1.uwsgi_response_write_body_do(): Broken pipe 出现这种情况一般是由于客户端无法等到服务端的回应而关闭了连接,常出现与nginx + uwsgi的情况,当u ...

  9. Codeforces 909 substr用法 思维合并线段目标最少 Py语句逆推DP vecrtor缩点删不同颜色点模拟 拓扑排序处理任务

    A str.substr(i,j) 从str[i]开始起取j个字符作为返回的字符串 /* Huyyt */ #include <bits/stdc++.h> using namespace ...

  10. Codeforces 911 三循环数覆盖问题 逆序对数结论题 栈操作模拟

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...