【LOJ2254】SNOI2017一个简单的询问
2024-09-04 00:59:24
莫队,每次询问的是两个区间,就把区间拆开,分开来算就好了。
借鉴了rank1大佬的玄学排询问的姿势。
#include<bits/stdc++.h>
#define N 50010
typedef long long ll;
using namespace std;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int c1[N],c2[N],a[N],n,m,cnt;
struct Query{
int l,r,id;
bool operator < (const Query &ths) const {
if(l/!=ths.l/) return l<ths.l;
if(l/&) return r>ths.r;
else return r<ths.r;
}
}q[N<<];
ll ans[N],tot=,Ans=;
int main(){
n=read();for(int i=;i<=n;i++)a[i]=read();
m=read();
for(int i=;i<=m;i++){
int l1=read(),r1=read(),l2=read(),r2=read();
q[++cnt]=(Query){r1,r2,i};
if(l1>)q[++cnt]=(Query){l1-,r2,-i};
if(l2>)q[++cnt]=(Query){l2-,r1,-i};
if(l1>&&l2>)q[++cnt]=(Query){l1-,l2-,i};
}
for(int i=;i<=cnt;i++)if(q[i].l>q[i].r)swap(q[i].l,q[i].r);
sort(q+,q+cnt+);
int l=,r=;c1[a[]]++;
for(int i=;i<=cnt;i++){
while(r<q[i].r)r++,Ans+=c1[a[r]],c2[a[r]]++;
while(l<q[i].l)l++,Ans+=c2[a[l]],c1[a[l]]++;
while(r>q[i].r)Ans-=c1[a[r]],c2[a[r]]--,r--;
while(l>q[i].l)Ans-=c2[a[l]],c1[a[l]]--,l--;
if(q[i].id<) ans[-q[i].id]-=Ans;
else ans[q[i].id]+=Ans;
}
for(int i=;i<=m;i++)printf("%lld\n",ans[i]);
}
最新文章
- 读《编写可维护的JavaScript》第五章总结
- 快速理解Docker - 容器级虚拟化解决方案
- shell脚本中的[]/[[]]区别
- ASP.NET MVC 中使用 AjaxFileUpload 插件时,上传图片后不能显示(预览)
- C++读入两个参数
- forms
- PHP 语言需要避免的 10 大误区
- PL SQL Developer 使用总结
- 关于 mod_python
- 【80端口占用】win7下80端口被(Pid=4)占用的解决方法
- openFileDialog与saveFileDialog的使用
- 提交服务器 post get
- hdu 1806 Frequent values 线段树
- 分析Cocos2d-x横版ACT手游源 1、登录
- python利用scrapy框架爬取起点
- hdu1814 Peaceful Commission
- webpack加载postcss,以及autoprefixer的loader
- JMeter之自动重定向和跟随重定向的区别
- RedHat7.之.图形化切换
- Solution about MB STAR C4, MB STAR C5 Update and can not test vehicles problems