首页 > 其他分享 >洛谷 P7906 [Ynoi2005] rpxleqxq

洛谷 P7906 [Ynoi2005] rpxleqxq

时间:2024-01-26 22:56:51浏览次数:35  
标签:qq typedef 洛谷 int Ynoi2005 pb long ans rpxleqxq

洛谷传送门

考虑莫队二次离线。剩下是平衡插入和查询复杂度的问题。

考虑现在的问题:要求 \(O(\sqrt{n})\) 往集合里插入一个数,\(O(1)\) 回答集合内有多少个数 \(x\) 满足 \(z \oplus x \le m\)(\(z\) 给定)。

考虑高低位分块。先钦定 \(z\) 在前 \(9\) 位时 \(z \oplus x < m\),枚举 \(z\) 的前 \(9\) 位更新答案;然后钦定 \(z\) 前 \(9\) 位 \(= m \oplus x\),枚举 \(z\) 的后 \(9\) 位更新答案。查询是 \(O(1)\) 的。

总时间复杂度 \(O(n + (\sqrt{n} + \sqrt{q}))\)。

code
// Problem: P7906 [Ynoi2005] rpxleqxq
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7906
// Memory Limit: 128 MB
// Time Limit: 1500 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;
const int maxm = 1000100;

int n, m, q, a[maxn], blo, bel[maxn];
ll ans[maxm], b[maxn];

struct node {
	int l, r, i;
	ll ans;
} qq[maxm];

namespace DS {
	int f[555], g[555][555];
	
	inline void init() {
		mems(f, 0);
		mems(g, 0);
	}
	
	inline void insert(int x) {
		for (int i = 0; i < 512; ++i) {
			f[i] += (((x >> 9) ^ i) < (m >> 9));
		}
		int t = (x ^ m) >> 9;
		for (int i = 0; i < 512; ++i) {
			g[t][i] += (((x & 511) ^ i) <= (m & 511));
		}
	}
	
	inline int query(int x) {
		return f[x >> 9] + g[(x >> 9) & 511][x & 511];
	}
}

struct line {
	int l, r, i, o;
	line(int a = 0, int b = 0, int c = 0, int d = 0) : l(a), r(b), i(c), o(d) {}
};
vector<line> vc[maxn];

