[CSP-S模拟测试]:蔬菜(二维莫队)
题目描述
小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜。秋天到了,小$C$家的菜地丰收了。
小$C$拟定了$q$种采摘蔬菜的计划,计划采摘区域是菜地的一个子矩形,你需要帮助他计算每种计划的美味度,美味度等于每种蔬菜在采摘区域出现次数的平方和。
输入格式
第一行三个正整数$r,c,q$。
接下来$r$行每行$c$个正整数,第$i+1$行第$j$个数为$a_i,j$,表示每个位置的蔬菜种类。
接下来$q$行,每行$4$个正整数$x_0,y_0,x_1,y_1$表示采摘区域的左上角和右下角的位置。
输出格式
输出$q$行,每行一个整数,第$i$行的数表示第$i$组采摘计划的答案。
样例
样例输入:
3 4 8
1 3 2 1
1 3 2 4
1 2 3 4
1 1 2 2
1 1 2 1
1 1 3 4
1 1 1 1
2 2 3 3
2 2 3 4
1 1 3 3
2 4 3 4
样例输出:
8
4
38
1
8
12
27
4
数据范围与提示
对于$100\%$的数据,$r,c\leqslant 200,q\leqslant 100,000,a_i,j\leqslant {10}^9$。
$\bullet Subtask\ 1(23pts):r,c\leqslant 100,q\leqslant 1,000$。
$\bullet Subtask\ 2(15pts):r,c\leqslant 100,q\leqslant 10,000$。
$\bullet Subtask\ 3(17pts):r,c\leqslant 200,q\leqslant 50,000$。
$\bullet Subtask\ 4(20pts):$蔬菜种类数不超过$200$。
$\bullet Subtask\ 5(25pts):$无特殊限制
题解
正解是四维偏序,说白了就是$CDQ$套$CDQ$。
然而可以用二维莫队水,队爷就是$NB$。
推销一波二维莫队:二维莫队(离线)。
对于可怕的数据范围,直接离散化搞就好了。
说了二维莫队就没啥好说的了,在这里就想再说三点:
$\alpha.$对于一个知识点,你比别人多学或者是早学不是错;哪怕你是知道这次要考什么,因为即便告诉别人用什么解法,不会还是不会;而对于有人说的认为复杂度不对,也可以归结为不会——$to$可爱的同桌。
$\beta.$这道题的数据有点水,所以打一个假的二维莫队也可以水过去,有的人知道,有的人不知道,在此提醒一下,这样排序是不对的:
bool cmp(rec a,rec b){return (a.x0==b.x0)?((a.x2==b.x2)?((a.y0==b.y0)?a.y2<b.y2:a.y0<b.y0):a.x2<b.x2):a.x0<b.x0;}
但是的确可以水过去,正确的方法应该是:
int sqrr=sqrt(r);sqrc=sqrt(c);
bool cmp(rec a,rec b){return a.x0/sqrr==b.x0/sqrr?(a.y0/sqrc==b.y0/sqrc?(a.x2/sqrr==b.x2/sqrr?a.y2/sqrc<b.y2/sqrc:a.x2<b.x2):a.y0<b.y0):a.x0<b.x0;}
$\gamma.$最好利用公式统计答案,即${x+1)}^2-x^2$,因为在种类过多的时候肯定会卡死的。
时间复杂度:$\Theta(q\log q+q\times n\sqrt{n})$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int x0,y0,x2,y2,pos,id;}e[100001];
int r,c,q;
int sqrr,sqrc;
int Map[201][201],zls;
int s[40001];
map<int,int> mp;
long long ans[100001];
int uu,dd,ll,rr;
bool cmp(rec a,rec b){return a.x0/sqrr==b.x0/sqrr?(a.y0/sqrc==b.y0/sqrc?(a.x2/sqrr==b.x2/sqrr?a.y2/sqrc<b.y2/sqrc:a.x2<b.x2):a.y0<b.y0):a.x0<b.x0;}
int ask(int x){return 2*x+1;}
void upd(int id,int l,int r,bool b,bool w){for(int i=l;i<=r;i++)if(b)if(w){ans[0]+=ask(s[Map[id][i]]);s[Map[id][i]]++;}else{s[Map[id][i]]--;ans[0]-=ask(s[Map[id][i]]);}else if(w){ans[0]+=ask(s[Map[i][id]]);s[Map[i][id]]++;}else{s[Map[i][id]]--;ans[0]-=ask(s[Map[i][id]]);}}
int main()
{
scanf("%d%d%d",&r,&c,&q);
sqrr=sqrt(r);sqrc=sqrt(c);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
scanf("%d",&Map[i][j]);
if(!mp[Map[i][j]])Map[i][j]=mp[Map[i][j]]=++zls;
else Map[i][j]=mp[Map[i][j]];
}
for(int i=1;i<=q;i++)
{
scanf("%d%d%d%d",&e[i].x0,&e[i].y0,&e[i].x2,&e[i].y2);
e[i].id=i;
}
sort(e+1,e+q+1,cmp);
ll=rr=e[1].x0;
uu=dd=e[1].y0;
s[Map[ll][uu]]++;
ans[0]=1;
for(int i=1;i<=q;i++)
{
while(uu>e[i].y0)upd(--uu,ll,rr,0,1);
while(uu<e[i].y0)upd(uu++,ll,rr,0,0);
while(dd<e[i].y2)upd(++dd,ll,rr,0,1);
while(dd>e[i].y2)upd(dd--,ll,rr,0,0);
while(ll>e[i].x0)upd(--ll,uu,dd,1,1);
while(ll<e[i].x0)upd(ll++,uu,dd,1,0);
while(rr<e[i].x2)upd(++rr,uu,dd,1,1);
while(rr>e[i].x2)upd(rr--,uu,dd,1,0);
ans[e[i].id]=ans[0];
}
for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
return 0;
}
rp++
[CSP-S模拟测试]:蔬菜(二维莫队)的更多相关文章
- csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」
改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...
- BZOJ.2639.矩形计算(二维莫队)
题目链接 二维莫队,按x,y坐标一起分块.(x,y)的所属的块为 x/sq(n)*sq(m) + y/sq(m) 排序时按照(左下点所在块,右上点的标号)排序 排序后 先得出一个询问的答案,然后利用上 ...
- 【二维莫队】【二维分块】bzoj2639 矩形计算
<法一>二维莫队,对n和m分别分块后,对块从上到下从左到右依次编号,询问以左上角所在块编号为第一关键字,以右下角标号为第二关键字排序,转移时非常厉害. O(q*n*sqrt(n)). #i ...
- [CSP-S模拟测试]:飘雪圣域(莫队)
题目描述 $IcePrincess\text{_}1968$和$IcePrince\text{_}1968$长大了,他们开始协助国王$IceKing\text{_}1968$管理国内事物. $IceP ...
- [CSP-S模拟测试]:sum(数学+莫队)
题目传送门(内部题63) 输入格式 第一行有一个整数$id$,表示测试点编号.第一行有一个整数$q$,表示询问组数.然后有$q$行,每行有两个整数$n_i,m_i$. 输出格式 一共有$q$行,每行一 ...
- 联赛模拟测试12 C. sum 莫队+组合数
题目描述 分析 \(80\) 分的暴力都打出来了还是没有想到莫队 首先对于 \(s[n][m]\) 我们可以很快地由它推到 \(s[n][m+1]\) 和 \(s[n][m-1]\) 即 \(s[n] ...
- 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治
LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...
- [CSP-S模拟测试]:毛二琛(DP)
题目描述 $MYC$在$NOI2018$中,遇到了$day1T2$这样一个题,题目是让你求有多少“好”的排列.$MYC$此题没有获得高分,感到非常惭愧,于是回去专心研究排列了.如今数排列的题对$MYC ...
- csps模拟测试50反思
又考崩了,T1一眼秒掉错误思路,然后迅速码完,并码完错误暴力,对拍拍上,以为AC.T2想到了二维莫队,发现是子任务就没去打,一直在想别的,T3最后想到60分打法,没有打完,也没时间暴力,挂掉.T2还有 ...
随机推荐
- hibernate搭建及其增删改查
一.jar包 最基础的hibernatejar包,以及数据库驱动的jar包 二.数据库 t_user表 id int 主键 自动增长 name varchar() 三.配置文件 <?xml ve ...
- Python 图片格式的转换和尺寸修改
import cv2 import os import numpy as np from PIL import Image import shutil import sys image_size=14 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- python学习第三十一天函数的嵌套及函数的作用域
python函数的嵌套是指在函数里面嵌套另外一个函数,可以嵌套更多,函数一旦套用了另外一个函数,他的作用域就已经形成,可以通过global关键词改变变量的作用域,下面详细说明函数的嵌套及函数的作用域 ...
- 【接口工具】接口抓包工具之Fiddler
一.Fiddler的基本功能介绍 Fiddler的官方网站: https://www.telerik.com/purchase/fiddler Fiddler是最强大最好用的Web调试工具之一,它能记 ...
- 【问题解决方案】Mathtype中丢失Mplugin.dll的问题
网络上搜索到的答案: Mathtype中丢失Mplugin.dll,把Mplugin.dll文件放到Mathtype安装根目录下就好了. 然而试过以后仍然不行 事实是: 如果下载的mathtype安装 ...
- windows下nvm的安装及使用
由于更新了npm版本之后导致npm的命令都会报错,一顿百度,明白了nvm可以管理node版本的,下面是操作过程: 如果在安装nvm之前已经下载了node 需要把node卸载!!! 需要把node卸载! ...
- Python- 【python无法更新pip】提示python.exe: No module named pip
用Anaconda安装的python 版本无法更新pip导致不能安装第三方库: 用Anaconda Prompt安装第三方库: python -m pip install --upgrade pip ...
- AGC001[BCDE] 题解
A没意思 F太难 所以大概近期的AGC题解都是BCDE的 然后特殊情况再说 开始刷AGC的原因就是计数太差 没有脑子 好几个学长都推荐的AGC所以就开始刷了 = = 大概两天三篇的速度?[可能也就最开 ...
- 循环移动List元素
List 循环移动元素 使用 Collections 类的 rotate() 来循环移动元素,方法第二个参数指定了移动的起始位置: public class RotateList { public s ...