题目描述

君君是中山大学的四年级学生。有一天在家不小心开启了放置在爸爸书房中的一本古书。于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地。这时一只看上去四不像的可爱生物“封印之兽”可鲁贝洛斯从书中钻了出来,它告诉君君书中的牌叫“库洛牌”,现在散落各地已实体化,要君君将它们全部再次封印起来,以免危害世界,于是君君开始过上了收服“库洛牌”的旅程。

经过不懈努力,君君集齐了N 张库洛牌,最后的审判就要来临,为了战胜审判者月,君君开始研究起这N 张库洛牌的魔法效果。君君已经将N 张库洛牌从左到右依次排列好,这N 张库洛牌的魔法值从左到右依次为a1; a2; a3; …aN。她将告诉你这N 张库洛牌的魔法值。在最后的审判时,审判者月将会选择一个区间进行PK,君君预测了可能进行PK 的若干区间,她想请你帮助她计算这些区间的魔法效果,以便她更好地布置战术。一个区间内,所有连续子序列都会产生魔法效果。一个连续子序列p1; p2; p3; …; pk 的魔法效果定义为p1^p2^p3^…^pk(^表示异或)。一个区间的魔法效果定义为所有连续子序列的魔法效果的和。例如有5 张库洛牌,魔法值为1; 1; 2; 4; 5,询问区间[2; 4] 的魔法效果。区间[2; 4] 包含的连续子序列为‘‘1”; ‘‘2”; ‘‘4”; ‘‘1; 2”; ‘‘2; 4”; ‘‘1; 2; 4”, 它们的魔法值分别为1; 2; 4; 3; 6; 7,所以区间[2,4] 的魔法效果为1 + 2 + 4 + 3 + 6 + 7 = 23。

库洛牌的魔法效果狂拽炫酷吊炸天,这个值可能很大,所以你只需要输出这个值模100,000,007。另外,任性的君君可以在询问的过程中对库洛牌的魔法值进行修改。

现在,君君给出了M 个操作,操作格式如下:

1. M p x 表示将第p 张库洛牌的魔法值修改为x。

2. Q l r 表示询问区间[l; r] 的魔法效果。

Pascal 语言中,异或操作符为xor,C++ 语言中,异或操作符为^。

数据范围

30% 的数据:N,M<=300

另外20% 的数据:N,M<=30000, 操作1 的数量不超过50

80% 的数据:N,M<=30000

100% 的数据:N<=100000;M<=100000; 0<=ai, x<=1000

解法

位运算考虑按位操作,

使用线段树维护。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
#define ln(x,y) int(log(x)/log(y))
#define bit(x,y) ((x)&(1<<(y)))
using namespace std;
const char* fin="ex4359.in";
const char* fout="ex4359.out";
const int inf=0x7fffffff;
const int maxn=100007,maxt=maxn*4,maxk=10,mo=100000007;
int n,m,i,j,k,l;
int a[maxn];
struct point{
unsigned int l[2],r[2],m[2],x;
}nil;
void work(point &a,int v1,int key){
if (bit(v1,key)) a.l[0]=a.r[0]=a.m[0]=0,a.l[1]=a.r[1]=a.m[1]=a.x=1;
else a.l[0]=a.r[0]=a.m[0]=1,a.l[1]=a.r[1]=a.m[1]=a.x=0;
}
point merge(point a,point b){
point c;
int i;
for (i=0;i<=1;i++){
c.l[i]=a.l[i]+b.l[i^a.x];
c.r[i]=a.r[i^b.x]+b.r[i];
c.m[i]=a.m[i]+b.m[i]+a.r[0]*b.l[i^0]+a.r[1]*b.l[1^i];
}
c.x=a.x^b.x;
return c;
}
struct tree{
int key;
point c[maxt][maxk];
void plant(int l,int r,int t){
int mid=(l+r)/2;
if (l==r){
for (key=0;key<10;key++) work(c[t][key],a[l],key);
return;
}
plant(l,mid,t*2);
plant(mid+1,r,t*2+1);
for (key=0;key<10;key++) c[t][key]=merge(c[t*2][key],c[t*2+1][key]);
}
point find(int l,int r,int t,int v1,int v2,int key){
int mid=(l+r)/2;
if (l>v2 || r<v1) return nil;
if (l>=v1 && r<=v2) return c[t][key];
return merge(find(l,mid,t*2,v1,v2,key),find(mid+1,r,t*2+1,v1,v2,key));
}
void change(int l,int r,int t,int v,int v1){
int mid=(l+r)/2;
if (l==r){
for (key=0;key<10;key++) work(c[t][key],v1,key);
return ;
}
if (v<=mid) change(l,mid,t*2,v,v1);
else change(mid+1,r,t*2+1,v,v1);
for (key=0;key<10;key++) c[t][key]=merge(c[t*2][key],c[t*2+1][key]);
}
}T;
int main(){
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
T.plant(1,n,1);
scanf("%d\n",&m);
for (i=1;i<=m;i++){
char ch;
scanf("%c",&ch);
scanf("%d%d\n",&j,&k);
if (ch=='Q'){
ll ans=0;
for (l=0;l<10;l++){
ans=(ans+(ll)T.find(1,n,1,j,k,l).m[1]*(1<<l))%mo;
}
printf("%lld\n",ans);
}else{
T.change(1,n,1,j,k);
}
}
return 0;
}

