首页 > 其他分享 >洛谷 P8569 [JRKSJ R6] 第七学区

洛谷 P8569 [JRKSJ R6] 第七学区

时间:2022-10-11 17:37:26浏览次数:89  
标签:R6 洛谷 typedef long P8569 lst 64 frac define

洛谷传送门

好题,吹爆 JRKSJ!

考虑朴素的 \(O(n \log V)\) 做法。枚举第 \(i\) 位,需要计算所有极长连续的全 \(0\) 区间长度,答案为 \(\sum\limits_{i=0}^{63} 2^i \times (\frac{n(n+1)}{2} - \sum\frac{len(len+1)}{2})\)。

然而这样不能通过。考虑分块,每 \(B\) 个元素为一块。

  • 块内的子区间暴力枚举即可。这部分复杂度是 \(O(nB)\)。
  • 算块间的贡献,考虑算出当前块第 \(i\) 位第一次出现的位置 \(f_i\) 和最后一次出现的位置 \(g_i\)。再维护一个 \(lst_i\) 表示前面的块第 \(i\) 位最后一次出现的位置。考虑计算块内的前缀或序列 \(s_i\),那么 \(s_i \oplus s_{i-1}\) 就是 \(a_i\) 在块中第一次出现的位。这部分的时间复杂度为 \(O(\frac{2n \log V}{B})\)。
  • 算出来 \(f_i\) 和 \(g_i\),考虑计算块间的贡献。枚举第 \(i\) 位,沿用暴力方法,右端点在当前块的全 \(0\) 区间数量为 \((f_i - l) \times (l - lst_i - 1)\)。若当前块的所有元素的第 \(i\) 位都是 \(0\),数量就是 \((r - l + 1) \times (l - lst_i - 1)\)。每次用 \(g_i\) 更新 \(lst_i\) 即可。这部分的时间复杂度为 \(O(\frac{n \log V}{B})\)

总时间复杂度为 \(O(nB + \frac{3n \log V}{B})\),实测 \(B = 17\) 最优。

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

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

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

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 21], *p1 = buf, *p2 = buf;

namespace READ
{
	ull Read()
	{
		char ch=getchar();
		ull s=0;
		while(ch<'0'||ch>'9') ch=getchar();
		while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
		return s;
	}
	ull tp[10005];
	int l,r;
	ull g1,g2;
	void init(int &n)
	{
		int i,k;
		n=Read(),k=Read(),l=1;
		for(i=1;i<=k;i++)
			tp[i]=Read();
	}
	ull read()
	{
		if(l>r)
			l=Read(),r=Read(),g1=Read(),g2=Read();
		return tp[l++]*g1+g2;
	}
}

const int B = 17;

int n, f[64], g[64], lst[64];
ull a[64], b[64], c[64], ans, sum;

void solve() {
	READ::init(n);
	for (int l = 1; l <= n; l += B) {
		int r = min(l + B - 1, n), len = r - l + 1;
		sum += 1ULL * len * (len + 1) / 2;
		for (int i = l; i <= r; ++i) {
			a[i - l + 1] = READ::read();
		}
		for (int i = 1; i <= len; ++i) {
			ull s = 0;
			for (int j = i; j <= len; ++j) {
				s |= a[j];
				ans += s;
			}
		}
		mems(f, 0);
		mems(g, 0);
		b[0] = 0;
		for (int i = 1; i <= len; ++i) {
			b[i] = (b[i - 1] | a[i]);
		}
		for (int i = 1; i <= len; ++i) {
			ull val = (b[i] ^ b[i - 1]);
			while (val) {
				f[__builtin_ctzll(val)] = i + l - 1;
				val ^= (val & (-val));
			}
		}
		b[len + 1] = 0;
		for (int i = len; i; --i) {
			b[i] = (b[i + 1] | a[i]);
		}
		for (int i = 1; i <= len; ++i) {
			ull val = (b[i] ^ b[i + 1]);
			while (val) {
				g[__builtin_ctzll(val)] = i + l - 1;
				val ^= (val & (-val));
			}
		}
		for (int i = 0; i < 64; ++i) {
			if (f[i]) {
				c[i] += 1ULL * (f[i] - l) * (l - lst[i] - 1);
				lst[i] = g[i];
			} else {
				c[i] += 1ULL * (r - l + 1) * (l - lst[i] - 1);
			}
		}
	}
	for (int i = 0; i < 64; ++i) {
		ans += (1ULL << i) * (1ULL * n * (n + 1) / 2 - sum - c[i]);
	}
	printf("%llu", ans);
}

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

