显然分块,由于颜色也有区间,我们的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. [Interview][CodingExam]

    這次去Interview, 其中有一個公司 把我列為 2/25的考慮對象, 在Final 的 1/2, 我被刷掉了. 因為第一輪的程式,我稍微google了一下,參考了既有的寫法. 即使第二輪我用完全 ...

  2. 在Linux环境下给php添加mbstring扩展

    1,今天在开发项目的时候使用了一个php函数(mb_strcut),运行代码时候提示报错"call to undefind function mb_strcut",首先检查下函数名 ...

  3. php验证码的简单例子

    php随机验证码: <?php      $image_width=140;      $image_height=50;      srand(microtime()*10000);      ...

  4. 如何快速建立Subversion服务器

    本文拷贝自网址:http://www.subversion.org.cn/?action-viewnews-itemid-1 如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关 ...

  5. Spark小课堂Week6 启动日志详解

    Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...

  6. PHP微信开发代码

    1,SAE上申请服务器 2,绑定测试账号 3,Token验证 <?php /* http://www.cnblogs.com/xrhou12326/ CopyRight 2014 All Rig ...

  7. Java 多线程 简单实例 (Runnable)

    1.多线程实例 package second; public class A implements Runnable { public char stat = '*'; public void run ...

  8. 【Spring-boot多数据库】Spring-boot JDBC with multiple DataSources sample

    application.properties spring.ds_items.driverClassName=org.postgresql.Driver spring.ds_items.url=jdb ...

  9. PS 颜色表大全-颜色中文名(1)

    颜色中文名  鸨色#f7acbc 赤白橡#deab8a 油色#817936 绀桔梗#444693 踯躅色#ef5b9c 肌色#fedcbd 伽罗色#7f7522 花色#2b4490 桜色#feeeed ...

  10. multimap和multiset 认知和使用

    之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以导致用的时候并不熟悉: 在这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只 ...