首页 > 其他分享 >洛谷 P7003

洛谷 P7003

时间:2022-10-26 19:58:26浏览次数:47  
标签:pre 洛谷 log val int P7003 mid 区间

考虑当左端点固定时,区间的 \(\&\) 和至多有 \(\log w\) 种,因为 \(1\) 的数量是单调不升的。

所以我们可以枚举区间左端点 \(i\),然后 ST 表预处理区间 \(\&\) 和 + 二分求出一段 \(\&\) 和相同的区间。

然后设 \(pre_i\) 表示原序列的前缀异或和,那么设当前这段 \(\&\) 和相同的区间为 \(l,r\),值为 \(x\),那么就是要求 \(\sum_{j=l}^{r}[pre_j\oplus pre_{i-1}=x]\),即 \(\sum_{j=l}^{r}[pre_j=pre_{i-1}\oplus x]\),发现等式右边是个定值,那么就是求一段区间内一个数的出现次数,离散化后在 vector 里二分就好了。

时间复杂度 \(\mathcal O(n\log w\log n)\)。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100005, M = 17;
int n;
int f[N][M], lg[N];
int pre[N], _[N], tot;
vector <int> pos[N];
ll ans;

int query(int l, int r) {
	int k = lg[r - l + 1];
	return f[l][k] & f[r - (1 << k) + 1][k];
}

int main() {
	scanf("%d", &n);
	lg[0] = -1;
	for (int i = 1; i <= n; ++i) lg[i] = lg[i >> 1] + 1;
	for (int i = 1; i <= n; ++i) scanf("%d", &f[i][0]), pre[i] = pre[i - 1] ^ f[i][0], _[++tot] = pre[i];
	sort(_ + 1, _ + tot + 1), tot = unique(_ + 1, _ + tot + 1) - (_ + 1);
	for (int i = 1; i <= n; ++i) pos[pre[i] = lower_bound(_ + 1, _ + tot + 1, pre[i]) - _].push_back(i);
	for (int j = 1; j <= lg[n]; ++j)
		for (int i = 1; i + (1 << j) - 1 <= n; ++i)
			f[i][j] = f[i][j - 1] & f[i + (1 << (j - 1))][j - 1];
	for (int i = 1; i <= n; ++i) {
		for (int l = i, r = i; l <= n; l = r + 1) {
			int L = l, R = n, val = query(i, l);
			while (L < R) {
				int mid = L + R + 1 >> 1;
				if (query(i, mid) != val) R = mid - 1;
				else L = mid;
			}
			r = L;
			val ^= _[pre[i - 1]];
			int p = lower_bound(_ + 1, _ + tot + 1, val) - _;
			if (p <= tot && _[p] == val)
				ans += upper_bound(pos[p].begin(), pos[p].end(), r) - lower_bound(pos[p].begin(), pos[p].end(), l);
		}
	}
	printf("%lld", ans);
	return 0;
}

标签:pre,洛谷,log,val,int,P7003,mid,区间
From: https://www.cnblogs.com/Kobe303/p/16829789.html

相关文章

  • 洛谷P2512 [HAOI2008]糖果传递
    SLOJP1117.糖果传递题目描述有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为11。输入格式小朋友个数n,下面n行ai​......
  • 洛谷 P6453
    设第\(i\)列高\(h_i\),建立序列\(h_i\)的小根笛卡尔树,然后树形DP。发现这样就将原来不规整的图形剖分成若干个矩形:我们发现,这样构成的若干个矩形正好对应小根笛卡......
  • 洛谷优秀油猴插件推荐
    前言转载自眭然的博客,有改编和新增下载链接油猴zip1.先打开edge浏览器的扩展(其他浏览器应该也可以加扩展,不过edge最好)2.打开开发者模式和允许来自其他应用商店的......
  • 洛谷 P6223
    树形DP完全不会。。首先将题目条件改一下:每个人有\(x-v_i\)块钱,要求使所有人的钱数非负的最小操作次数。注意到对于节点\(u\),在子树\(u\)内至多操作\(siz_u-1\)......
  • 洛谷 P5698 [CTSC1998]算法复杂度 题解
    前言咕了大半年,我回来了说实话当鸽子的感觉挺不错???原题链接题意给定一个伪代码,判断他总共需要进行几次操作,用多项式形式输出。题解首先,这是一道模拟题,发现性质的话比......
  • 洛谷 P3401
    甚么神仙题啊……#include<iostream>#include<vector>#include<cstdio>#include<cstring>#include<iterator>#include<utility>#defineintlonglongusin......
  • 洛谷上扒的DP练习题
    DP综述最优子结构:把原问题化到规模更小的问题后,原问题的最优解一定能从规模更小问题的最优解推出。无后效性:如果在某个阶段上过程的状态已知,则从此阶段以后过程的发展变......
  • 洛谷 P8089
    考虑对于满二叉树,显然只与\(dep\)有关,设\(f_{i}\)表示深度为\(i\)的答案(确切的说应该是到最深深度的距离),则有\(f_1=1,f_i=(f_{i-1}+1)^2(i\ge2)\)。则对于完全二叉......
  • 洛谷P5020题解
    原题P5020[NOIP2018提高组]货币系统思路概述题意分析给定包含一个整数\(n\)和一个正整数集合\(a\)的货币系统\((n,a)\),要求将其化简,输出最简的货币系统中的面......
  • 洛谷P2827题解
    原题P2827[NOIP2016提高组]蚯蚓思路概述题意分析给定整数\(n,m,q,u,v,t\)和一个数列\(\{a\}\),进行\(m\)次操作如下:每次选取其中最大数\(x\)切分为\([px],x......