Codeforces Round #275 (Div. 2) D
题意 : 一个数组 给出m个限制条件 l r z 代表从l 一直 & 到 r 为 z 问能否构造出这种数组 如果可以 构造出来
因为 n m 都是1e5 而l r 可能输入进去就超时了 所以刚写完线段树课件的我想了很久想出来了线段树解法 ...
想法是这样的 每次输入 update 结束后 全部query一遍 看看是否和期望一样
一开始的想法是 存下每个数组的&值 一开始是1<<31 - 1 然后每次进行update 都求出这个区间在树上区间没有被更新到的点的& 三者一& 继续向下
但是感觉时间复杂度很玄学 写完直接wa掉了
后来想出了 | 的解法
思想 :
利用tree存放每个区间的&的值 一开始是0
如果我们对一个区间有一个期望 : l - r = z 那么一定满足一个东西 : l - r 的数字在二进制上全都包含z
所以每次 我们都对这个区间进行一个 | 上 z 的运算 至少要让 l - r 的数字拥有z
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<math.h>
- #include<map>
- #include<vector>
- #include<iostream>
- #include<iomanip>
- #include<algorithm>
- #include<queue>
- using namespace std;
- #define L long long
- struct node{
- int l , r ;
- int z ;
- }tr[100000 * 5];
- int mark[100000 * 5] ;
- int n , m ;
- node in[100500] ;
- int maxx ;
- void crea(int ro , int l ,int r ) {
- tr[ro].l = l ;
- tr[ro].r = r ;
- tr[ro].z = 0 ;
- if(l == r)return ;
- int mid = (l + r) / 2 ;
- crea(ro*2 , l , mid ) ;
- crea(ro*2+1, mid + 1 , r) ;
- }
- void pushdown(int ro) {
- if(mark[ro] == 0) {
- return ;
- }
- if(tr[ro].l == tr[ro].r) return ;
- mark[ro*2] |= mark[ro] ;
- mark[ro*2+1] |= mark[ro] ;
- tr[ro*2].z |= mark[ro] ;
- tr[ro*2+1].z |= mark[ro] ;
- mark[ro] = 0 ;
- return ;
- }
- int query(int ro , int l , int r ){
- pushdown(ro) ;
- if(l <= tr[ro].l && r >= tr[ro].r) {
- return tr[ro].z ;
- }
- int mid = (tr[ro].l + tr[ro].r) / 2 ;
- if(r <= mid) {
- return query(ro*2 , l , r ) ;
- }
- else if(l >= mid + 1 ) {
- return query(ro*2+1 , l , r ) ;
- }
- else {
- return query(ro*2 , l , r ) & query(ro*2+1 , l , r ) ;
- }
- }
- void upda(int ro , int l , int r , int z) {
- pushdown(ro) ;
- if(l <= tr[ro].l && r >= tr[ro].r) {
- tr[ro].z |= z ;
- mark[ro] = z ;
- return ;
- }
- if(tr[ro].l == tr[ro].r) return ;
- int mid = (tr[ro].l + tr[ro].r) / 2 ;
- if(r <= mid){
- upda(ro*2 , l , r , z) ;
- }
- else if(l >= mid + 1) {
- upda(ro*2+1 , l , r , z) ;
- }
- else {
- upda(ro*2 , l , mid , z) ;
- upda(ro*2+1 , mid + 1 , r , z) ;
- }
- tr[ro].z = tr[ro*2].z & tr[ro*2+1].z ;
- }
- int main(){
- while(scanf("%d%d",&n,&m)!=EOF){
- maxx = (1 << 31)- 1 ;
- for(int i = 0 ; i <= n * 5 - 5 ; i ++ ) {
- mark[i] = 0 ;
- }
- crea(1,1,n) ;
- for(int i = 1; i <= m ; i ++ ){
- scanf("%d%d%d" , &in[i].l, &in[i].r , &in[i].z) ;
- upda(1 , in[i].l , in[i].r , in[i].z) ;
- }
- bool ok = true ;
- for(int i = 1; i <= m ; i ++ ){
- int z = query(1 , in[i].l , in[i].r ) ;
- if(z != in[i].z) {
- ok = false ;
- break ;
- }
- }
- if(ok) {
- printf("YES\n") ;
- for(int i = 1; i <= n ; i ++ ){
- printf("%d",query(1,i,i)) ;
- if(i == n)printf("\n");
- else printf(" ") ;
- }
- }
- else {
- printf("NO\n") ;
- }
- }
- }
Codeforces Round #275 (Div. 2) D的更多相关文章
- Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)
题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列当中相邻两项差的绝对值的个数(指绝对值不同的个数 ...
- Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造
Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 ht ...
- 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
题目传送门 /* 构造:首先先选好k个不同的值,从1到k,按要求把数字放好,其余的随便放.因为是绝对差值,从n开始一下一上, 这样保证不会超出边界并且以防其余的数相邻绝对值差>k */ /*** ...
- [Codeforces Round #275 (Div. 2)]B - Friends and Presents
最近一直在做 codeforces ,总觉得已经刷不动 BZOJ 了? ——真是弱喵 你看连 Div.2 的 B 题都要谢谢题解,不是闲就是傻 显然我没那么闲 ╮(╯_╰)╭ 我觉得这题的想法挺妙的~ ...
- Codeforces Round #275 (Div. 2) C
题目传送门:http://codeforces.com/contest/483/problem/C 题意分析:题目意思没啥好说的. 去搞排列列举必须TLE.那么就想到构造. 1.n.2.n-1.3.n ...
- Codeforces Round #275(Div. 2)-C. Diverse Permutation
http://codeforces.com/contest/483/problem/C C. Diverse Permutation time limit per test 1 second memo ...
- Codeforces Round #275 (Div. 2)-A. Counterexample
http://codeforces.com/contest/483/problem/A A. Counterexample time limit per test 1 second memory li ...
- Codeforces Round #275 Div.1 B Interesting Array --线段树
题意: 构造一个序列,满足m个形如:[l,r,c] 的条件. [l,r,c]表示[l,r]中的元素按位与(&)的和为c. 解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的 ...
- Codeforces Round #275 (Div. 2)
A. Counterexample 题意:给出l,r,找出使得满足l<a<b<c<r,同时满足a,b的最大公约数为1,b,c的最大公约数为1,且a,b的最大公约数不为1 因为题 ...
- Codeforces Round #275 (Div. 2) 题解
A 题: 说的是在(LR) 之间找出ab互质 bc 互质 ac 不互质的 3个数 数据量小直接暴力 #include <iostream> #include <cstdio> ...
随机推荐
- 初探webpack之环境配置
先感叹一句,前端的发展真是太快了,ng和bb还没怎么学好就要过时了.现在感觉react当是未来的一个大方向. 以前一直用的grunt,不过前段时间作者已经停止更新了.正好webpack风头正盛,咱也不 ...
- [Spring Framework]学习笔记--Dependency injection(DI)
1. 通过构造函数实现DI 简单类型实例 package examples; public class ExampleBean { // Number of years to calculate th ...
- POI1999(仓库管理员)
题目链接:传送门
- 【BZOJ4716】假摔 二分+暴力
[BZOJ4716]假摔 Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao. ...
- 《从零开始学Swift》学习笔记(Day 47)——final关键字
原创文章,欢迎转载.转载请注明:关东升的博客 在类的定义中使用final关键字声明类.属性.方法和下标.final声明的类不能被继承,final声明的属性.方法和下标不能被重写. 下面看一个示例: f ...
- 160823、ionic上拉/下拉更新数据
<!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="UTF- ...
- Python星号*与**用法分析 What does ** (double star/asterisk) and * (star/asterisk) do for parameters? 必选参数 默认参数 可变参数 关键字参数
python中*号**的区别 - CSDN博客 https://blog.csdn.net/qq_26815677/article/details/78091452 定义可变参数和定义 list 或 ...
- Delphi里的Windows消息(可查MSDN指定位置)
各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...
- Vue页面上实时显示当前时间,每秒更新
有时候我们需要在页面上添加一个类似时钟的东西来实时显示当前时间,这个时候我们可以利用定时器来完成这个功能 <div id="app"> {{date}} </di ...
- Nuxt使用iconfont矢量图标
Nuxt可以使用各种前端UI框架,这些框架一般都自带的有一些icon图标可供用户使用,但是一般项目开发的时候,UI框架自带的icon是不能满足实际项目需求的,这个时候我们可以自己找一些图片放到本地项目 ...