题目描述

给定一个长度为N的颜色序列C,对于该序列中的任意一个元素Ci,都有1<=Ci<=M。对于一种颜色ColorK来说,区间[L,R]内的权值定义为这种颜色在该区间中出现的次数的平方,即区间[L,R]内中满足Ci=ColorK的元素个数的平方。接下来给出Q个询问,询问区间[L,R]内颜色[a,b]的权值总和。

输入

第1行三个整数N,M,Q。分别代表序列长度,颜色总数和询问总数。
第2行N个整数,代表序列Ci。
第3行到第Q+2行,每行4个整数l,r,a,b。记上一次计算出的答案为Lans。那么实际的l,r,a,b为给出的l,r,a,b xor上Lans。第一个询问的时候Lans=0。

输出

总共Q行,对于每一个询问,输出权值总和

样例输入

4 2 3
1 1 2 2 
1 4 1 2
10 11 9 10
3 0 0 0

样例输出

8
2
0


题解

分块

这种二叉数据结构维护不了,又强制在线的,大概就是分块了。

维护 $f[i][j][k]$ 表示从第 $i$ 块到第 $j$ 块,权值在 $[1,k]$ 之间的个数平方和。为了方便处理零碎部分,还要维护 $c[i][j][k]$ 表示从第 $i$ 块到第 $j$ 块,权值为 $k$ 的个数。

对于询问转化为权值的前缀相减处理,整块部分直接拿出答案,零碎部分暴力枚举,算出对平方和的贡献。

设块的大小为 $si$ ,则预处理时间复杂度为 $O(n·(\frac n{si})^2)$ ,询问时间复杂度为 $O(n·si)$ 。根据均值不等式,当 $si=n^{\frac 23}$ 时复杂度最优,为 $O(n^{\frac 53})$

#include <cstdio>
#include <cstring>
typedef unsigned int ui;
ui a[50010] , f[40][40][20010] , c[40][40][20010] , sum[20010] , cnt[20010];
int main()
{
ui n , m , q , si = 1 , i , j , k , l , r , x , y , bl , br , ans = 0;
scanf("%u%u%u" , &n , &m , &q);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i]);
while(si * si * si < n * n) si ++ ;
for(i = 1 ; i <= (n - 1) / si + 1 ; i ++ )
{
for(j = i ; j <= (n - 1) / si + 1 ; j ++ )
{
for(k = (j - 1) * si + 1 ; k <= j * si && k <= n ; k ++ ) sum[a[k]] += cnt[a[k]] << 1 | 1 , cnt[a[k]] ++ ;
for(k = 1 ; k <= m ; k ++ ) c[i][j][k] = cnt[k] , f[i][j][k] = sum[k] + f[i][j][k - 1];
}
memset(sum , 0 , sizeof(sum));
memset(cnt , 0 , sizeof(cnt));
}
while(q -- )
{
scanf("%u%u%u%u" , &l , &r , &x , &y) , l ^= ans , r ^= ans , x ^= ans , y ^= ans;
bl = (l - 1) / si + 1 , br = (r - 1) / si + 1 , ans = f[bl + 1][br - 1][y] - f[bl + 1][br - 1][x - 1];
if(bl == br)
{
for(i = l ; i <= r ; i ++ ) if(a[i] >= x && a[i] <= y) ans += cnt[a[i]] << 1 | 1 , cnt[a[i]] ++ ;
for(i = l ; i <= r ; i ++ ) if(a[i] >= x && a[i] <= y) cnt[a[i]] -- ;
}
else
{
for(i = l ; i <= bl * si ; i ++ ) if(a[i] >= x && a[i] <= y) ans += (c[bl + 1][br - 1][a[i]] + cnt[a[i]]) << 1 | 1 , cnt[a[i]] ++ ;
for(i = r ; i > (br - 1) * si ; i -- ) if(a[i] >= x && a[i] <= y) ans += (c[bl + 1][br - 1][a[i]] + cnt[a[i]]) << 1 | 1 , cnt[a[i]] ++ ;
for(i = l ; i <= bl * si ; i ++ ) if(a[i] >= x && a[i] <= y) cnt[a[i]] -- ;
for(i = r ; i > (br - 1) * si ; i -- ) if(a[i] >= x && a[i] <= y) cnt[a[i]] -- ;
}
printf("%u\n" , ans);
}
return 0;
}

【bzoj2906】颜色 分块的更多相关文章

  1. bzoj2906 颜色 分块+块大小分析

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2906 题解 如果可以离线的话,那么这个题目就是一个莫队的裸题. 看上去这个数据范围也还会一个根 ...

  2. Luogu 1903 数颜色 | 分块

    Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...

  3. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

  4. BZOJ 2120: 数颜色 分块

    2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  5. 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块

    [BZOJ2453]维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色 ...

  6. 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分

    题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...

  7. Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] ...

  8. bzoj2120 数颜色 分块

    分块大法好 orz 处理出每个点的前驱和后继位置. 暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了 #include<cstdio> #include<cstr ...

  9. #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]

    bitset压位,因为是颜色数,直接倍增,重合部分不管,没了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #d ...

随机推荐

  1. 20155331 丹增旦达 2006-2007-2 《Java程序设计》第二周学习总结

    20155331 丹增旦达 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一 ,类型.变量与运算符 一.数据类型 1, 分类: 基本数据类型 byte:字节 ...

  2. 思维水题 poj1852

    题目链接:http://poj.org/problem?id=1852 题意:木板长为n,    蚂蚁数量为k,    后面k个数,依次代表蚂蚁的位置,  当蚂蚁到达边界的时候会立马掉下,当两个蚂蚁相 ...

  3. MYSQL--慢查询,卡死等处理

    命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接. show processlist;只列出前100条,如果想全列 ...

  4. Yii2 使用 faker 生成假数据

    测试过程中有时候需要生成大量的假数据,faker 是一个生成假数据的类库,可以生成姓名,电话,IP地址,密码,ISBN等等你能想到的或者你想不到的各种类型的假数据. Yii2.0已经集成该类库,不用再 ...

  5. 《手把手教你学DSP-基于TMS320F28335》书中的错误

    1. 在书的345页,这种字符串写法是错误的,char *msg. 2. 估计张卿杰可能是个学着.书的风格感觉就是翻译的PDF文档.

  6. CentOS 下 Java 的下载、安装、配置

    CentOS 下 Java 的下载.安装.配置 系统: CentOS 7 x86_64 Java 版本: 1.8.0_171 本文将 Java 目录放在 /usr/local/java 文件夹下,读者 ...

  7. VS2013只显示会附加到进程,无法启动调试

    今天在使用VS2013的时候,打开突然发现,只显示附加到进程,无法进行调试,调试位置显示灰色,到网上各处寻求答案,本以为是个大问题,没想到只是个小问题.主要原因只是后台开太多东西了,导致VS2013运 ...

  8. Pycharm主菜单学习

    “工欲善其事,必先利其器”,这话我一直是这么坚信的! 找到一款顺手称心的工具,拥有它,熟练地使用它! Pycharm据说就是使用Python的一款最好的工具—— 于是,开始了第一步的学习----先从熟 ...

  9. AVL树 算法思想与代码实现

    AVL树是高度平衡的二叉搜索树,按照二叉搜索树(Binary Search Tree)的性质,AVL首先要满足: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不为空, ...

  10. HDU 5391Z ball in Tina Town 数论

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5391 bc:  http://bestcoder.hdu.edu.cn/contests/c ...