题目描述

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

经过不懈努力,君君集齐了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. hbase 聚合操作

    hbase本身提供了 聚合方法可以服务端聚合操作 hbase中的CoprocessorProtocol机制. CoprocessorProtocol的原理比较简单,近似于一个mapreduce框架.由 ...

  2. Luogu P1530 分数化小数 Fractions to Decimals(模拟)

    P1530 分数化小数 Fractions to Decimals 题意 题目描述 写一个程序,输入一个形如\(N/D\)的分数(\(N\)是分子,\(D\)是分母),输出它的小数形式.如果小数有循环 ...

  3. JDK8日期时间操作小汇总

    统一使用java.time.*包下的类 1.获取当前的日期.时间.日期加时间 LocalDate todayDate = LocalDate.now(); //今天的日期 LocalTime now ...

  4. TZ_08_maven把第三方 jar 包放入本地仓库或私服

    --安装第三方jar包到本地仓库 需求:首先下载jar包并且找到对应的 -DgroupId=? -DartifactId=? -Dversion=? -Dpackaging=jar  -Dfile=j ...

  5. TZ_08_maven私服项目的上传和下载

    1. 需求 正式开发,不同的项目组开发不同的工程. ssm_dao工程开发完毕,发布到私服. 2下载 nexus   Nexus 是 Maven 仓库管理器,通过 nexus 可以搭建 maven 仓 ...

  6. js构造函数+原型

    注:普通对象与函数对象 var o1 = {}; var o2 =new Object(); var o3 = new f1(); function f1(){}; var f2 = function ...

  7. 读书笔记--Spring in Action 目录

    1.Spring之旅 1.1 简化java 开发 1.1.1 激发pojo 的潜能 1.1.2 依赖注入1.1.3 应用切面1.1.4 使用模板消除样板式代码1.2 容纳你的bean1.2.1 与应用 ...

  8. svn清理以下路径失败

    网上说是svn的数据库挂了 删除里免得数据就好了 用sqllite...嗯? 那我还得下载一个?超过五秒钟的工作我是不会去做的 打开navicat 清空表 再次尝试清理

  9. hql 条件查询 返回空的一种情况

    为何会出现查询为空,但是查询整个表没问题的情况呢? 这里是没有分清字符串和变量 原来写的是, String hql = "from ClientInfoModel where clientI ...

  10. MySQL笔记<一>创建数据库和表

    参考博客 https://www.cnblogs.com/sqbk/p/5806797.html https://www.cnblogs.com/tomasman/p/7151962.html