显然分块,由于颜色也有区间,我们的ans[l,r,k]表示块l和块r颜色1~k的权值和
所以我们块的大小要设为n^(2/3),其它没什么说的,比较水

 var f:array[..,..,..] of int64;
g:array[..,..] of longint;
s:array[..] of longint;
a,be,q:array[..] of longint;
ans,size,t,tot,i,l,r,n,m,te,x,y:longint; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure prework;
var i,j,k:longint;
begin
for i:= to n do
inc(g[be[i],a[i]]);
for i:= to t do
for j:= to m do
g[i,j]:=g[i-,j]+g[i,j];
for i:= to t do
begin
for j:=(i-)*size+ to n do
begin
if j mod size= then
begin
for k:= to m do
f[i,be[j],k]:=f[i,be[j]-,k];
end;
inc(f[i,be[j],a[j]],s[a[j]]*+);
inc(s[a[j]]);
end;
for j:=i to t do
for k:= to m do
inc(f[i,j,k],f[i,j,k-]);
fillchar(s,sizeof(s),);
end;
end; procedure clear;
var i:longint;
begin
for i:= to tot do
s[q[i]]:=;
end; function ask(l,r,x,y:longint):int64;
var i:longint;
begin
tot:=;
ask:=;
if be[l]=be[r] then
begin
for i:=l to r do
if (a[i]>=x) and (a[i]<=y) then
begin
if s[a[i]]= then
begin
inc(tot);
q[tot]:=a[i];
end;
ask:=ask+s[a[i]]*+;
inc(s[a[i]]);
end;
clear;
end
else begin
ask:=f[be[l]+,be[r]-,y]-f[be[l]+,be[r]-,x-];
for i:=l to be[l]*size do
if (a[i]>=x) and (a[i]<=y) then
begin
if s[a[i]]= then
begin
inc(tot);
q[tot]:=a[i];
s[a[i]]:=g[be[r]-,a[i]]-g[be[l],a[i]];
end;
ask:=ask+s[a[i]]*+;
inc(s[a[i]]);
end;
for i:=(be[r]-)*size+ to r do
if (a[i]>=x) and (a[i]<=y) then
begin
if s[a[i]]= then
begin
inc(tot);
q[tot]:=a[i];
s[a[i]]:=g[be[r]-,a[i]]-g[be[l],a[i]];
end;
ask:=ask+s[a[i]]*+;
inc(s[a[i]]);
end;
clear;
end;
end; begin
readln(n,m,te);
size:=;
while size*size/n*size<n do inc(size);
dec(size);
for i:= to n do
begin
read(a[i]);
be[i]:=(i-) div size+;
end;
t:=n div size;
if n mod size<> then inc(t);
prework;
for i:= to te do
begin
readln(l,r,x,y);
l:=l xor ans;
r:=r xor ans;
x:=x xor ans;
y:=y xor ans;
if l>r then swap(l,r);
if x>y then swap(x,y);
ans:=ask(l,r,x,y);
writeln(ans);
end;
end.

bzoj2906的更多相关文章

  1. 【bzoj2906】颜色 分块

    题目描述 给定一个长度为N的颜色序列C,对于该序列中的任意一个元素Ci,都有1<=Ci<=M.对于一种颜色ColorK来说,区间[L,R]内的权值定义为这种颜色在该区间中出现的次数的平方, ...

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

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

  3. [BZOJ2906]「颜色」

    为什么C++ (11)-O2如此之快,直接优化1000ms... 强制在线,只能分块了. 本题应当预处理出每个块到后面几个块的每种数的平方与数量的前缀和. 由于空间限制,块长只能开到n的2/3次方, ...

随机推荐

  1. 类似FirePhp的Chrome.php 调试php

    之前一直用firephp来调试php,主要受限Firefox启动太慢,研究了下chromephp; 写了个简单的判断模版: <?php /** * @Author: Klaus * @Date: ...

  2. Demo学习: Dialogs Anonymous Callback

    Dialogs\Dialogs Anonymous Callback 窗体回调函数使用. 1. 标准回调函数 ShowMessage(const Msg: string; CallBack: TUni ...

  3. 转几篇WPF文章

    How to view word document in WPF application (CSVSTOViewWordInWPF) WPF 浏览PDF 文件 如何保存RichTextBox的文本到数 ...

  4. 关于Javascript"数组"那点事儿

    记住Javascript里没有“数组”忘掉一切吧,骚年...一切都是对象:书中还细分了下简单类型和对象类型基本类型:typeof xxx => "number"数字,&quo ...

  5. easy ui datagrid在没有数据时显示相关提示内容

    $(function () { $('#dg').datagrid({ fitColumns: true, url: 'product.json', pagination: true, pageSiz ...

  6. (转载)Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)

    在上篇文章中,我给大家介绍了如何在cocos2d-x里面绘制一个三角形,当时我们使用的是cocos2d-x引擎自带的shader和一些辅助函数.在本文中,我将演示一下如何编写自己的shader,同时, ...

  7. good mind

    1.如果你能做的事,员工也能做,就让员工做好了. 2.代码是一行一行执行的. 3.如果你找不到NB的人,那就找勤奋点的人.

  8. HTTP协议返回代码含义

    1XX 代码这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx 响应 100 – 继续101 – 切换协议2XX 代码这类状态代码表明服务器成功地接受了客户端请求,一般日 ...

  9. oracle新建用户

    说明:以下命令在PLSQL中运行 一.以管理员身份登录PLSQL scott/root as sysdba 二.创建新用户 create user extjsTest1 identified by r ...

  10. jquery中json数据转换为字典

    首先在前台页面中的json数据为 var recipe = {}; recipe["name"] = $("#name").val(); recipe[&quo ...