luoguP3613/BZOJ4811 睡觉困难综合征/由乃的OJ

bzoj 1018 堵塞的交通traffic (线段树) 题意: 思路: 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html         非常非常难写的线段树,不仅难想还难写。         首先,这个线段树维护的是什么,是该区域四个顶点的连通性  ... 阅读详情

题意:

       中文题

思路:

       很容易想到一个的写法,我们将每个数拆开,然后计算每一位分别取1,取0的时候的值。这个用树剖就能在O(nklog2n)O(nklog^2n)O(nklog2n)的时间内写完。不过这个时间复杂度有点大,会T。
       对于位运算,每一位都是独立的。虽然我们上面的思路就是基于这个想法。但是我们能够用的更深。首先思考下按照上面的思路,如何合并两个区间,假设f0[x][i]f_0[x][i]f0​[x][i]表示第i位,在x这个线段树上的区间,传入的是0的时候,得到的运算结果是多少。那么假如左区间传入的是0,结果是1,那么f1[rtf_1[rtf1​[rt<<1∣1][i]1|1][i]1∣1][i]的值就是合并后的值了,推一下公式。会得到:
f0[rt][i]=(f0[rtf_0[rt][i]=(f_0[rtf0​[rt][i]=(f0​[rt<<1][i])1][i])1][i])&f1[rtf_1[rtf1​[rt<<1∣1][i])∣(1|1][i])|(1∣1][i])∣(~f0[rtf_0[rtf0​[rt<<1][i])1][i])1][i])&f0[rtf_0[rtf0​[rt<<1∣1][i])1|1][i])1∣1][i])
传入是1的也同理。推出这个公式,就能发现每一位都独立计算了。那么所有数字就能一起计算了。
       可是对于输入的数我们无法判断是[0,z]中的哪一个。我们可以用全0和全1分别跑一次,然后按位贪心即可。

错误及反思:

首先,因为K能到达64,所以需要unsigned long long
因为爬路程的过程是有序的,所以需要开四种状态,一种优先和左边合并,一种优先和右边合并
因为爬路程的过程是有序的,所以查询也要分成两种,一种优先递归右边,一种优先递归左边
注意了以上几个细节就基本没啥问题了(以上几点都是wa的死去活来得出的结论)

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<stack>
#include<set>
#include<string>
#include<map>
#include<bits/stdc++.h>
#include<bitset>
using namespace std;
#define pb push_back
#define pf push_front
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mst(x,a) memset(x,a,sizeof(x))
#define all(x) (x).begin(),(x).end()
#define CLOSE ios::sync_with_stdio(false)
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
#define fi first
#define se second
#define sz(x) ((int)x.size())
#define cl(x) x.clear()
const int N = 101000;
const int M = 200100;
const int inf=0x3f3f3f3f;
const int mod=192600817;
ll qpow(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b/=2;}return ans;}
ll qpow(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c;b/=2;}return ans;}

ull maxull=-1;
ull f0[2][N*4],f1[2][N*4];int op[N*4];
struct EDGE{
    int to,nx;
}e[N*2];
int tot,tid,n,q,head[N];
int top[N],si[N],fa[N],son[N],dep[N],id[N],rnk[N];

void add(int x,int y){
    e[tot].to=y; e[tot].nx=head[x]; head[x]=tot++;
}

void dfs1(int x,int bef,int depth){
    fa[x]=bef; dep[x]=depth; si[x]=1;
    for(int i=head[x];i!=-1;i=e[i].nx)
        if(e[i].to!=bef){
            dfs1(e[i].to,x,depth+1);
            si[x]+=si[e[i].to];
            if(son[x]==-1) son[x]=e[i].to;
            else son[x]=si[e[i].to]>si[son[x]]?e[i].to:son[x];
        }
}

void dfs2(int x,int tp){
    top[x]=tp; id[x]=tid++;
    if(son[x]!=-1) dfs2(son[x],tp);
    for(int i=head[x];i!=-1;i=e[i].nx)
        if(e[i].to!=fa[x]&&e[i].to!=son[x])
            dfs2(e[i].to,e[i].to);
}

