首页 > 其他分享 > CF482B Interesting Array Solution

CF482B Interesting Array Solution

时间:2023-05-27 15:11:35浏览次数:36  
标签:克鲁鲁 CF482B int Interesting i64 constexpr 按位 res Array

构造一个数组,给出了 \(m\) 条限制,要求 \([l, r]\) 内的数按位与的值为 \(x\)。

按位考虑,对于 \(x\) 的每个位,\([l, r]\) 的数在这一个位下都应该是 \(1\), 否则就无法满足它们的与的值为 \(x\)。

构造出来的数组并不一定是满足条件的。所以在所有的操作完后还要验证构造的数组是否满足了条件,需要求一个区间的数的按位与。如果满足条件就直接输出,否则就只能输出 NO 了。

于是就可以线段树了,修改是 \([l, r]\) 的数全部都或一个 \(x\),询问就是 \([l, r]\) 的数的按位与。

// Code by 落花月朦胧. 
#include <bits/stdc++.h>

using i64 = long long;
constexpr int iinf = 1E9;
constexpr i64 linf = 1E18;

// 克鲁鲁 克鲁鲁 克鲁鲁 克鲁鲁 克鲁鲁 克鲁鲁 克鲁鲁 克鲁鲁

constexpr int N = 1E5 + 10;
constexpr int P = 998244353;

i64 power(i64 a, i64 b, i64 p) {
    i64 res = 1;
    for (; b; b >>= 1, a = (a * a) % p)
        if (b & 1) res = (res * a) % p;
    return res % p;
}

struct node {
    int l, r;
    int add, val;
} t[N << 2];

#define l(x) t[x].l
#define r(x) t[x].r
#define val(x) t[x].val
#define add(x) t[x].add

void build(int l, int r, int p) {
    l(p) = l;
    r(p) = r;
    if (l == r) {
        return;
    }
    int mid = (l + r) / 2;
    build(l, mid, p << 1);
    build(mid + 1, r, p << 1 | 1);
}

void pushup(int p) {
    val(p) = val(p << 1) & val(p << 1 | 1);
}

void pushdown(int p) {
    if (add(p)) {
        add(p << 1) |= add(p);
        add(p << 1 | 1) |= add(p);
        val(p << 1) |= add(p);
        val(p << 1 | 1) |= add(p);

        add(p) = 0;
    }
}

void update(int L, int R, int x, int p) {
    if (l(p) >= L && r(p) <= R) {
        val(p) |= x;
        add(p) |= x;
        return;
    }
    pushdown(p);
    int mid = (l(p) + r(p)) / 2;
    if (mid >= L) {
        update(L, R, x, p << 1);
    }
    if (mid < R) {
        update(L, R, x, p << 1 | 1);
    }
    pushup(p);
}

int ask(int L, int R, int p) {
    if (l(p) >= L && r(p) <= R) {
        return val(p);
    }
    pushdown(p);
    int mid = (l(p) + r(p)) / 2;
    int ans = (1 << 30) - 1;
    if (mid >= L) {
        ans &= ask(L, R, p << 1);
    }
    if (mid < R) {
        ans &= ask(L, R, p << 1 | 1);
    }
    return ans;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); std::cout.tie(nullptr);

    int n, m;
    std::cin >> n >> m;

    build(1, n, 1);
    std::vector<int> L(m), R(m), x(m);
    for (int i = 0; i < m; i++) {
        std::cin >> L[i] >> R[i] >> x[i];

        update(L[i], R[i], x[i], 1);
    }
    for (int i = 0; i < m; i++) {
        if (ask(L[i], R[i], 1) != x[i]) {
            std::cout << "NO\n";
            return 0;
        }
    }

    std::cout << "YES\n";
    for (int i = 1; i <= n; i++) {
        std::cout << ask(i, i, 1) << ' ';
    }

    return 0;
}

标签:克鲁鲁,CF482B,int,Interesting,i64,constexpr,按位,res,Array
From: https://www.cnblogs.com/Zheng-XiangYu/p/17436774.html

相关文章

  • 1480. Running Sum of 1d Array刷题笔记
    简单难度的题classSolution:defrunningSum(self,nums:List[int])->List[int]:foriinrange(1,len(nums)):nums[i]+=nums[i-1]returnnums......
  • FLEX实践—XML、XMLList、XMLListCollection、ArrayCollection关系转换
    在本实例中将从一个XML对象通过层层转换最终变为ArrayCollection对象  <?xmlversion="1.0"encoding="utf-8"?><mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">......
  • Swift中常见的String用法,Array高阶使用,Set集合操作
    String字符串常见用法生成字符串创建字符串letgreeting="Hello,world!"letname=String("John")连接字符串:使用加号(+)或者字符串插值(使用())来将多个字符串连接起来。varfirstName="John"letlastName="Doe"letfullName=firstName+""+las......
  • java Arrays.fill 扩充数组
    importjava.util.*;publicclassImoocStudent{publicstaticvoidmain(Stringargs[]){intarray[]=newint[6];Arrays.fill(array,100);for(inti=0,n=array.length;i<n;i++){System.out.println(array[i])......
  • java arrays arraycopy 复制数组
    publicstaticvoidmain(Stringargs[]){int[]source={1,2,3,4,5,6,7};int[]target=newint[5];System.arraycopy(source,0,target,0,5);//6,7超出5的长度,被省略了System.out.println(Arrays.toString(target));for(......
  • array常用方法
    arr.concat()方法用于连接两个或多个数组。vara=["Google","Taobao"];varb=["Runoob","Wiki","Zhihu"];varc=a.concat(b);consloe.log(c);//[Google,Taobao,Runoob,Wiki,Zhihu]arr.filter()方法创建一个新的数组,新数组中的元素是通过检......
  • SpringBoot中操作Redis解析JsonArray数据为对象List(ruoyi字典值sys_dict为例)
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662在上面搭建系统的基础上,会将系统的字典值缓存进redis中。看数据格式存储的是Json数组,如何从redis中读取并解析成对象的list从而进行数据处理。注......
  • Myarray and Mystring
    Mystring.cpp#include<bits/stdc++.h>usingnamespacestd;classMystring{public: Mystring():s_(NULL),len_(0),siz_(0){}//无参构造 Mystring(constchar*s);//有参构造 Mystring(constMystring&p);//拷贝构造 ~Mystring(){delete[]s_;}//析构......
  • Python多进程编程-进程间共享数据(Value、Array、Manager)
    转载:(14条消息)Python多进程编程-进程间共享数据(Value、Array、Manager)_managervalue_Loadinggggg的博客-CSDN博客Value、Array是通过共享内存的方式共享数据Manager是通过共享进程的方式共享数据。Value\Array实例代码:importmultiprocessing#Value/Arraydeffunc1(a,arr......
  • CF1512D Corrupted Array 题解
    CF1512DCorruptedArray题解Link洛谷CodeforcesDescription给定一个正整数\(n\)和长度为\(n+2\)的数组\(b\),数组\(b\)是依据如下算法构造的:随机生成一个含有\(n\)个元素的原始数组\(a\);把数组\(a\)赋值给数组\(b\),即\(b_i=a_i(1\lei\len)\);数组\(b\)......