标签:R6,洛谷,typedef,long,P8569,lst,64,frac,define
From: https://www.cnblogs.com/zltzlt-blog/p/16779919.html

相关文章

  • 【洛谷】P8256 [NOI Online 2022 入门组] 字符串(dp)
    原题链接题意给定两个由0,1,-组成的字符串\(S\),\(T\),以及一个空串\(R\)。\(S\)的长度为\(n\)。现在要进行\(n\)次操作,每一次操作取出\(S\)的第一个字符\(c\)......
  • 洛谷 P2766【网络流】【线性DP】
    摘自网络流\(24\)题官方题解。第一问:直接\(O(n^2)\)DP求解最长不下降子序列即可。第二问:使用类似于酒店之王的思想,将点\(i\)拆成两个点\(i_1\),\(i_2\)。然后......
  • 洛谷 P8572【暴力】【根号分治】
    根号分治。需要进行分类讨论:当\(n\lek\)的时候,可以进行暴力\(\#1\):暴力求出数组所有区间的最大值。(需要使用前缀和)否则,可以使用一个叫做“记忆化”的鬼玩意。如......
  • 洛谷P4320 道路相遇(LCA+圆方树)
    题目链接:https://www.luogu.com.cn/problem/P4320道路相遇题目描述在H国的小w决定到从城市$u$到城市$v$旅行,但是此时小c由于各种原因不在城市$u$,但是小c决......
  • 洛谷 P3488 [POI2009]LYZ-Ice Skates 题解
    错解每次跑二分图匹配,时间复杂度显然爆炸。时间复杂度:我被杀手皇后摸过了正解引入Hall定理:设二分图中\(G=<V_1,V_2,E>,|V_1|\le|V_2|\),则G中存在\(V_1\)到......
  • 洛谷 P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
    题目https://www.luogu.com.cn/problem/P3067思路考虑折半搜索,第一个dfs对[1,n/2]的数进行分组,+代表第一组,-代表第二组,并计算两组总和的情况方案数\(a_i\)。第二个dfs......
  • 洛谷 P3530 / bzoj2788【tarjan】【差分约束】
    判断是否有解可以使用差分约束。求解赛车手的成绩的取值可以使用Floyd。但是\(O(n^3)\)会TLE。可以先进行一次缩点。然后进行Floyd求出每一个连通块内的最长路径......
  • 洛谷 P5194 [USACO05DEC]Scales S 折半搜索
    题目https://www.luogu.com.cn/problem/P5194思路\(n\leq1000\)的范围很吓人,但是按照【每个砝码的质量至少等于前面两个砝码的质量的和】的规则,打表可知n在50时总重量......
  • 【做题笔记】洛谷P5584 【SWTR-01】Sunny's Crystals
    ProblemP5584【SWTR-01】Sunny'sCrystals题目大意:给你一个长度为\(n\)的序列,每次可以删掉下标为\(2\)的非负整数次幂的数,删掉一个数后他后面的数会往前补,问删掉所......
  • 洛谷 P6146
    由于博主是只鸽子,所以咕咕咕。()不,应该是目录不在更新,请关注博客首页。有空我把目录更新一下,好久不更了传送门YouareMiserable(ATLv.15)思路Stage1这题其实是个......