启发

线段树可以说是一种可修改的分治算法。

【JZOJ4359】【GDKOI2016】魔卡少女的更多相关文章

  1. 【GDKOI2016】 魔卡少女 线段树

    题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作 每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和. 数据范围:$n,m≤10^5$,$a_i ...

  2. 魔卡少女(cardcaptor)——线段树

    题目 [题目描述] 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时 ...

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

    题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...

  4. GDKOI2016总结——被虐之旅

    前言 一个被虐的旅程... 这次GDKOI的比赛虽然基本全上暴力,但是居然只有两道题得了分:30+30=60!我感觉整个人都不好了... day0 在去广州的路上,本来心情很好,但是坐在我斜后面的那位 ...

  5. GDKOI 2016

    GDKOI 2016 day 1 第一题 魔卡少女 题目描述:维护一个序列,能进行以下两个操作:1.将某一个位置的值改变.2.求区间的连续子串的异或值的和. solution 因为序列的数的值都小于\ ...

  6. MVP on Board 没用小技巧 👌

    七月入选了微软 MVP,本文记录 on board 过程中遇到的小问题和没用小技巧. MVP Portal 当你收到来自微软的确认邮件之后,你将正式被接纳为微软现任 MVP 的一员.从此刻开始,你便拥 ...

  7. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  8. iOS--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook等系统服务开发汇总

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  9. iOS开发——高级技术&PassBook服务

    PassBook服务 Passbook是苹果推出的一个管理登机牌.会员卡.电影票.优惠券等信息的 工具.Passbook就像一个卡包,用于存放你的购物卡.积分卡.电影票.礼品卡等,而这些票据就是一个“ ...

随机推荐

  1. 分享一个百度大牛的Python视频系列下载

    好像是百度资深大数据工程师 在录制Python视频课程讲课,包括Python基础入门.数据分析.网络爬虫.大数据处理.机器学习.推荐系统等系列,他还在不停地录制,课程感觉很不错,视频网盘分享给大家 学 ...

  2. 用惯了jquery, 想用angularjs 还真不好理解

    jquery 比较直白,什么都是操作dom 节点. angularjs 就好比 thinkphp, ci 等框架,有自己约定的格式和方式.需要遵循它的规则,研究中... 比如说我,用了很长事件的jqu ...

  3. Laravel Carbon获取 某个时间后N个月的时间

    $time = "2020-11-20 00:00:00"; $res = (new Carbon)->setTimeFromTimeString($time)->ad ...

  4. Visual studio 编译错误 无法将文件obj\Debug\*.exe复制到bin\Debug\*.exe

    问题: 错误 未能将“obj\Debug\Server.exe”复制到“bin\Debug\Server.exe”.超出了重试计数 10.失败. Server 错误 无法将文件“obj\Debug\S ...

  5. Hackerrank--Divisibility of Power(Math)

    题目链接 You are given an array A of size N. You are asked to answer Q queries. Each query is of the for ...

  6. 使用Jedis操作Redis-使用Java语言在客户端操作---List类型

    在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将为该键创建 ...

  7. Python 可变类型和不可变类型,以及其引用

    基本数据类型的引用        在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址.访问这块内存需要用到变量名,变量名实际存储的是变量的 ...

  8. Nginx 编译设置模块执行顺序

    Nginx编译时,配置"--add-module=xxx"可以加入模块,当我们需要按照指定顺序来设置过滤模块执行顺序时,先配置的"--add-module=xxx&quo ...

  9. Leetcode59. Spiral Matrix II螺旋矩阵2

    给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, ...

  10. Django项目:CRM(客户关系管理系统)--15--07PerfectCRM实现King_admin显示注册的表01

    <th ><a href="/kingadmin/{% get_app_name admin_class.model %}/{% get_model_name admin_ ...