题目描述

  小$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++

转载于:https://www.cnblogs.com/wzc521/p/11577220.html

[CSP-S模拟测试]:蔬菜(二维莫队)相关推荐

  1. Java黑皮书课后题第8章:**8.19(模式识别:四个连续相等的数)编写下面的方法,测试一个二维数组是否有四个连续相等的数字(水平、垂直、对角线方向都可以)。编写一个测试程序,提示用户输入一个数组

    **8.19(模式识别:四个连续相等的数)编写下面的方法,测试一个二维数组是否有四个连续相等的数字(水平.垂直.对角线方向都可以).编写一个测试程序,提示用户输入一个数组 题目 题目描述与运行实例 破 ...

  2. 使用 canvas 模拟微信生成二维码名片

    需求说明 模拟微信的二维码名片的功能 接口获取到用户的二维码,前端将二维码,背景图,用户头像(圆形),用户姓名等信息结合生成一张图片 示例 等比例创建画布 获取背景图,监听图片的 onload 事件 ...

  3. 前端系列教程之推荐(测试 草料二维码)

    为什么要推荐这个网站呢,有点像搞小聪明吧,嘻嘻嘻 之前说到移动端适配,当然我们可以使用F12开发者工具,进行测试,但是相比真机测试还是有些差距的,除了在电脑上安装模拟器还有其他办法吗? 草料二维码,手 ...

  4. NOIP模拟测试49·50「养花·折射·画作·施工·蔬菜·联盟」

    一套题 养花 题解 分块\主席树 这里我用的是主席树 查询分段$1-(k-1)$找最大的,能向右找就向右找 for(ll nowl=1,nowr=k-1;nowl<=maxx;nowl+=k,n ...

  5. 关于三维莫队问题的一些思考和探究

    关于三维莫队问题的一些思考和探究 手动博客搬家: 本文发表于20180919 15:41:25, 原地址https://blog.csdn.net/suncongbo/article/details/ ...

  6. 模拟简易二维码的形成

    bian二维码,也叫QR码,英语是Quick Response Code,于1994年由日本的DENSO WAVE公司发明.二维码现在已经深入人们生活的方方面面,在网上的二维码生成器(如草料二维码)中 ...

  7. 微信扫描普通二维码进入小程序

    微信扫描普通二维码进入小程序的方法,和代码没有什么关系,主要是在小程序平台进行设置 1. 开发配置 开发 -- 开发管理 -- 开发设置 -- 扫普通链接二维码打开小程序 2. 配置规则 根据说明配置 ...

  8. 票据二维码中信息获取处理与分析系统 毕业设计

    票据二维码中信息获取处理与分析系统 毕业设计全套100米 包含内容如下(程序加论文) BarCode\.classpath BarCode\.project BarCode\AndroidManife ...

  9. AI虚拟人、跨境二维码,微信正在北美寻找更多“小伙伴”

    价值君注:自2010年更名为"TechCrunch Disrupt"后,这个由美国知名科技媒体TechCrunch举办的创投大会已经走到了第八个年头.今年9月,TC Disrupt ...

最新文章

  1. 不认识java代码_程序员进阶:优雅的代码对于一个架构师的重要性
  2. c语言寻找公共字符串,C语言查找两个字符串中的最大公共子串
  3. 2012年全国最新Android开发工程师薪资水平调查分析
  4. python爬虫JS逆向之人口流动态势大数据
  5. mac 下安装iwork+ps+nx2
  6. 概率论--Z=X+Y概率密度的推导
  7. 电压基准和稳压电源-BUCK\BOOST原理讲解
  8. 《第五项修炼,学习型组织的艺术与实践》读书笔记
  9. python微信发送消息过于频繁_微信发送信息频率上限?
  10. java中求某个时间跳过节假日和周末
  11. java实现二十四节气计算
  12. 机器学习并没有那么深奥,它很有趣(2)
  13. ae计算机配置要求,AE和PR要求电脑的最低配置分别是?
  14. 拼多多免单券怎么领取 拼多多免单券是真的吗
  15. 问题排除:电机摩擦力怎么计算?
  16. 学习笔记-频率域滤波(2)-取样函数
  17. android屏幕刷新显示机制
  18. 地表最强! Unity 5.x 插件合集专用贴 - 更新日期 2015.12.06
  19. 学校计算机房管理软件,【学校计算机房管理技巧】 学校云机房
  20. win10安装账户卡住_win10系统安装时卡死或黑屏的解决方法

热门文章

  1. 打印机加热膜损坏导致的打印模糊
  2. 苹果9月会发布什么?除了三款iPhone还有一大堆产品
  3. divcss基础知识
  4. 【学习笔记 36】 buu [BJDCTF 2nd]假猪套天下第
  5. 聚合支付微服务版(微信篇)
  6. unity 2D平台跳跃游戏背景相对移动
  7. ps制作小鸟徽章特效
  8. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序
  9. 职业梦想是计算机的英语作文,高中英语作文我的梦想职业
  10. 程序猿该应该学点经济学