【BZOJ2639】矩形计算(二维普通莫队)
题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值。
矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^2。
n,m<=200,m<=1e5,abs(a[i][j])<=2e9
思路:学习资料见https://www.cnblogs.com/ouuan/p/2DMoDui.html
和一维普通莫队差不多,先扩大区间再缩小保证不会出错
这个块长很有特色,和n,m,q都有关
map离散化真的不靠谱,换预处理离散化即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 210
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9;
int inf=0x7fffffff;
int dx[]={-,,,};
int dy[]={,,-,}; struct Q
{
int x1,y1,x2,y2,id;
}t[M]; int cnt[N*N],c[N*N];
int ans[M],pos[],a[N][N],sum,L1,L2,R1,R2; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} bool cmp(Q a,Q b)
{
return pos[a.x1]<pos[b.x1]
||pos[a.x1]==pos[b.x1]&&pos[a.y1]<pos[b.y1]
||pos[a.x1]==pos[b.x1]&&pos[a.y1]==pos[b.y1]&&pos[a.x2]<pos[b.x2]
||pos[a.x1]==pos[b.x1]&&pos[a.y1]==pos[b.y1]&&pos[a.x2]==pos[b.x2]&&pos[a.y2]<pos[b.y2];
} void add(int op,int x,int y,int z)
{
if(op==)
{
if(!x) return;
rep(j,y,z)
if(j)
{
sum+=(cnt[a[x][j]]<<)+;
cnt[a[x][j]]++;
}
}
else
{
if(!z) return;
rep(i,x,y)
if(i)
{
sum+=(cnt[a[i][z]]<<)+;
cnt[a[i][z]]++;
}
}
} void del(int op,int x,int y,int z)
{
if(op==)
{
if(!x) return;
rep(j,y,z)
if(j)
{
sum=sum-(cnt[a[x][j]]<<)+;
cnt[a[x][j]]--;
}
}
else
{
if(!z) return;
rep(i,x,y)
if(i)
{
sum=sum-(cnt[a[i][z]]<<)+;
cnt[a[i][z]]--;
}
}
} int main()
{
int n=read(),m=read();
int tot=;
rep(i,,n)
rep(j,,m)
{
a[i][j]=read();
c[++tot]=a[i][j];
}
sort(c+,c+tot+);
int k=unique(c+,c+tot+)-c-;
rep(i,,n)
rep(j,,m) a[i][j]=lower_bound(c+,c+k+,a[i][j])-c;
int q=read();
int S=pow(n*m,0.5)/pow(q,0.25)+;
rep(i,,) pos[i]=(i-)/S;
rep(i,,q)
{
int x1=read(),y1=read(),x2=read(),y2=read();
t[i].x1=min(x1,x2);
t[i].x2=max(x1,x2);
t[i].y1=min(y1,y2);
t[i].y2=max(y1,y2);
t[i].id=i;
}
sort(t+,t+q+,cmp);
L1=,L2=,R1=,R2=;
sum=;
rep(i,,q)
{
while(L1>t[i].x1)
{
L1--;
add(,L1,R1,R2);
}
while(L2<t[i].x2)
{
L2++;
add(,L2,R1,R2);
}
while(R1>t[i].y1)
{
R1--;
add(,L1,L2,R1);
}
while(R2<t[i].y2)
{
R2++;
add(,L1,L2,R2);
} while(L1<t[i].x1)
{
del(,L1,R1,R2);
L1++;
}
while(L2>t[i].x2)
{
del(,L2,R1,R2);
L2--;
}
while(R1<t[i].y1)
{
del(,L1,L2,R1);
R1++;
}
while(R2>t[i].y2)
{
del(,L1,L2,R2);
R2--;
}
ans[t[i].id]=sum;
}
rep(i,,q) printf("%d\n",ans[i]);
return ;
}
【BZOJ2639】矩形计算(二维普通莫队)的更多相关文章
- [BZOJ2639]矩形计算
[BZOJ2639]矩形计算 题目大意: 给定一个\(n\times m(n,m\le200)\)的矩阵.\(q(q\le10^5)\)次询问,每次询问一个子矩阵中所有数字出现次数的平方和. 思路: ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...
- 洛谷P5398 [Ynoi2018]GOSICK(二次离线莫队)
题面 传送门 题解 维包一生推 首先请确保您会二次离线莫队 那么我们现在的问题就是怎么转移了,对于\(i\)和前缀\([1,r]\)的贡献,我们拆成\(b_i\)和\(c_i\)两部分,其中\(b_i ...
- 【二维莫队】【二维分块】bzoj2639 矩形计算
<法一>二维莫队,对n和m分别分块后,对块从上到下从左到右依次编号,询问以左上角所在块编号为第一关键字,以右下角标号为第二关键字排序,转移时非常厉害. O(q*n*sqrt(n)). #i ...
- BZOJ.2639.矩形计算(二维莫队)
题目链接 二维莫队,按x,y坐标一起分块.(x,y)的所属的块为 x/sq(n)*sq(m) + y/sq(m) 排序时按照(左下点所在块,右上点的标号)排序 排序后 先得出一个询问的答案,然后利用上 ...
- 【洛谷5398】[Ynoi2018]GOSICK(二次离线莫队)
题目: 洛谷 5398 当我刚学莫队的时候,他们告诉我莫队能解决几乎所有区间问题: 现在,当我发现一个区间问题似乎难以用我所了解的莫队解决的时候,他们就把这题的正解叫做 XXX 莫队.--题记 (以上 ...
- 洛谷P4887 第十四分块(前体)(二次离线莫队)
题面 传送门 题解 lxl大毒瘤 我们考虑莫队,在移动端点的时候相当于我们需要快速计算一个区间内和当前数字异或和中\(1\)的个数为\(k\)的数有几个,而这个显然是可以差分的,也就是\([l,r]\ ...
- luogu P4887 模板 莫队二次离线 莫队 离线
LINK:模板莫队二次离线 很早以前学的知识点 不过 很久了忘了. 考虑暴力 :每次莫队更新的时候 尝试更新一个点到一个区间的答案 可以枚举二进制下位数为k的数字 看一下区间内的这种数字有多少个. 不 ...
- bzoj千题计划320:bzoj4939: [Ynoi2016]掉进兔子洞(莫队 + bitset)
https://www.lydsy.com/JudgeOnline/problem.php?id=4939 ans= r1-l1+1 + r2-l2+1 +r3-l3+1 - ∑ min(cnt1[i ...
随机推荐
- jmeter测试https请求
测试https请求时,需要添加证书 目录 1.下载证书 2.导入 3.执行https请求 1.下载证书 在浏览器中打开要测试的https协议的网站,以谷歌为例打开,下载证书到桌面 4.一直点击下一步 ...
- Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站
环境准备 三台主机: 一台主机部署jenkins和作为ansible的管理主机 一台主机部署gitlab和ansible的节点1 一台主机为ansible的节点2 防火墙和apache服务关闭 第一步 ...
- uni-app 云打包证书生成笔记
一.android 云打包生成证书 1.jdk和jre安装,配置环境 2.在 C:\Users\Administrator\.android 文件夹下执行:keytool -genkey -alias ...
- 边界安全 - CDN/DMZ/网络协议
CDN 工具 - LuManager CDN DMZ 网络协议 - DNS Win7下搭建DNS服务器 - BIND 根域 顶级域(即相关国家域名管理机构的数据库,如中国的CNNIC) com n ...
- STP基本概念及实验
相关命令(华为交换机): stp enable(在交换机开启stp:stp使能) display stp 查看stp状态 stp mode stp/rstp/mstp 启用stp/rstp/mstp ...
- File类的相关方法
java.io.File类 文件和路径名的抽象表达形式 java把电脑中的文件和文件夹(目录)封装了一个File类,我们可以使用File类对文件和文件夹进行如下操作 创建一个文件/文件夹 删除 获取 ...
- word中迅速将表格一分为二 拆分表格快捷键ctrl+shift+enter 重复上一个命令快捷键f4
这里说的是将一个表格拆分为两个表格 选择要拆分的行,快捷键ctrl+shift+enter,就拆分为两个表格了,是不是很快! 在多个表格需要拆分的时候,做一次这样的操作,然后不停的移动.F4,就可以了 ...
- SpringMvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Spring Boot 静态资源处理,妙!
作者:liuxiaopeng https://www.cnblogs.com/paddix/p/8301331.html 做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如 ...
- 2019Android阿里&腾讯&百度&字节面试汇总(附面试题总结、Android书单)
1.基本情况 先简单说说我今年的面试经历吧,本人2018届211软件工程硕士生,Android开发岗.此文主要是2019年年初春招的面试和秋招面试经验汇总,最终拿到了阿里,腾讯,字节跳动,百度等off ...