当前位置: 首页 > 编程日记 > 正文

【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...

题意:给出N个数,M个操作。操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和。n,m<=100000,ai<=1000

题解:

当年(其实也就是今年)做不出来的题。。D1T1啊。。。

因为ai<=1000,我们可以拆位处理。拆成10个二进制位,每位开1棵线段树。

对于每个节点,维护:

d:这段区间的异或和

L[0],L[1]:子区间一定从左端点开始,异或和为0,1的子区间分别有多少个

R[0],R[1]:子区间一定从右端点开始,异或和为0,1的子区间分别有多少个

s[0],s[1]:异或和为0,1的子区间分别有多少个

然后重点就是合并啦。

 1 node upd(int ind,int tmp,node lc,node rc)
 2 {
 3     int dl=lc.d,dr=rc.d;
 4     node x;
 5     if(tmp!=0) x=t[ind][tmp];
 6     x.d=lc.d^rc.d;
 7     x.L[0]=(lc.L[0]+rc.L[(dl==0) ? 0:1])%mod;
 8     x.L[1]=(lc.L[1]+rc.L[(dl==0) ? 1:0])%mod;
 9     x.R[0]=(rc.R[0]+lc.R[(dr==0) ? 0:1])%mod;
10     x.R[1]=(rc.R[1]+lc.R[(dr==0) ? 1:0])%mod;
11     x.s[0]=(lc.s[0]+rc.s[0]+(lc.R[0]*rc.L[0])%mod+(lc.R[1]*rc.L[1])%mod)%mod;
12     x.s[1]=(lc.s[1]+rc.s[1]+(lc.R[0]*rc.L[1])%mod+(lc.R[1]*rc.L[0])%mod)%mod;
13     return x;
14 }

我打成node形式。。因为最后查询的时候有多个区间也要合并。。

代码:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<iostream>
  6 #include<algorithm>
  7 using namespace std;
  8 
  9 typedef long long LL;
 10 const int N=100010;
 11 const LL mod=100000007;
 12 struct node{
 13     int l,r,lc,rc,d;
 14     LL L[2],R[2],s[2];
 15     //L:从左开始
 16     //R:从右开始
 17     //s:总答案
 18 }t[10][2*N];
 19 char c[10];
 20 int n,m,tl,a[N][10];
 21 LL bit[15];
 22 
 23 node upd(int ind,int tmp,node lc,node rc)
 24 {
 25     int dl=lc.d,dr=rc.d;
 26     node x;
 27     if(tmp!=0) x=t[ind][tmp];
 28     x.d=lc.d^rc.d;
 29     x.L[0]=(lc.L[0]+rc.L[(dl==0) ? 0:1])%mod;
 30     x.L[1]=(lc.L[1]+rc.L[(dl==0) ? 1:0])%mod;
 31     x.R[0]=(rc.R[0]+lc.R[(dr==0) ? 0:1])%mod;
 32     x.R[1]=(rc.R[1]+lc.R[(dr==0) ? 1:0])%mod;
 33     x.s[0]=(lc.s[0]+rc.s[0]+(lc.R[0]*rc.L[0])%mod+(lc.R[1]*rc.L[1])%mod)%mod;
 34     x.s[1]=(lc.s[1]+rc.s[1]+(lc.R[0]*rc.L[1])%mod+(lc.R[1]*rc.L[0])%mod)%mod;
 35     return x;
 36 }
 37 
 38 int bt(int ind,int l,int r)
 39 {
 40     int x=++tl;
 41     t[ind][x].l=l;t[ind][x].r=r;
 42     t[ind][x].lc=t[ind][x].rc=0;
 43     t[ind][x].d=0;
 44     memset(t[ind][x].L,0,sizeof(t[ind][x].L));
 45     memset(t[ind][x].R,0,sizeof(t[ind][x].R));
 46     memset(t[ind][x].s,0,sizeof(t[ind][x].s));
 47     if(l<r)
 48     {
 49         int mid=(l+r)/2;
 50         t[ind][x].lc=bt(ind,l,mid);
 51         t[ind][x].rc=bt(ind,mid+1,r);
 52         int lc=t[ind][x].lc,rc=t[ind][x].rc;
 53         t[ind][x]=upd(ind,x,t[ind][lc],t[ind][rc]);
 54     }
 55     else 
 56     {
 57         int d=a[l][ind];
 58         t[ind][x].d=d;
 59         t[ind][x].L[d]=t[ind][x].R[d]=t[ind][x].s[d]=1;
 60     }
 61     return x;
 62 }
 63 
 64 void change(int ind,int x,int p,int d)
 65 {
 66     if(t[ind][x].l==t[ind][x].r) 
 67     {
 68         t[ind][x].d=d;
 69         t[ind][x].L[d]=t[ind][x].R[d]=t[ind][x].s[d]=1;
 70         t[ind][x].L[d^1]=t[ind][x].R[d^1]=t[ind][x].s[d^1]=0;
 71         return ;
 72     }
 73     int lc=t[ind][x].lc,rc=t[ind][x].rc,mid=(t[ind][x].l+t[ind][x].r)/2;
 74     if(p<=mid) change(ind,lc,p,d);
 75     else change(ind,rc,p,d);
 76     t[ind][x]=upd(ind,x,t[ind][lc],t[ind][rc]);
 77 }
 78 
 79 node query(int ind,int x,int l,int r)
 80 {
 81     if(t[ind][x].l==l && t[ind][x].r==r) return t[ind][x];
 82     int lc=t[ind][x].lc,rc=t[ind][x].rc,mid=(t[ind][x].l+t[ind][x].r)/2;
 83     if(r<=mid) return query(ind,lc,l,r);
 84     else if(l>mid) return query(ind,rc,l,r);
 85     else
 86     {
 87         node a0=query(ind,lc,l,mid);
 88         node a1=query(ind,rc,mid+1,r);
 89         return upd(0,0,a0,a1);
 90     }
 91 }
 92 
 93 void output(int ind,int x)
 94 {
 95     int lc=t[ind][x].lc,rc=t[ind][x].rc;
 96     printf("l=%d r=%d d=%d l0=%lld l1=%lld r0=%lld r1=%lld s0=%lld s1=%lld\n",t[ind][x].l,t[ind][x].r,t[ind][x].d,t[ind][x].L[0],t[ind][x].L[1],t[ind][x].R[0],t[ind][x].R[1],t[ind][x].s[0],t[ind][x].s[1]);
 97     if(lc) output(ind,lc);
 98     if(rc) output(ind,rc);
 99 }
