【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 ...
随机推荐
- 术语-PM:PM/项目管理 百科
ylbtech-术语-PM:PM/项目管理 百科 PM项目管理(Project Management),是以项目为对象的系统管理方法,通过一个临时性的.专门的柔性组织,对项目进行高效率的计划.组织.指 ...
- php面向对象的重写与重载
重写: 就是当子类继承父类的一些方法后,子类又在其内部定义了相同的方法,则这个新定义的方法会覆盖继承而来的父类的方法,子类只能调用其内部定义的方法. 有以下几点要求: 1.当一个父类和子类有一个方法, ...
- IsAjaxRequest
具体来说,IsAjaxRequest代码可以分解为以下功能: public static bool IsAjaxRequest(this HttpRequestBase request) { if ( ...
- Vue Cli 3:创建项目
一 简介 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,有几个独立的部分. 1 CLI (@vue/cli) 是一个全局安装的 npm 包,提供了终端里的 vue 命令.(vue ...
- pdo getLastInertID()无结果
该函数只返回具有自增约素的表, 不然返回0. 使用exec()得到的是受影响的行数.
- Arrays工具类使用与源码分析(1)
Arrays工具类主要是方便数组操作的,学习好该类可以让我们在编程过程中轻松解决数组相关的问题,简化代码的开发. Arrays类有一个私有的构造函数,没有对外提供实例化的方法,因此无法实例化对象.因为 ...
- [Bzoj1009][HNOI2008]GT考试(动态规划)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 显而易见的动态规划加矩阵快速幂,不过转移方程不怎么好想,dp[i][j]表示长度为 ...
- C++中的布尔类型和引用
1,C++ 中的布尔类型: 1,C++ 在 C 语言的基础类型系统之上增加了 bool: 1,C 语言中,没有 bool 类型存在,往往都是用整型代替 bool 类型,常用 0 表示假,用 1 表示真 ...
- 解决Linux下编译.sh文件报错 “[: XXXX: unexpected operator”
本人经常在Linux通过编译 .sh文件来生成工程,之前一直都没问题,代码一直都没变,但是今天编译的时候,却提示错误:
- k8s ingress路由强制跳转至https设置
为ingress配置增加注解(annotations):nginx.ingress.kubernetes.io/ssl-redirect: 'true' 就可以实现http强制跳转至https 不过默 ...