题意:输入一个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 ;
}

最新文章

  1. Xenko基础API笔记2-手势
  2. JQuery------.load()从服务器获取数据并加载到某个类的方法
  3. sql server 2008 登录 4064 错误解决办法
  4. SQL如何查询对应的object
  5. 如何避免MVC Model First 设计时添加的DataAnnotation被覆盖掉
  6. Using breakpad in cocos2d-x 3.2,dump信息收集
  7. phpcms v9中模板标签使用及联动菜单
  8. Zookeeper + Kafka 集群搭建
  9. Jmeter_上传与下载
  10. react native 子组件向父组件传值
  11. ArcGIS 10.0发布缓存地图服务(详细版)
  12. python学习第一周(1)
  13. pyinstaller 打包不成功,提示inporterror 缺少xlrd、xlwt
  14. 绘图QPainter-字体
  15. Set原理
  16. centos 7.2 安装域名服务器(bind9.9 集群--主从架构),私有域名服务器+缓存
  17. DevOps - CI - Sonar
  18. js基础知识整理
  19. VIM中使用S查找并替换
  20. Electromagnetic radiation and Radio 电磁波/电磁辐射和无线电波

热门文章

  1. leetcode 235. 二叉搜索树的最近公共祖先(c++)
  2. 像计算机科学家一样思考python-第1章 程序之道
  3. windows mysql官方绿色版zip包安装教程
  4. org.dom4j 解析XML
  5. Vue自定义事件:触发自定义事件
  6. java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
  7. nodejs基础-nvm和npm
  8. php跨域的几种方式
  9. C++ STL map容器值为指针时怎么释放内存
  10. 《JAVA设计模式》之单例模式(Singleton)