100 
101 int main()
102 {
103     freopen("a.in","r",stdin);
104     freopen("me.out","w",stdout);
105     // freopen("cardcaptor.in","r",stdin);
106     // freopen("cardcaptor.out","w",stdout);
107     scanf("%d",&n);
108     int x,ind;node now;
109     bit[0]=1;
110     for(int i=1;i<=10;i++) bit[i]=bit[i-1]*2;
111     memset(a,0,sizeof(a));
112     for(int i=1;i<=n;i++) 
113     {
114         scanf("%d",&x);
115         ind=0;
116         while(x)
117         {
118             a[i][ind]=x%2;
119             x/=2;
120             ind++;
121         }
122     }
123     scanf("%d",&m);
124     for(int i=0;i<10;i++) {tl=0;bt(i,1,n);}
125     for(int i=1;i<=m;i++)
126     {
127         scanf("%s",c);
128         if(c[0]=='Q')
129         {
130             int l,r;LL ans=0;
131             scanf("%d%d",&l,&r);
132             for(int j=0;j<10;j++) 
133             {
134                 now=query(j,1,l,r);
135                 ans=(ans+(bit[j]*now.s[1])%mod)%mod;
136             }
137             printf("%lld\n",ans);
138         }
139         else
140         {
141             int ind=0,p,d;
142             scanf("%d%d",&p,&d);
143             while(d)
144             {
145                 change(ind,1,p,d%2);
146                 d/=2;
147                 ind++;
148             }
149             for(int j=ind;j<10;j++) change(j,1,p,0);
150         }
151     }
152     return 0;
153 }

转载于:https://www.cnblogs.com/KonjakJuruo/p/6028497.html

相关文章:

用composer安装laravel-bjyblog

前面讲了两行命令composer的安装&#xff0c;现在我们来操作一下composer安装基于laravel的博客laravel-bjyblog。测试环境是linux&#xff0c;bt面板&#xff0c;php7.2安装扩展fileinfo/opcache/redis/imagemagick/imap/exif&#xff0c;禁用 proc_open 函数 下面开始安装&am…

微信小程序多项选择器_微信小程序三级联动之多列选择器

有些时候&#xff0c;三级联动业务场景并不只是全国地区选择&#xff0c;可能还涉及到自定义分类的三级联动&#xff0c;这时就需要使用微信的多列选择器。如果只是一列字段&#xff0c;或者每次拖动一次都去服务端取&#xff0c;会比较容易。 如果想一次定义好json,关联数据相…

eosjs-ecc中文文档

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 eosjs-ecc是eos官方处理密钥和签名的javascript开发包。访问地址&#xff1a;eosjs-ecc中文手册。 eosjs-ecc安装 nodejs环境下&#xff0c;使用N…

rocketmq 组监听_最全的RocketMQ学习指南,程序员必备的中间件技能

