【bzoj2906】颜色 分块
题目描述
输入
输出
总共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】颜色 分块的更多相关文章
- bzoj2906 颜色 分块+块大小分析
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2906 题解 如果可以离线的话,那么这个题目就是一个莫队的裸题. 看上去这个数据范围也还会一个根 ...
- Luogu 1903 数颜色 | 分块
Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块
[BZOJ2453]维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色 ...
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...
- Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 578 Solved: 247[Submit][Status][Discuss] ...
- bzoj2120 数颜色 分块
分块大法好 orz 处理出每个点的前驱和后继位置. 暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了 #include<cstdio> #include<cstr ...
- #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]
bitset压位,因为是颜色数,直接倍增,重合部分不管,没了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #d ...
随机推荐
- 20155328 实验四 Android程序设计 实验报告
20155328 实验四 Android程序设计 第24章 初识Android 提交点1:完成HelloWorld并显示自己的学号 安装Android Studio后,创建了属于自己的Project( ...
- 20155330 2016-2017-2 《Java程序设计》第一周学习总结
教材学习内容总结 第一章 Java平台概论 学习目标 Java版本迁移简介 认识Java SE.Java EE.Java ME 了解JVM.JRE与JDK 下载与安装JDK 章节主要内容 第二章 从J ...
- 封印解除:如何在Win10家庭版中启用组策略
@echo off pushd "%~dp0" *.mum >List.txt *.mum >>List.txt for /f %%i in ('findstr ...
- SaltStack入门篇(一)之SaltStack部署
一.SaltStack概述 Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, ...
- springboot中maven加入本地jar
一.今天遇到一个问题,在使用springboot打jar的时候出现了本地依赖包打不进去的情况.然后在网上试了很多方式.这里做一个记录 二.加入本地依赖包 <dependency> < ...
- ios 9.1以后 添加libz.dylib 方法
1. 进入你项目的build phases 2.点击+号在弹出的对话框选择addother 3.在弹出的对话框中输入"cmd"+"shift"+"g& ...
- PHP 行为测试工具 Codeception (介绍)
原文地址:https://phphub.org/topics/25 Codeception 简介 Codeception 简单来说, 分为以下几种测试 Acceptance Tests 验收测试 Fu ...
- XAF-物料管理信息工作日志
前段时间已经开始了第一阶段验收了,客户方并未把重点放在业务流程上面,一直在调整一些界面问题.有点小纠结. 今天要调一下菜单位置. 没修改时,是这样的: 到了列表界面,会多一个全文检索出来. 后来,客户 ...
- Jmeter接口测试(一) Jmeter简介
一.Jmeter介绍 (一)Jmeter简介 Apache JMeter 是 Apache 组织的开放源代码项目,是一个纯 Java 桌面应用,用于压力测试和性能测试.它最初被设计用于 Web 应用测 ...
- 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍
使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...