void init(){
    tot=0; tid=1;
    mst(head,-1); mst(son,-1);
}

ull hb(ull a,ull b,ull c){ return (a&c)|((~a)&b); }

ull res(int op,ull x,ull y){
    if(op==1) return x&y;
    if(op==2) return x|y;
    return x^y;
}

void query1(int L,int R,ull &x,ull &y,int l,int r,int rt){
    if(L<=l&&R>=r){
        ull a=x,b=y;
        y=hb(b,f0[0][rt],f1[0][rt]);
        x=hb(a,f0[0][rt],f1[0][rt]);
        return ;
    }
    int m=l+r>>1;
    if(m>=L) query1(L,R,x,y,lson);
    if(R>m) query1(L,R,x,y,rson);
}

void query2(int L,int R,ull &x,ull &y,int l,int r,int rt){
    if(L<=l&&R>=r){
        ull a=x,b=y;
        y=hb(b,f0[1][rt],f1[1][rt]);
        x=hb(a,f0[1][rt],f1[1][rt]);
        return ;
    }
    int m=l+r>>1;
    if(R>m) query2(L,R,x,y,rson);
    if(m>=L) query2(L,R,x,y,lson);
}

pair<ull,ull> modify(int L,int R){
    int f1=top[L],f2=top[R];
    ull ans1=maxull,ans2=0;
    vector<pii> v;
    while(f1!=f2){
        if(dep[f1]<dep[f2]){
            v.pb({id[f2],id[R]});
            R=fa[f2]; f2=top[R];
        }
        else{
            query2(id[f1],id[L],ans1,ans2,1,tid-1,1);
            L=fa[f1]; f1=top[L];
        }
    }
    if(dep[L]>dep[R]) query2(id[R],id[L],ans1,ans2,1,tid-1,1);
    else query1(id[L],id[R],ans1,ans2,1,tid-1,1);
    for(int i=sz(v)-1;i>=0;i--)
        query1(v[i].fi,v[i].se,ans1,ans2,1,tid-1,1);
    return {ans1,ans2};
}

ull val[N];int t[N];

void build(int l,int r,int rt){
    if(l==r){
        op[rt]=t[rnk[l]];
        f0[1][rt]=f0[0][rt]=res(op[rt],0,val[rnk[l]]);
        f1[1][rt]=f1[0][rt]=res(op[rt],maxull,val[rnk[l]]);
        return ;
    }
    int m=l+r>>1;
    build(lson); build(rson);
    f0[0][rt]=hb(f0[0][rt<<1],f0[0][rt<<1|1],f1[0][rt<<1|1]);
    f1[0][rt]=hb(f1[0][rt<<1],f0[0][rt<<1|1],f1[0][rt<<1|1]);
    f0[1][rt]=hb(f0[1][rt<<1|1],f0[1][rt<<1],f1[1][rt<<1]);
    f1[1][rt]=hb(f1[1][rt<<1|1],f0[1][rt<<1],f1[1][rt<<1]);
}

void change(int pos,int x,ull y,int l,int r,int rt){
    if(l==r){
        op[rt]=x;
        f0[1][rt]=f0[0][rt]=res(op[rt],0,y);
        f1[1][rt]=f1[0][rt]=res(op[rt],maxull,y);
        return ;
    }
    int m=l+r>>1;
    if(m>=pos) change(pos,x,y,lson);
    else change(pos,x,y,rson);
    f0[0][rt]=hb(f0[0][rt<<1],f0[0][rt<<1|1],f1[0][rt<<1|1]);
    f1[0][rt]=hb(f1[0][rt<<1],f0[0][rt<<1|1],f1[0][rt<<1|1]);
    f0[1][rt]=hb(f0[1][rt<<1|1],f0[1][rt<<1],f1[1][rt<<1]);
    f1[1][rt]=hb(f1[1][rt<<1|1],f0[1][rt<<1],f1[1][rt<<1]);
}

