zoukankan      html  css  js  c++  java
  • codeforces 482B. Interesting Array【线段树区间更新】

    题目:codeforces 482B. Interesting Array


    题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val。

    就是区间l---r上的与的值为val,最后问你原来的数组是多少?假设不存在输出no


    分析:分析发现要满足全部的区间,而一个点上假如有多个区间的话,这个点的值就是全部区间或的值。由于仅仅有这样才干满足全部区间的。把全部位上的1都保存下来了。那么能够发现用线段树来维护,可是那么怎么推断满不满足条件呢?能够也用线段树,更新了之后在整个维护一遍看看满不满足题意。假设满足的话就能够了。


    AC代码:

    #include <cstdio>
    #include <cstring>
    #include <vector>
    using namespace std;
    const int N = 110000;
    struct Node
    {
        int l,r;
        int val;
    };
    Node tree[10*N];
    void build(int o,int l,int r)
    {
        tree[o].l = l,tree[o].r = r;
        tree[o].val = 0;
        if(l==r)
            return ;
        int mid = (l+r)/2;
        build(o+o,l,mid);
        build(o+o+1,mid+1,r);
    }
    void update(int o,int l,int r,int val)
    {
        if(tree[o].l==l && tree[o].r==r)
        {
            tree[o].val|=val;
            return ;
        }
        int mid = (tree[o].l + tree[o].r)/2;
        if(mid>=r)
            update(o+o,l,r,val);
        else if(l>mid)
            update(o+o+1,l,r,val);
        else
        {
            update(o+o,l,mid,val);
            update(o+o+1,mid+1,r,val);
        }
    }
    int query(int o,int l,int r)
    {
        if(tree[o].l==l && tree[o].r==r)
            return tree[o].val;
        int mid = (tree[o].l + tree[o].r)/2;
        if(mid>=r)
            return query(o+o,l,r);
        else if(l>mid)
            return query(o+o+1,l,r);
        else
        {
            return query(o+o,l,mid)&query(o+o+1,mid+1,r);
        }
    }
    vector<int> ans;
    void solve(int o)
    {
        if(o!=1)
            tree[o].val |= tree[o/2].val;
        //printf("%d %d %d %d
    ",o,tree[o].l,tree[o].r,tree[o].val);
        if(tree[o].l==tree[o].r){
            ans.push_back(tree[o].val);
            return ;
        }
        solve(o+o);
        solve(o+o+1);
    }
    Node a[N];
    int main()
    {
        //freopen("Input.txt","r",stdin);
        int n,m;
        scanf("%d%d",&n,&m);
        build(1,1,n);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].val);
            update(1,a[i].l,a[i].r,a[i].val);
        }
        int ok=1;
        for(int i=0;i<m;i++)
        {
            if(query(1,a[i].l,a[i].r)!=a[i].val)
            {
                ok=0;
                break;
            }
        }
        solve(1);
        if(ok){
            puts("YES");
            for(int i=0;i<ans.size();i++)
                printf("%d%c",ans[i],i==n?'
    ':' ');
            ans.clear();
        }
        else
            puts("NO");
        return 0;
    }
    


  • 相关阅读:
    SharePoint客户端开发:增加用户信息到用户信息列表
    Query Options的一些用法(5):日历的处理
    User Profile Service卡在Starting的解决方法
    python enumerate用法
    希腊字母的发音
    在Linux下安装go语言环境
    Gradle的安装与使用
    学习正太分布及极差、移动极差、方差、标准差等知识点
    招聘还是炫耀,设计模式是装逼利器?
    Silverlight + RIA Service的SUID的实例。
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6729348.html
Copyright © 2011-2022 走看看