[BZOJ2639]矩形计算
[BZOJ2639]矩形计算
题目大意:
给定一个\(n\times m(n,m\le200)\)的矩阵。\(q(q\le10^5)\)次询问,每次询问一个子矩阵中所有数字出现次数的平方和。
思路:
二维莫队。
源代码:
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
#define y1 f2s3D3YjsPPh2TRa4GJVf
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
const int N=201,TOT=40001,Q=1e5;
int a[N][N],tot,tmp[TOT],bel[N],block,sum,cnt[TOT];
struct Query {
int x1,y1,x2,y2,id;
bool operator < (const Query &rhs) const {
if(bel[x1]!=bel[rhs.x1]) return x1<rhs.x1;
if(bel[y1]!=bel[rhs.y1]) return y1<rhs.y1;
if(bel[x2]!=bel[rhs.x2]) return x2<rhs.x2;
return y2<rhs.y2;
}
};
Query q[Q];
int ans[Q];
int x1,y1,x2,y2;
inline int sqr(const int &x) {
return x*x;
}
inline void mdy_x(const int &x,const int &t) {
for(register int i=y1;i<=y2;i++) {
sum-=sqr(cnt[a[x][i]]);
cnt[a[x][i]]+=t;
sum+=sqr(cnt[a[x][i]]);
}
}
inline void mdy_y(const int &y,const int &t) {
for(register int i=x1;i<=x2;i++) {
sum-=sqr(cnt[a[i][y]]);
cnt[a[i][y]]+=t;
sum+=sqr(cnt[a[i][y]]);
}
}
int main() {
block=12;
const int n=getint(),m=getint();
for(register int i=1;i<=n||i<=m;i++) {
bel[i]=i/block;
}
for(register int i=1;i<=n;i++) {
for(register int j=1;j<=m;j++) {
a[i][j]=getint();
tmp[++tot]=a[i][j];
}
}
std::sort(&tmp[1],&tmp[tot]+1);
tot=std::unique(&tmp[1],&tmp[tot]+1)-tmp-1;
for(register int i=1;i<=n;i++) {
for(register int j=1;j<=m;j++) {
a[i][j]=std::lower_bound(&tmp[1],&tmp[tot]+1,a[i][j])-tmp;
}
}
const int c=getint();
for(register int i=0;i<c;i++) {
int x1=getint(),y1=getint(),x2=getint(),y2=getint();
if(x1>x2) std::swap(x1,x2);
if(y1>y2) std::swap(y1,y2);
q[i]=(Query){x1,y1,x2,y2,i};
}
std::sort(&q[0],&q[c]);
x1=1,y1=1,x2=0,y2=0;
for(register int i=0;i<c;i++) {
while(x1>q[i].x1) mdy_x(--x1,1);
while(x2<q[i].x2) mdy_x(++x2,1);
while(x1<q[i].x1) mdy_x(x1++,-1);
while(x2>q[i].x2) mdy_x(x2--,-1);
while(y1>q[i].y1) mdy_y(--y1,1);
while(y2<q[i].y2) mdy_y(++y2,1);
while(y1<q[i].y1) mdy_y(y1++,-1);
while(y2>q[i].y2) mdy_y(y2--,-1);
ans[q[i].id]=sum;
}
for(register int i=0;i<c;i++) {
printf("%d\n",ans[i]);
}
return 0;
}
[BZOJ2639]矩形计算的更多相关文章
- 【二维莫队】【二维分块】bzoj2639 矩形计算
<法一>二维莫队,对n和m分别分块后,对块从上到下从左到右依次编号,询问以左上角所在块编号为第一关键字,以右下角标号为第二关键字排序,转移时非常厉害. O(q*n*sqrt(n)). #i ...
- 【BZOJ2639】矩形计算(二维普通莫队)
题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值. 矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^ ...
- BZOJ.2639.矩形计算(二维莫队)
题目链接 二维莫队,按x,y坐标一起分块.(x,y)的所属的块为 x/sq(n)*sq(m) + y/sq(m) 排序时按照(左下点所在块,右上点的标号)排序 排序后 先得出一个询问的答案,然后利用上 ...
- PHP图形计算器(计算三角形矩形周长面积)
运用PHP面向对象的知识设计一个图形计算器,同时也运用到了抽象类知识,这个计算器可以计算三角形的周长和面积以及矩形的周长和面积.本图形计算器有4个页面:1.PHP图形计算器主页index.php; ...
- paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]
Haar-like矩形遍历检测窗口演示Matlab源代码 clc; clear; close all; % Haar-like特征矩形计算 board = 24 % 检测窗口宽度 num = 24 % ...
- 题解 P1034 【矩形覆盖】
题面 在平面上有n个点(n≤50),每个点用一对整数坐标表示.例如:当n=4时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用k个矩形(1≤ ...
- (转)Haar-like矩形遍历检测窗口演示Matlab源代码
from:http://blog.sina.com.cn/s/blog_736aa0540101kzqb.html clc; clear; close all; % Haar-like特征矩形计算 b ...
- CSS学习笔记——包含块 containing block
以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...
- EmguCV 轮廓分析函数汇总
一.cvApproxPoly 使用多边形逼近一个轮廓,使得顶点数目变少.算法先从轮廓选择2个最远的点,然后将2个连成一个线段,然后再查找轮廓上到线段距离最远的点,添加到逼近后的新轮廓.算法反复迭代,不 ...
随机推荐
- Ubuntu 下更简单的防火墙 Uncomplicated Firewall
一看名字就十分的明确“不复杂防火墙”没错,它就是 ufw,在 Ubuntu 操作系统当中已经内置,使用它可以简单快速的操作防火墙的功能,比如开关端口,访问 IP,限制连接等等等等.它与一系列 Linu ...
- oracle查看表名称和表字段注释
--查询该表字段的注释select * from user_col_comments where Table_Name like '%SMS%' --查询类似表select * from user_t ...
- GetStockObject 理解
原文地址:https://www.cnblogs.com/Clingingboy/archive/2013/04/13/3017952.html GetStockObject在图形编程中是常用API之 ...
- centos6 -> zabbix2.2升级3.0.5教程
当然系统版本centos6 清除之前的zabbix的yum源缓存 yum clean all 更换新版本的zabbix的yum源 rpm -qa|grep zabbix rpm -e zabbix-r ...
- Linux中断处理(二)
与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq(),request_irq()的原型为:int request_irq(unsigne ...
- Linux常用命令2(远程文件下载+查看文件内容)
一.远程文件下载的两种方法:ftp命令 + scp命令 ftp命令: 服务器若安装了ftp Server,另外一台Linux可以使用ftp的client程序来进行文件的远程拷贝读取下载和写入上载. 1 ...
- Expm 2_1 k-路合并操作问题
假定有k个有序数组,每个数组中含有n个元素,您的任务是将它们合并为单独的一个有序数组,该数组共有kn个元素.设计和实现 一个有效的分治算法解决k-路合并操作问题,并分析时间复杂度.
- PHP导出CVS格式文件
$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive"; header("Content-Type: a ...
- Memcache是谁,它为什么而奋斗?【内容转】
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- Centos7 通过yum命令安装jdk1.8
直接安装,不看原因 yum install java-1.8.0-openjdk* -y 1 分割线上下之选一个看即可. —————————————华丽的分割线—————————————— 先查看系统 ...