int main(){
    init();
    int m,k; scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++) scanf("%d%llu",&t[i],&val[i]);
    for(int i=0,u,v;i<n-1;i++){
        scanf("%d%d",&u,&v);
        add(u,v); add(v,u);
    }
    dfs1(1,1,1); dfs2(1,1);
    for(int i=1;i<=n;i++) rnk[id[i]]=i;
    build(1,tid-1,1);
    while(m--){
        int op,x,y; ull z; scanf("%d%d%d%llu",&op,&x,&y,&z);
        if(op==2) change(id[x],y,z,1,tid-1,1);
        else{
            pair<ull,ull> p=modify(x,y);
            ull ret=0; bool can=false;//
            for(int i=k-1;i>=0;i--){
                if(can) ret+=max((p.fi&(1ull<<i)),(p.se&(1ull<<i)));
                else{
                    if(z&(1ull<<i)){
                        if((p.se&(1ull<<i))>=(p.fi&(1ull<<i))){
                            can=true; ret+=p.se&(1ull<<i);
                        }
                        else ret+=(p.fi&(1ull<<i));
                    }
                    else ret+=(p.se&(1ull<<i));
                }
            }
            printf("%llu\n",ret);
        }
    }
}

MobaXterm终端工具个人学习版安装包及常用配置备份 资源包含 MobaXterm 个人版的安装包以及日常运维常用的基础配置备份文件。适用于网络工程师及运维人员用于日常的服务器管理、SSH 连接及串口调试。 压缩包内附带了个人整理的软件使用技巧与配置说明(仅供个人学习参考)。请各位同行下载后注意,技术工具请尽量支持官方正版,本资源仅供个人测试与交流使用,切勿用于商业环境。 立即下载

相关推荐

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

洛谷P4097 bzoj3615 [HEOI2013]Segment(李超树)

题意: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 两种操作,插入一个线段,或询问x=x0x=x0x=x_0时最大y对应的线段编号 思路: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;刚刚学了李超树就来A一下板子题,比起之前的题多了很多细节, 错误

Roll_Keyboard的博客 518

科技中介服务机构如何借助平台提升技术撮合服务的专业性与响应速度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

bzoj 1103 大都市meg (dfs序+线段树)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;一颗树,每条边权是1,两种操作,一种查询x到根的距离,一种把某边改为0 思路: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 对于一个边变了,那么影响的就是子树,所以dfs序+线段树就行了,这题对于时间要求很低,vector存边,每次暴力找答案也能A 错误及反思: 代码: ...

Roll_Keyboard的博客 457

产业园区如何利用AI技术提升科技成果转化服务的响应速度与转化成功率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

11232131231231是的

11232131231231是的

bzoj 3052/洛谷 P4074/uoj 58 [WC2013]糖果公园(树上带修莫队)

题意: UOJ地址 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 洛谷地址 BZOJ因为版权挂了。。。 思路: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 比较裸的一道树上带修莫队,我们只要维护一下某个糖出现了几次,然后更新答案即可 错误及反思: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;n

Roll_Keyboard的博客 450

STM32F407控制舵机

STM32F407控制舵机运行 使用STM32F407控制舵机,首先来看下舵机图片 [黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)] 舵机需要信号的周期为20ms,即频率为50Hz。 接下来正式操作: 步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到) #include "pwm.h" void TIM14_CH1_PWM_In

Ievn_Hare的博客 1万+

BZOJ 3289 Mato的文件管理(莫队+线段树/树状数组)

题意: 思路: 莫队+逆序数,思路还是很好想的,但是复杂度要纠结下。 对于[L,R]来说,向右边扩展,即变成了[L,R+1],就相当于只是在数组末端多了一个数,其他的操作也是同理,只要遵循,改变区间的时候,加上/减去比自己大的值即可 复杂度是莫队的o(nn‾√n\sqrt{n})乘以树状数组或者线段数查询的一个o(log(nn‾√)log(n\sqrt{n})) 错误及反思: 题目

Roll_Keyboard的博客 447

S7-200 Smart 控制运动轴(脉冲电机/伺服)教程

S7-200 Smart 控制运动轴(脉冲电机/伺服) 结合本人刚接触触摸屏时候的踩坑经验,编写S7-200 Smart 控制运动轴(脉冲电机/伺服)的详细流程,给刚接触PLC的朋友提供一些经验指导。 本文详细介绍了S7-200 Smart 控制脉冲步进/伺服电机流程,包含接线方法及梯形图。希望对初学者有所帮助

