拆位线段树 E. XOR on Segment

news/2024/10/18 9:22:01/

Problem - E - Codeforces

image-20231114022626849

区间求和,区间异或的操作跟线段树的区间求和、区间相见相似,考虑用线段树。

发现数组初始值最多是1e6,有不到25位,可以知道异或最大值是这些位数全是1的情况。

发现可以对每一位进行运算就和。

我们开23个线段树表示每一位的情况,根据位运算求出每一位的贡献即可。

注意ans需要开LL,且数组不能开大,不能全用long long

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <ctime>
#include <random>
#include <sstream>
#include <numeric>
#include <stdio.h>
#include <functional>
#include <bitset>
#include <algorithm>
using namespace std;// #define Multiple_groups_of_examples
// #define int_to_long_long
#define IOS std::cout.tie(0);std::cin.tie(0)->sync_with_stdio(false); // 开IOS,需要保证只使用Cpp io流 *
#define dbgnb(a) std::cout << #a << " = " << a << '\n';
#define dbgtt cout<<" !!!test!!! "<<'\n';
#define rep(i,x,n) for(int i = x; i <= n; i++)#define all(x) (x).begin(),(x).end()
#define pb push_back
#define vf first
#define vs secondtypedef long long LL;
#ifdef int_to_long_long
#define int long long
#endif
typedef pair<int,int> PII;const int INF = 0x3f3f3f3f;
const int N = 2e5 + 21;// 异或 线段树板子
struct SegTree {static const int N = 1e5 + 21;struct node {int l, r;LL sum,lz;}tr[N << 2];// 左子树int w[N];inline int ls(int p) {return p<<1; }// 右子树inline int rs(int p) {return p<<1|1; }// 向上更新void pushup(int u) {tr[u].sum = tr[ls(u)].sum + tr[rs(u)].sum;}// 向下回溯时,先进行更新void pushdown(int u) { // 懒标记,该节点曾经被修改,但其子节点尚未被更新。auto &root = tr[u], &right = tr[rs(u)], &left = tr[ls(u)];if(root.lz) {right.lz ^=1; right.sum = (right.r - right.l + 1 - right.sum);left.lz ^= 1; left.sum = (left.r - left.l + 1 - left.sum);root.lz = 0;}}// 建树void build(int u, int l, int r) {if(l == r) tr[u] = {l, r, w[r], 0};else {tr[u] = {l,r}; // 容易忘int mid = l + r >> 1;build(ls(u), l, mid), build(rs(u), mid + 1, r);pushup(u);}}// 修改void modify(int u, int l, int r, int d) {if(tr[u].l >= l && tr[u].r <= r) {tr[u].lz ^= 1;tr[u].sum = (tr[u].r - tr[u].l + 1 - tr[u].sum);}else {pushdown(u);int mid = tr[u].l + tr[u].r >> 1;if(l <= mid) modify(ls(u), l ,r, d);if(r > mid) modify(rs(u), l, r, d);pushup(u);}}// 查询LL query(int u, int l, int r) {if(tr[u].l >= l && tr[u].r <= r) {return tr[u].sum;}pushdown(u);int mid = tr[u].l + tr[u].r >> 1;LL sum = 0;if(l <= mid) sum = query(ls(u), l, r);if(r > mid ) sum += query(rs(u), l, r);return sum;}
}tree[23];void inpfile();
void solve() {int n; cin>>n;vector<int> ad(n + 1);for(int i = 1; i <= n; ++i) cin>>ad[i];for(int i = 1; i <= n; ++i) {for(int j = 0; j < 22; ++j) {// ad[i] 的第j位是0还是1tree[j].w[i] = (ad[i] >> j) & 1;}}// 建树for(int i = 0; i < 22; ++i) tree[i].build(1,1,n);int q; cin>>q;while(q--) {int opt, x, y, v;cin>>opt>>x>>y;if(opt == 1) {LL ans = 0;// 求出每一位的贡献相加即为答案for(int i = 0; i < 22; ++i) ans += (LL)tree[i].query(1,x,y) * (1 << i);cout<<ans<<endl;} else {cin>>v;for(int i = 0; i < 22; ++i) {// 每一位进行修改int t = (v >> i) & 1;if(!t) continue;tree[i].modify(1,x,y,1);}}}
}
#ifdef int_to_long_long
signed main()
#else
int main()
#endif{#ifdef Multiple_groups_of_examplesint T; cin>>T;while(T--)#endifsolve();return 0;
}
void inpfile() {#define mytest#ifdef mytestfreopen("ANSWER.txt", "w",stdout);#endif
}

XOR on Segment - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

CF242E XOR on Segment (拆位线段树)_牛客博客 (nowcoder.net)


http://www.ppmy.cn/news/1215706.html

相关文章

【PyTorch教程】如何使用PyTorch分布式并行模块DistributedDataParallel(DDP)进行多卡训练

本期目录 1. 导入核心库2. 初始化分布式进程组3. 包装模型4. 分发输入数据5. 保存模型参数6. 运行分布式训练7. DDP完整训练代码 本章的重点是学习如何使用 PyTorch 中的 Distributed Data Parallel (DDP) 库进行高效的分布式并行训练。以提高模型的训练速度。 1. 导入核心库 D…

SharePoint-连接Excel

Power Automate和Power Apps想要连接Excel表格的话&#xff0c;可以在OneDrive或SharePoint网站的文档中创建Excel文件&#xff0c;然后把Excel转换成table表格 以SharePoint为例&#xff0c;在文档中点击新建&#xff0c;选择Excel工作簿 填写内容&#xff0c;然后全选选中 在…

ChatGPT重磅升级 奢侈品VERTU推出双模型AI手机

2023年11月7日,OpenAI举办了首届开发者大会,CEO Sam Altman(山姆奥尔特曼)展示了号称“史上最强”AI的GPT-4 Turbo。它支持长达约10万汉字的输入,具备前所未有的长文本处理能力,使更复杂的互动成为可能。此外,GPT-4 Turbo还引入了跨模态API支持,可以同时处理图片、视频和声音,从…

wpf devexpress项目中添加GridControl绑定数据

本教程讲解了如何添加GridControl到wpf项目中并且绑定数据 原文地址Lesson 1 - Add a GridControl to a Project and Bind it to Data | WPF Controls | DevExpress Documentation 1、使用 DevExpress Template Gallery创建一个新的空白mvvm应用程序&#xff0c;这个项目包括了…

java学习part02一些特性

17-Java语言概述-Java语言的特点和JVM的功能_哔哩哔哩_bilibili 1.java优点 跨平台性 在jvm上运行 2.jvm 2.1实现跨平台性 不需要对每一种指令集编写编译器&#xff0c;只需要针对jvm编程&#xff0c;jvm会自动转换 2.2内存回收 内存溢出&#xff1a;用的内存太多已经占满了&…

JVM及其垃圾回收机制(GC)

目录 一.JVM内存区域划分 二.JVM类加载机制 类加载过程 类加载的时机 双亲委派模型 三.JVM垃圾回收机制&#xff08;GC) GC工作过程 1.找到垃圾/判断垃圾 &#xff08;1&#xff09;引用计数【python/PHP】 &#xff08;2&#xff09;可达性分析【Java】 2.对象释放…

Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

Django路由层

路由层&#xff08;urls&#xff09; Django的路由层是负责将用户请求映射到相应的视图函数的一层。在Django的MVT架构中&#xff0c;路由层负责处理用户的请求&#xff0c;然后将请求交给相应的视图函数进行处理&#xff0c;最后将处理结果返回给用户。 在Django中&#xff0c…