P5268-[SNOI2017]一個簡單的詢問【莫隊】
正題
題目連結:https://www.luogu.com.cn/problem/P5268
題目大意
n n n個數的一個序列,定義 g e t ( l 1 , r 1 , x ) get(l_1,r_1,x) get(l1,r1,x)表示區間 [ l 1 , r 1 ] [l_1,r_1] [l1,r1]中有多少個 x x x。
每次詢問 ( l 1 , r 1 , l 2 , r 2 ) (l_1,r_1,l_2,r_2) (l1,r1,l2,r2)求 ∑ x ∞ g e t ( l 1 , r 1 , x ) ∗ g e t ( l 2 , r 2 , x ) \sum_{x}^{\infty}get(l_1,r_1,x)*get(l_2,r_2,x) x∑∞get(l1,r1,x)∗get(l2,r2,x)
解題思路
考慮莫隊,有 g e t ( l 1 , r 1 , x ) ∗ g e t ( l 2 , r 2 , x ) get(l_1,r_1,x)*get(l_2,r_2,x) get(l1,r1,x)∗get(l2,r2,x)
= = =
g e t ( 1 , r 1 , x ) ∗ g e t ( 1 , r 2 , x ) − g e t ( 1 , l 1 − 1 , x ) ∗ g e t ( 1 , r 2 , x ) get(1,r_1,x)*get(1,r_2,x)-get(1,l_1-1,x)*get(1,r_2,x) get(1,r1,x)∗get(1,r2,x)−get(1,l1−1,x)∗get(1,r2,x) − g e t ( 1 , r 1 , x ) ∗ g e t ( 1 , l 2 − 1 , x ) + g e t ( 1 , l 1 − 1 , x ) ∗ g e t ( 1 , l 2 − 1 , x ) -get(1,r_1,x)*get(1,l_2-1,x)+get(1,l_1-1,x)*get(1,l_2-1,x) −get(1,r1,x)∗get(1,l2−1,x)+get(1,l1−1,x)∗get(1,l2−1,x)
然後分成四次莫隊就好了
c o d e code code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e4+10;
struct node{
int l,r,id,w;
}q[N*4];
int n,cnt,T,Q,a[N],ans[N],v1[N],v2[N];
bool cmp(node x,node y)
{return x.l/T<y.l/T||(x.l/T==y.l/T&&x.r<y.r);}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
T=sqrt(n);
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
q[++cnt]=(node){r1,r2,i,1};
q[++cnt]=(node){r1,l2-1,i,-1};
q[++cnt]=(node){l1-1,r2,i,-1};
q[++cnt]=(node){l1-1,l2-1,i,1};
}
sort(q+1,q+1+cnt,cmp);
int l=0,r=0,val=0;
for(int i=1;i<=cnt;i++){
while(r<q[i].r)++r,v2[a[r]]++,val+=v1[a[r]];
while(r>q[i].r)v2[a[r]]--,val-=v1[a[r]],r--;
while(l<q[i].l)++l,v1[a[l]]++,val+=v2[a[l]];
while(l>q[i].l)v1[a[l]]--,val-=v2[a[l]],l--;
ans[q[i].id]+=q[i].w*val;
}
for(int i=1;i<=Q;i++)
printf("%d\n",ans[i]);
}
相關文章
- P4689 [Ynoi2016] 這是我自己的發明 與 P5268 [SNOI2017] 一個簡單的詢問0
- 神奇的莫隊
- 莫隊
- 實現一個簡單的輪詢演算法演算法
- 莫隊詳解
- 分塊 and 莫隊
- 搜尋選講、分塊初步、莫隊簡介
- 分塊與莫隊
- 莫隊演算法演算法
- 根號分治莫隊
- 基礎莫隊模板
- 簡單的查詢
- 莫隊學習筆記筆記
- 一個簡簡單單的紅點系統框架框架
- 一個簡單的 PWA 指南
- 一個簡單的Tessellation Shader
- 一個簡單的「IOC」例子
- 一個簡單的統計問題(解決方案:Trie樹)
- 莫隊的 1.5 近似構造 題解
- 一個MySQL多表查詢的問題MySql
- 基礎莫隊演算法演算法
- 【演算法學習】莫隊演算法
- 實現一個簡單的TomcatTomcat
- 一個簡單的 Amqp 封裝MQ封裝
- 擼一個簡單的MVVM例子MVVM
- [譯]ViewModels:一個簡單的示例View
- 寫一個簡單的 Facade 示例
- 一個最簡單的web componentsWeb
- 建立一個簡單的小程式
- 一個簡單的MVP模式案例MVP模式
- 一個簡單的BypassUAC編寫
- 一個簡單的區塊鏈區塊鏈
- 分享一個簡單的redis限流Redis
- 【2024-ZR-C Day 5】資料結構(3):莫隊(帶修莫隊、回滾莫隊)、邊分治、點分治、樹分治、動態點分治資料結構
- Go的第一個Hello程式 簡簡單單 - 快快樂樂Go
- 一個 AI 問題諮詢AI
- 一個簡單template engine
- 簡單寫一個eventbus