P5268 [SNOI2017] 一个简单的询问

一个简单的询问

显然这个询问并不简单
如果做过莫比乌斯反演入门题problem b就会想到利用容斥将询问拆成四个

那么我们现在的问题变成如何求
[1,l]
[1,r]
两个区间之间的答案,那么也是直接用莫队即可,只是维护的是两个区间的右端点,和原来的莫队有一些不一样,但是大体相同。

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#define fo(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (int (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
#define A puts("YES")
#define B puts("NO")
using namespace std;
typedef long long ll;
const ll inf=1ll<<60;
const int N=5e4+5;
int S;
struct node{
	int l,r,id,op;
	bool operator < (const node&x) const {
		if (l/S != x.l/S) return l<x.l;
		return (l/S)&1 ? r<x.r : r>x.r;
	}
};
node q[N*8];
int c[N],n,m,tot,l,r;
ll a[N],b[N],sum,ans[N];
void add1(int x){
	sum+=b[x];
	a[x]++;
}
void add2(int x){
	sum+=a[x];
	b[x]++;
}
void sub1(int x){
	sum-=b[x];
	a[x]--;
}
void sub2(int x){
	sum-=a[x];
	b[x]--;
}
int main(){
	
//	freopen("data.in","r",stdin);    
	scanf("%d",&n);
	fo(i,1,n) scanf("%d",&c[i]);
	
	S=(int)pow(n,0.5);
	scanf("%d",&m);
	fo(p,1,m) {
		int x,y,z,w;
		scanf("%d %d %d %d",&x,&y, &z,&w);
		
		q[++tot]=(node){y,w,p,1};
		if ((x-1)>0) q[++tot]=(node){x-1,w,p,-1};
		if ((z-1)>0) q[++tot]=(node){y,z-1,p,-1};
		if ((x-1)>0 && (z-1)>0)	q[++tot]=(node){x-1,z-1,p,1};
	}
	fo(i,1,tot) if (q[i].l>q[i].r) swap(q[i].l, q[i].r);
	
	sort(q+1,q+tot+1);
	
//	fo(i,1,tot) {
//		printf("%d %d %d %d\n",q[i].l,q[i].r, q[i].id, q[i].op);
//	}

	
	l=0; r=0;
	while (l<q[1].l) ++a[c[++l]];
	while (r<q[1].r) {
		sum+=a[c[++r]];
		b[c[r]]++;
	}
	
	ans[q[1].id]+=(ll)q[1].op*sum;
	
	
	fo(i,2,tot) {
		while (l>q[i].l) sub1(c[l--]);
		while (r<q[i].r) add2(c[++r]);
	
		while (l<q[i].l) add1(c[++l]);
		while (r>q[i].r) sub2(c[r--]);
		
		ans[q[i].id]+=(ll)q[i].op*sum;
		
//		printf("%lld\n",sum);
	}
	
	fo(i,1,m) printf("%lld\n",ans[i]);
	return 0;
	
}

 
 
 
posted @   gan_coder  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-09-24 [JSOI2012]玄武密码
2022-09-24 [POJ2286] The Rotation Game
  1. 1 青春コンプレックス 結束バンド
  2. 2 ギターと孤独と蒼い惑星 結束バンド
  3. 3 星座になれたら 結束バンド
  4. 4 恋のうた (feat. 由崎司) 鬼頭明里
  5. 5 月と星空 カノエラナ
  6. 6 Cagayake!GIRLS[5人Ver.] (TV size Ver.) 桜高軽音部
  7. 7 不可思議のカルテ 不可思議のカルテ
  8. 8 優しさの理由 ChouCho
青春コンプレックス - 結束バンド
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 樋口愛

作曲 : 音羽-otoha-

编曲 : 三井律郎

暗く狭いのが好きだった 深く被るフードの中

喜欢黑暗狭窄的地方 如被深深掩盖的兜帽之中

無情な世界を恨んだ目は どうしようもなく愛を欲してた

对眼中无情的世界恨之入骨 却无可救药地想得到爱

雨に濡れるのが好きだった 曇った顔が似合うから

雨に濡れるのが好きだった 曇った顔が似合うから

雨に濡れるのが好きだった 曇った顔が似合うから

喜欢被雨淋湿 因为这才符合我阴沉的脸

嵐に怯えてるフリをして 空が割れるのを待っていたんだ

假装着害怕暴风雨 又等待着天空的破裂

かき鳴らせ 光のファズで 雷鳴を 轟かせたいんだ

奏响吧 以光的法兹让雷鸣声轰鸣

打ち鳴らせ 痛みの先へ どうしよう! 大暴走獰猛な鼓動を

敲响吧 苦痛的前方该如何! 以这狂暴凶猛的心跳回应吧

悲しい歌ほど好きだった 優しい気持ちになれるから

悲しい歌ほど好きだった 優しい気持ちになれるから

悲しい歌ほど好きだった 優しい気持ちになれるから

尤为喜欢听忧伤的歌曲 因为会让心情变得平和下来

明るい場所を求めていた だけど触れるのは怖かった

渴求着明亮的地方 但是也害怕着触碰光明

深く潜るのが好きだった 海の底にも月があった

喜欢潜入深海之中 因为海底之下也有月亮

誰にも言わない筈だった が 歪な線が闇夜を走った

本来应该不会和任何人提起 但扭曲的线条却在黑夜里奔跑

かき鳴らせ 交わるカルテット 革命を 成し遂げてみたいな

奏响吧 这交响的四重奏 试着完成这革命

打ち鳴らせ 嘆きのフォルテ どうしよう? 超奔放凶暴な本性を

敲响吧 叹息的加强符该如何? 这奔放且狂暴至极的本性啊

私 俯いてばかりだ

私 俯いてばかりだ

私 俯いてばかりだ

我 一直低着头

それでいい 猫背のまま 虎になりたいから

那样就好 因为成为一只驼背的老虎正如我所愿啊

かき鳴らせ 光のファズで 雷鳴を 轟かせたいんだ

かき鳴らせ 光のファズで 雷鳴を 轟かせたいんだ

かき鳴らせ 光のファズで 雷鳴を 轟かせたいんだ

奏响吧 以光的法兹让雷鸣声轰鸣

打ち鳴らせ 痛みの先へ さあいこう 大暴走獰猛な鼓動を

敲响吧 向着苦痛的前方冲吧 这暴走凶猛的心跳

衝動的感情 吠えてみろ!

冲动的感情 咆哮吧!

かき鳴らせ

奏响吧

雷鳴を这雷鸣

点击右上角即可分享
微信分享提示