xjbsw0的博客 5万+

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

bzoj 2120 数颜色(可持久化莫队)

题意:思路:第一次写带修莫队,感觉还是比较简单的,相对于普通莫队,带修莫队主要是加了一个时间标志。大致思路就是,因为区间内的东西要修改,那就干脆继续暴力的修改,把[L,R]的转移,看成[L,R,T]的转移,依旧是利用排序进行优化,可以说带修莫队依旧是个暴力的优化。 不过,这题有一个疑点,就是在查看许多的博客里面,对于带修莫队,都说block为n23n^{\frac{2}{3}}时带修莫队速度达到最

Roll_Keyboard的博客 434

解锁RK3588:内核模块签名与安全启动配置全攻略

RK3588作为一款高性能嵌入式SoC芯片,其内核模块签名与安全启动配置是保障系统安全的核心机制。本文详细介绍了RK3588的芯片特性,重点阐述了安全启动的硬件信任链原理和内核模块签名的实现方法。通过具体步骤演示了从密钥生成、模块签名到验证加载的完整流程,并深入解析了安全启动配置的硬件连接、软件工具准备、密钥烧录等关键环节。此外,还提出了防御旁路攻击和动态信任链扩展等高级安全策略,为RK3588在工业控制、智能安防等高安全要求场景中的应用提供了全面的安全解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 347

bzoj 1503 郁闷的出纳员 (权值线段树或splay)

题意: 思路: &nbsp;&nbsp;&nbsp;&nbsp; 因为工资修改值最多只有1e5,初始工资1e5+修改的2e5,那么其实我们只要开3e5的权值线段树就能维护了。对于加减钱,我们只要修改标准即可,对于加入人,只要让他的初始工资补上之前修改过得标准即可,而查询第k大,就是正常操作了。 &nbsp;&nbsp;&nbsp;&nbsp;为了方便操作,我们让初始工资钱成为1e5+1,...

Roll_Keyboard的博客 429

2026华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2025华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

算法大师! 5万+

【部署】OpenClaw版本降级实操(含全量卸载)

本文详细介绍了OpenClaw工具的降级与卸载方法。主要内容包括:1)通过npm安装指定版本的核心命令及国内镜像加速方案;2)两种卸载路径:CLI工具存在时的简易一键卸载(含交互式与非交互式命令)和手动分步卸载流程;3)CLI已删除但服务仍在运行时,针对macOS(launchd)、Linux(systemd)和Windows(计划任务)系统的具体清理步骤。文章特别强调了卸载前备份的重要性,并提供了不同安装方式(常规安装与源码克隆)的额外说明,确保用户能彻底清理所有组件。

海兰 3173

spoj Qtree6/bzoj 3637 Query on a tree VI(树链剖分+线段树/LCT)