一、简介RocketMq是阿里开发出来的一个消息中间件&#xff0c;后捐献给Apache。官网上是这样介绍的&#xff1a; Apache RocketMQ™ is a unified messaging engine, lightweight data processing platform.RocketMQ是一个统一的处理消息引擎&#xff0c;轻量级的数据处理平台。…

【刷题】BZOJ 4516 [Sdoi2016]生成魔咒

Description 魔咒串由许多魔咒字符组成&#xff0c;魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。 例如 S[1,2,1] 时&#xff0c;它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种…

jQuery的文档操作方法

jQuery 文档操作方法 这些方法对于 XML 文档和 HTML 文档均是适用的&#xff0c;除了&#xff1a;html()。 方法描述addClass()向匹配的元素添加指定的类名。after()在匹配的元素之后插入内容。append()向匹配元素集合中的每个元素结尾插入由参数指定的内容。appendTo()向目标结…

原 EOS智能合约开发入门

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS智能合约的开发需要使用llvm和abigen来生成abi文件。 为此eos提供了一个 名为eosiocpp的工具。 在这篇文章中&#xff0c;我们介绍如何使用这个工…

python安装虚拟环境virtualenv

虚拟环境 虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具&#xff0c;它给这些工程创建虚拟的Python环境。它解决了“项目X依赖于版本1.x&#xff0c;而项目Y需要项目4.x”的两难问题&#xff0c;而且使你的全局site-packages目录保持干净和可管理。 比如&…

可变分区存储管理实验报告总结_操作系统实验报告-可变分区存储管理方式的内存分配回收...

一&#xff0e;实验目的(1)深入了解可变分区存储管理方式的内存分配回收的实现。二&#xff0e;实验内容编写程序完成可变分区存储管理方式的内存分配回收&#xff0c;要求有内存空间分配表&#xff0c;并采用最优适应算法完成内存的分配与回收。三&#xff0e;实验原理在可变分…

ubuntu/linuxmint如何添加和删除PPA源

【添加】 1、sudo add-apt-repository ppa:user/ppa-name 2、sudo apt-get update (然后再安装软件sudo apt-get install <package-name>或更新软件sudo apt-get upgrade) 【删除】 1、cd /etc/apt/source.list.d/ 2、sudo rm <ppa-name> 转载于:https://www.cnblo…

了解EOS看这一篇就够了一、团队二、技术三、项目进度四、争议和风险五、展望

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 无论是混迹于币圈、链圈还是矿圈&#xff0c;对BTC&#xff08;比特币&#xff09;、ETH&#xff08;以太坊&#xff09;、EOS这三大主流币一定不会…

qt 多个模型如何显示在表格中_Qt MOOC系列教程 第五章第四节:QML中的C++模型

我们已经多次讨论过如何创建自己的模型来表示QML中的数据&#xff0c;并且在上一节中我们看到了QStandardItemModel的基本示例。通常&#xff0c;出于性能和功能方面的原因&#xff0c;需要从一开始就要实现自己的模型。QAbstactItemModel类为项目模型类提供了抽象接口&#xf…

ubuntu终端基础命令

1. 启动终端的快捷键: ctr alt t2. 终端字体放大: ctrshift3. 终端字体放大: ctr-4. ls : 查看当前目录的文件信息 4.1 ls 路径&#xff1a; 查看指定目录的信息 4.1. pwd: 查看目录所在的路径5. touch: 创建文件 5.1 touch 1.txt 2.txt 创建多个文件6. mkdir: 创建…

js中操作数组的一些方法

增 push 在数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 array.push(1,2,3.........) unshift 在数组的开头添加一个或多个元素&#xff0c;并返回新的长度。 array.unshift(1,2,3......) splice 在制定位置添加一个活多个元素&#xff0c;splice(s…

a标签怎么传参_jsp页面中怎么利用a标签的href进行传递参数以及需要注意的地方...

jsp页面中&#xff1a;这是正确写法。需要注意的地方&#xff1a;1、传递的参数是数字2、传递的参数是字符串注意多了个单引号后台直接用request.getParameter("productIdStr"); 接收就可以了。此处也有要注意的地方&#xff1a;接收后要进行判空&#xff0c;否则会报…

转】windows下使用批处理脚本实现多个版本的JDK切换

原博文出自于:  http://www.cnblogs.com/xdp-gacl/p/5209386.html      感谢&#xff01; 一.JDK版本切换批处理脚本 我们平时在window上做开发的时候&#xff0c;可能需要同时开发两个甚至多个项目&#xff0c;有时不同的项目对JDK的版本要求有区别&#xff0c;这时候…

mysql引擎介绍

