【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 ...
随机推荐
- Window 相关命令
net user Administrator /Active:Yes NET USER 用于创建和修改计算机上的用户帐户.当不带选项使用本命令时,它会列出计算机上的用户帐户.用户帐户的信息存储在用户帐 ...
- Jmeter接口测试报告模板优化(续)
在之前的基础上又优化了一下: 1.增加了对接口响应时间段的统计,如小于0.5s的请求有多少,0.5-1s的有多少,大于1s的有多少.可以自行修改.且不同范围内的时间字体颜色不一样,便于区分. < ...
- WPF数据模板中绑定事件不触发问题
今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...
- Python几行代码实现邮件发送
话不多说直接进入正题 首先我们需要安装一个名为'zmail'的包,终端执行'pip install zmail'即可实现安装. 直接上代码 import zmail mail = { 'subject ...
- java创建线程的两种方式及源码解析
创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...
- Socket编程半双工
服务器 package com.test; import java.io.IOException; import java.net.*; import java.io.*; public class ...
- [BZOJ2138]stone(Hall定理,线段树)
Description 话说Nan在海边等人,预计还要等上M分钟.为了打发时间,他玩起了石子.Nan搬来了N堆石子,编号为1到N,每堆 包含Ai颗石子.每1分钟,Nan会在编号在\([L_i,R_i] ...
- BZOJ 1588 (treap)
题面 传送门 分析 语文题,主要是如何理解最小波动值 设当前天的营业额为x,则最小波动值为min(x-最大的<=x的数,最小的>=x的数-x) 然后用Treap维护序列就可以了 时间复杂度 ...
- 攻防世界--dmd-50
测试文件:https://adworld.xctf.org.cn/media/task/attachments/7ef7678559ea46cbb535c0b6835f2f4d 1.准备 获取信息 6 ...
- Vue PC端图片预览插件
*手上的项目刚刚搞完了,记录一下项目中遇到的问题,留做笔记: 需求: 在项目中,需要展示用户上传的一些图片,我从后台接口拿到图片url后放在页面上展示,因为被图片我设置了宽度限制(150px),所以图 ...