void solve() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &q);
	for (int i = 1; i <= q; ++i) {
		scanf("%d%d", &qq[i].l, &qq[i].r);
		qq[i].i = i;
	}
	blo = ceil(n / sqrt(q));
	for (int i = 1; i <= n; ++i) {
		bel[i] = (i - 1) / blo + 1;
	}
	sort(qq + 1, qq + q + 1, [&](const node &a, const node &b) {
		if (bel[a.l] != bel[b.l]) {
			return bel[a.l] < bel[b.l];
		} else if (bel[a.l] & 1) {
			return a.r < b.r;
		} else {
			return a.r > b.r;
		}
	});
	for (int i = 1; i <= n; ++i) {
		b[i] = b[i - 1] + DS::query(a[i]);
		DS::insert(a[i]);
	}
	int l = 1, r = 0;
	for (int i = 1; i <= q; ++i) {
		int L = qq[i].l, R = qq[i].r;
		if (l > L) {
			qq[i].ans -= b[l - 1] - b[L - 1] + l - L;
			vc[r].pb(L, l - 1, i, 1);
			l = L;
		}
		if (r < R) {
			qq[i].ans += b[R] - b[r];
			vc[l - 1].pb(r + 1, R, i, -1);
			r = R;
		}
		if (l < L) {
			qq[i].ans += b[L - 1] - b[l - 1] + L - l;
			vc[r].pb(l, L - 1, i, -1);
			l = L;
		}
		if (r > R) {
			qq[i].ans -= b[r] - b[R];
			vc[l - 1].pb(R + 1, r, i, 1);
			r = R;
		}
	}
	DS::init();
	for (int i = 1; i <= n; ++i) {
		DS::insert(a[i]);
		for (line u : vc[i]) {
			for (int j = u.l; j <= u.r; ++j) {
				qq[u.i].ans += u.o * DS::query(a[j]);
			}
		}
	}
	for (int i = 1; i <= q; ++i) {
		qq[i].ans += qq[i - 1].ans;
		ans[qq[i].i] = qq[i].ans;
	}
	for (int i = 1; i <= q; ++i) {
		printf("%lld\n", ans[i]);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:qq,typedef,洛谷,int,Ynoi2005,pb,long,ans,rpxleqxq
From: https://www.cnblogs.com/zltzlt-blog/p/17990895

相关文章

  • 洛谷题解-P2712 摄像头
    https://www.luogu.com.cn/problem/P2712可以看出是拓扑排序,因为是有前后关系的,但是坑点在于点并不连续,值得记录一下(刚开始70分,后来才AC)注意坑点:拓扑排序,遍历的点不连续 #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,x,m,y,d[N],cnt=0,v......
  • 洛谷题单指南-排序-P1271 【深基9.例1】选举学生会
    原题链接:https://www.luogu.com.cn/problem/P1271题意解读:最直接的计数排序问题,借助一个桶h[N],对被投票的候选人x执行h[x]++,再按顺序遍历输出即可。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=1005;inth[N];intmain(){intn,m;......
  • 洛谷题单指南-模拟和高精度-P1045 [NOIP2003 普及组] 麦森数
    原题链接:https://www.luogu.com.cn/problem/P1045题意解读:要计算2p-1的位数和最后500位,实际上只需要计算2p,两者位数一致,前者比后者个位减1即可,且个位肯定不会是0,比较容易处理。解题思路:如果直接采用高精度乘法计算2p,p最大3.1*106,高精度所用数组最长大概9*105,一共最多计算3.......
  • 洛谷 P6681 [CCO2019] Bad Codes
    洛谷传送门QOJ传送门被QOJ1193AmbiguousEncoding撞了。考虑直接dp,设\(f_{i,j}\)为较长的串未被较短的串覆盖的部分是第\(i\)个字符串的长为\(j\)的后缀。转移考虑枚举接在较短的串后面是第\(k\)个串,然后讨论一下\(j\)和第\(k\)个字符串的大小关系就可以确定......
  • 洛谷题单指南-模拟和高精度-P1249 最大乘积
    原题链接:https://www.luogu.com.cn/problem/P1249题意解读:题目分两步,第一步是将整数拆分成不同自然数的和,第二步通过高精度计算这些因数的乘积,要使乘积最大,需要某种贪心思想。解题思路:如何保证整数拆分后因子的乘积最大呢,有几个原则:1、最好不要包括因子1,但3、4除外,需要进行特......
  • 洛谷题单指南-模拟和高精度-P1591 阶乘数码
    原题链接:https://www.luogu.com.cn/problem/P1591题意解读:此题核心就是通过高精度*低精度计算阶乘,然后统计数码个数即可,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;vector<int>mul(vector<int>&a,intb){vector<int>result;intt......
  • 洛谷题单指南-模拟和高精度-P1786 帮贡排序
    原题链接:https://www.luogu.com.cn/problem/P1786题意解读:此题比较简单,模拟+排序即可解决。需要注意的是,当帮贡或者等级相同时,都要保持原来的顺序,因此需要记录每个人的编号,便于排序。话不多说,直接上代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constint......
  • 【赛后反思】【LGR-172-Div.4】洛谷入门赛 #19 赛后反思
    【LGR-172-Div.4】洛谷入门赛#19赛后反思今日推歌:Cagayake《無名のエヌ(feat.重音テト&可不)》不正解だ不正解だった中途半端な身体は不是很火的一首歌,连个翻译都没有(悲Before最后5minAK了,第一次AK,虽然是入门赛但还是很有成就感的:省流:STL大胜利A分饼干I......
  • 洛谷 P9843 [ICPC2021 Nanjing R] Paimon Sorting 题解
    Descirption给出一个排序算法(用伪代码表示):SORT(A)forifrom1tonforjfrom1tonifa[i]<a[j]Swapa[i]anda[j]算出对于一个序列\(A=a_1,a_2,\cdots,a_n\)的所有前缀\(A_k=a_1,a_2,\cdots,a_k\)(\(1\lek\len\)),\(\operatorname{SORT}(A_......
  • 洛谷入门赛 #19 题解
    比赛传送门A-分饼干I将三盒饼干按数量排序。若较小的两盒饼干数之和大于另一盒饼干,则将较小的两盒饼干奖励给第一名,另一盒奖励给第二名;若较大的一盒饼干数大于另外两盒之和,则将较大的一盒奖励给第一名,另外两盒奖励给第二名。B-分饼干II每个人分到的饼干数都不同,即可以看......