1.myisam存储引擎&#xff1a;不支持事务&#xff0c;也不支持外键&#xff0c;优势是访问速度快&#xff0c;对事务完整性没有要求或者以select&#xff0c;insert为主的应用基本上可以用这个引擎来创建表。 2.innodb存储引擎&#xff1a;innodb引擎提供了具有提交&#xff0c…

为什么2100万个BTC发行总量少了0.0231?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 许多人只是听说比特币的总数为2100万个&#xff0c;但不知道这个数字的准确来源。实际上&#xff0c;2100万个只是一个近似数&#xff0c;精确的数…

Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”

Navicat连接数据库成功&#xff0c;新建查询时提示错误“Cannot create file ……” 原因:编辑连接{高级}<设置位置>被修改&#xff0c;该oci.dll不正确 解决方案&#xff1a;删除该连接信息&#xff0c;重新新建。编辑连接{高级}<设置位置>会自动生成&#xff0c;…

[深入React] 2.综述

在开始本教程前&#xff0c;请先查看官方示例&#xff1a;https://github.com/facebook/react/archive/master.zip 里的 examples 目录。 学习react是一个循序渐进的过程&#xff0c;虽然它概念较少&#xff0c;但在思想上和jQuery相差甚远。我在学的时候也是边开发边查官方文档…

element select 自动展开_原生js 让select下拉框自动展开 可用size 属性来代替展开动作...

找遍全网都没一个比较好的例子&#xff01;&#xff01;&#xff01;什么获得焦点事件&#xff0c;或者添加一个点击事件都不能使下拉框自动展开最后用标签的siz属性定义和用法size 属性规定下拉列表中可见选项的数目。如果 size 属性的值大于 1&#xff0c;但是小于列表中选项…

一文看懂怎样用 Python 创建比特币交易

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币价格的上上下下&#xff0c;始终撩动着每一个人无比关切的小心脏。从去年初的 800 美元左右&#xff0c;飞涨到去年底到 19783.21 美元最高点…

[转]mysql 数据类型

原文地址:https://github.com/jaywcjlove/handbook/blob/master/MySQL/MySQL%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.md MySQL数据类型 数字类型 整数: tinyint、smallint、mediumint、int、bigint浮点数: float、double、real、decimal日期和时间: date、time、datetime、times…

dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件&#xff0c;它和我们传统Winform的TreeView控件使用上有所不同&#xff0c;我一般在Winform开发中根据情况混合使用这些控件&#xff0c;不过整体来看&#xff0c;基于DevExp…

util包下的Date与sql包下的Date之间的转换

Java中的时间类型 java.sql包下给出三个与数据库相关的日期时间类型&#xff0c;分别是&#xff1a; Date&#xff1a;表示日期&#xff0c;只有年月日&#xff0c;没有时分秒。会丢失时间&#xff1b; Time&#xff1a;表示时间&#xff0c;只有时分秒&#xff0c;没有年月日。…

【MySQL解惑笔记】忘记MySQL数据库密码

破解MySQL密码 一、MySQL5.7.5之前 只要有系统root密码就可以破解&#xff1a; [roothost-131 ~]# vim /etc/my.cnf //在配置文件中加入如下内容 [mysqld] skip-grant-tables[roothost-131 ~]# systemctl restart mysqld //重启…

接口自动化测试框架

现在市面上做接口测试的工具很多&#xff0c;比如Postman&#xff0c;soapUI, JMeter, Python unittest等等&#xff0c;各种不同的测试工具拥有不同的特色。但市面上的接口测试工具都存在一个问题就是无法完全吻合的去适用没一个项目&#xff0c;比如数据的处理&#xff0c;加…

arcpy实现空间查询_布隆过滤!Python实现亿级数据集中元素快速查找

前段时间在做数据碰撞分析时&#xff0c;遇到一个在数亿级的int型数据集中查找30万个特定int值是否存在的需求&#xff0c;当时尝试了几种方式通过分片&#xff0c;然后做增量分析HashMap这两种方式第一种太慢&#xff0c;即使后面进一步实现了分布式计算&#xff0c;可仍然无法…

比特币如何实现—《区块链历史链条》2

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 11比特币为什么还没有挖完 比特币系统靠调节难度系数保证比特币不被太快挖完。每10分钟&#xff0c;全网矿工共同计算一道难题&#xff0c;竞争记账…

centos7 系统下搭建 lnmp 环境

目录 目录概述准备工作开始编译安装1. 安装 Nginx1. 解压2. 环境准备3. 编译过程4. Nginx 服务2. 安装 MySQL1. 解压2. 环境准备3. 安装 CMake 编译器&#xff1a;4. 编译过程5. 初始化数据库6. MySQL 服务3. 安装 PHP1. 安装依赖包2. 编译安装3. 配置 PHP4. 整合 LNMP1 编辑 N…