题意: 思路: 首先,我们要开两颗线段树,一颗表示,当前节点为白时,和子树所组成的最大联通块大小是多少,另一颗表示,当前节点为黑时,和子树所组成的最大联通块大小是多少。 那么我们查询点u的答案的时候,就向上找到最远的相同颜色的点v,点v所保存的答案就是u的答案(我们v为最远同色祖先)。 更新某个点u的颜色的时候,就是把u的父亲和最远同色祖先的父亲,这一条路径上的都更新(注意,黑白各更新...

Roll_Keyboard的博客 413

论文阅读:Query-Dependent Video Representation for Moment Retrieval and Highlight Detection

近年来,随着视频理解需求的急剧增加,视频时刻检索和高亮检测(MR/HD)成为人们关注的焦点。MR/HD的主要目标是对给定的文本进行视频时刻定位和内容一致性估计,即显著性得分。尽管最近基于transformer的模型带来了一些进步,但我们发现这些方法并不能完全利用给定查询的信息。例如,在预测时刻及其显著性时,有时会忽略文本查询与视频内容之间的相关性。为了解决这个问题,我们引入了基于查询的DETR (QD-DETR),这是一种为MR/HD量身定制的检测transfomer。

qq_42681787的博客 919

b2324/luogu4542 [ZJOI2011]营救皮卡丘

题意:        中文题 思路: 首先,如果要探寻新的点,假设i->j,一定是走的路径上比他们小的点过去的,并且在这个条件下,一定是走的最短路。这个过程可以使用floyd完成。对于i<j,假如能够到达,那么就建立一条长度为跑完floyd的dist[i][j]。 那么现在问题就变成了最多使用k条路径覆盖整个dag,并且要求花...

Roll_Keyboard的博客 407

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2727

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

BZOJ 1878 [SDOI2009]HH的项链 (莫队算法)

题意:给你n个数字,然后查询某个区间有多少种数字思路:莫队裸题,用一个cnt维护区间数字的数量就能实现o(1)转移了错误及反思:代码:#include<bits/stdc++.h> using namespace std; const int maxn= 50000+10; const int maxm= 1000000+10; int pos[maxn]; int cnt[maxm]; int a

Roll_Keyboard的博客 402

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

BZOJ 1036 树的统计Count(树链剖分)

题意:给你一棵树,n个节点,每个节点都有一个val,现在进行q次操作,操作有三种,第一种查询u到v的最大值,第二种,查询u到v的val和,第三种,将某个点修改val思路:树链剖分基本题,相比起前面几道树链剖分,这个题维护的是点,虽然我们从理论上来说,树链剖分是根据边来剖分的,但是其实我们维护的时候维护点更简单,所以这个题虽然写起来麻烦一点,但是逻辑上反而更顺 用两颗线段树分别维护最大值和最小值,和

Roll_Keyboard的博客 375

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

bzoj2599/洛谷4149 [IOI2011] Race(树分治)

题意:洛谷的地址 给一棵树,每条边有权。求一条简单路径,权值和等于 K ,且边的数量最小。思路:这题bzoj下线了,就去洛谷上A的 其实是一个比较简单的点分治 但是这题和之前的点分治不太一样(这题),这里的要求和之前不一样,我们不能算完重心的情况再去算子树的情况了 我们换一个思路,我们先遍历一颗以重心的儿子为根的子树,然后和一个之前的num(num[i]表示,到重心距离为i时最少经过几个边)

Roll_Keyboard的博客 365

BZOJ 4034 树上操作(树链剖分)

题意:思路:这题让我对树剖的体会更加深入了 因为我们在组链(也就是划分轻重边)的时候,是使用dfs序来进行划分的,所以我们子树的节点也依旧是在一起的,也就是说,树剖的时候顺便标记下dfs完自己子树时候的标号,就可以顺便完成dfs序时的标号要求了错误及反思:这题没什么难的。。主要是对树剖的体会更深了代码:#include<bits/stdc++.h> using namespace std; con

Roll_Keyboard的博客 353

bzoj 1086 王室联邦 (dfs,构造)

题意: 思路: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先我们dfs,如果一个节点v的儿子u所在的子树大于等于B,那么就把这个子树当作一个省份,对于这种情况,省会是u,v其实都可以。如果一个儿子u所在的子树小于B,可以先暂存起来,继续遍历其他儿子,当暂存的数量大于等于B的时候,将暂存的都归为一个省,省会为v,因为会暂存的子树大小为B-1,所以这样产生的子树大小最大为2B-2,在...

Roll_Keyboard的博客 347

bzoj 3626 LCA (树链剖分)

题意:思路:比较有意思的树链剖分 首先对于两个点lca的深度,我们发现就是两点和根的连线的重叠部分,那么我们就可以先把一个点到根的所有点都染下色,再用另一个点去查看到根有几个点被染色了 然后想怎么处理那么多区间,根据之前说的,我们可以把[l,r]中所有的点都看作第一个点,z看作第二个点,这样我们离线了提问,然后一边把点放进去一边查询即可错误及反思:l是可以为0的,bzoj有时候数据不会给的很细致

Roll_Keyboard的博客 320
上一篇: 网络流24题
下一篇: 有趣题目和认知合集(持续更新)
Roll_Keyboard
码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值