CodeForces-483D Interesting Array 线段树拆位

让你构造一个数列,满足m种限制条件,每种限制条件是l,r,x,要求构造的序列区间[l,r] 与运算的值结果为x

注意到如果某一位上&运算的结果为1的话,该区间内所有元素都要是1

先把需要是1的地方拎出来处理,相当于区间操作,写个lazytag;

然后再考虑0,显然如果为0,区间内只要有1个0就可以了,问题转化成该区间内能否找到一个位置为0

找到的话返回编号

构造的时候根据每一位是否为0累加一下随便构就好了

但是这样写的时间复杂度是log*log,实测t了第36个点

猜测可能是结构体数组开大,结构体又慢,然后我树常数也写大了

加了个c++火车头982ms卡过去了,火车头:https://www.cnblogs.com/liyishui2003/p/16652191.html

code:

复制代码
#include<bits/stdc++.h>
#define ls (rt<<1)
#define rs (rt<<1|1)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
using namespace std;
const int maxn=1e5+5;
struct seg{
    int l,r,lazy;
}t[31][maxn<<2];
void push_up(){
    
}
void push_down(int w,int rt){
    if(!t[w][rt].lazy){
        return;
    }
    else {
        t[w][ls].lazy=1;
        t[w][rs].lazy=1;
        t[w][rt].lazy=0;
    }
}
void build(int w,int rt,int l,int r){
    t[w][rt].l=l;t[w][rt].r=r;
    if(l==r){
       t[w][rt].lazy=0;
       return;
    }
    int mid=(l+r)>>1;
    build(w,ls,l,mid);build(w,rs,mid+1,r);
}
void update(int w,int rt,int l,int r){
    if(l<=t[w][rt].l&&t[w][rt].r<=r){
        // update
        t[w][rt].lazy=1;
        return;  
    }
    if(t[w][ls].r>=l) update(w,ls,l,r);
    if(t[w][rs].l<=r) update(w,rs,l,r);
}
int query(int w,int rt,int l,int r){
    if(l<=t[w][rt].l&&t[w][rt].r<=r){
        if(t[w][rt].lazy==1) return 0;
    }
    if(t[w][rt].l==t[w][rt].r){
        if(t[w][rt].lazy==0) return t[w][rt].l;
        else return 0;
    }
    int ans=0;
    if(t[w][ls].r>=l&&!t[w][ls].lazy) ans=query(w,ls,l,r);//
    if(ans) return ans;
    if(t[w][rs].l<=r&&!t[w][rs].lazy) ans=query(w,rs,l,r);//
    return ans;
} 
int n,m,l[maxn],r[maxn],q[maxn];
int ans[31][maxn];
int main(){
    //freopen("lys.in","r",stdin);
    fastio;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>l[i]>>r[i]>>q[i];
    for(int j=0;j<30;j++)
        build(j,1,1,n);
    // deal with 1
    for(int j=0;j<30;j++){
        for(int i=1;i<=m;i++){
            if(q[i]&(1<<j)){
               update(j,1,l[i],r[i]);    
            }
            else {
                //do nothing
            }
        }
    }
    for(int j=0;j<30;j++){
        for(int i=1;i<=m;i++){
            if(q[i]&(1<<j)){
                //do nothing
            }
            else {
                int se=query(j,1,l[i],r[i]);// se 为第j棵线段树下为0 的位置 
                if(se){
                    ans[j][se]=1;
                }
                else {
                    cout<<"NO";return 0;
                }
            }
        }
    }
    cout<<"YES"<<endl;
    for(int i=1;i<=n;i++){
       int out=0;
       for(int j=0;j<30;j++){
           if(ans[j][i]==0) out+=1<<j;
       }
       cout<<out<<" ";    
    }
}
复制代码

 

posted @   liyishui  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示