首页 > 其他分享 >SP19568 题解

SP19568 题解

时间:2022-10-31 21:58:07浏览次数:78  
标签:cov int 题解 sum mid pos id SP19568

前言

题目传送门!

更好的阅读体验?

好的线段树练习题。

思路

我们要维护三个操作:

  1. 单点加。
  2. 区间推平。
  3. 区间查询质数。

区间推平可以想到珂朵莉树,但是我不会,于是考虑线段树。

容易想到,判断质数部分可以预处理。用欧拉筛,这一点不用多说了吧。

为了叙述方便,用 \(\operatorname{isprime}(x)\) 表示 \(x\) 是否为质数。

然后就是很套路的线段树了,只用维护一个覆盖(\(cov_i\))的 tag 和总答案(\(sum_i\))。

区间推平与查询和线段树板子几乎一样。单点修改时,把 \(cov_i\) 加上 \(k\),\(sum_i = \operatorname{isprime}(cov_i + k)\)。

至于下传,也很简单:\(sum_i = \operatorname{isprime}(k) \times (r - l + 1)\),\(cov_i = k\)。

然后?就没有然后了。代码非常好打,感觉只有蓝。

完整代码

懒得打注释了,上面都说清楚了吧。

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 4e5 + 5, MX = 1e7;
bool flag[MX + 5];
int prime[MX + 5], cur;
void euler() //欧拉筛 
{
	flag[0] = flag[1] = true;
	for (int i = 2; i <= MX; i++)
	{
		if (!flag[i]) prime[++cur] = i;
		for (int j = 1; j <= cur; j++)
		{
			if (i * prime[j] > MX) break;
			flag[i * prime[j]] = true;
			if (i % prime[j] == 0) break;
		}
	}
}
bool isp(int x) {return x <= MX && !flag[x];}
struct SegmentTree
{
	int sum[N], cov[N];
	inline int ls(int x) {return x << 1;}
	inline int rs(int x) {return x << 1 | 1;}
	void pushup(int pos) {sum[pos] = sum[ls(pos)] + sum[rs(pos)];}
	void build(int l, int r, int pos)
	{
		if (l == r)
		{
			cin >> cov[pos];
			sum[pos] = isp(cov[pos]);
			return;
		}
		int mid = (l + r) >> 1;
		build(l, mid, ls(pos)), build(mid + 1, r, rs(pos));
		pushup(pos);
	}
	void lazy(int l, int r, int pos, int k)
	{
		sum[pos] = isp(k) * (r - l + 1);
		cov[pos] = k;
	}
	void pushdown(int l, int r, int pos)
	{
		if (!cov[pos]) return;
		int mid = (l + r) >> 1;
		lazy(l, mid, ls(pos), cov[pos]);
		lazy(mid + 1, r, rs(pos), cov[pos]);
		cov[pos] = 0;
	}
	void update(int l, int r, int pos, int id, int k) //单点加 
	{
		if (l == r)
		{
			cov[pos] += k, sum[pos] = isp(cov[pos]);
			return;
		}
		pushdown(l, r, pos);
		int mid = (l + r) >> 1;
		if (id <= mid) update(l, mid, ls(pos), id, k);
		else update(mid + 1, r, rs(pos), id, k);
		pushup(pos);
	}
	void modify(int l, int r, int pos, int L, int R, int k) //区间推平 
	{
		if (L <= l && r <= R) return lazy(l, r, pos, k);
		pushdown(l, r, pos);
		int mid = (l + r) >> 1;
		if (L <= mid) modify(l, mid, ls(pos), L, R, k);
		if (mid < R) modify(mid + 1, r, rs(pos), L, R, k);
		pushup(pos);
	}
	int query(int l, int r, int pos, int L, int R)
	{
		if (L <= l && r <= R) return sum[pos];
		pushdown(l, r, pos);
		int mid = (l + r) >> 1, ans = 0;
		if (L <= mid) ans += query(l, mid, ls(pos), L, R);
		if (mid < R) ans += query(mid + 1, r, rs(pos), L, R);
		return ans;
	}
} seg;
int main()
{
	ios::sync_with_stdio(false);
	euler();
	int n, T;
	cin >> n >> T;
	seg.build(1, n, 1);
	while (T--)
	{
		char c;
		cin >> c;
		if (c == 'A')
		{
			int k, id;
			cin >> k >> id;
			seg.update(1, n, 1, id, k);
		}
		else if (c == 'R')
		{
			int k, l, r;
			cin >> k >> l >> r;
			seg.modify(1, n, 1, l, r, k);
		}
		else if (c == 'Q')
		{
			int l, r;
			cin >> l >> r;
			cout << seg.query(1, n, 1, l, r) << '\n';
		}
	}
	return 0;
}

希望能帮助到大家!

标签:cov,int,题解,sum,mid,pos,id,SP19568
From: https://www.cnblogs.com/liangbowen/p/16845969.html

相关文章

  • CSP-S 2022 第二轮 nt 游记 & 题解
    CSP-S2022第二轮nt游记&题解T1想了一个小时,想到了一个接近于正解的做法,但最后还是打了个暴力走了。T2第一眼以为很难的博弈论,结果线段树水题。但赛事少考虑了一......
  • CSP-S 2022 题解
    感觉不如校内模拟赛。但是保持状态和不挂分是很难的。希望明年可以做到不挂分并且至少拿满暴力。T1假期计划签到。发现\(n\leq2.5\times10^3\),于是考虑一些\(O......
  • CSP-S 2022 T2 策略游戏题解
    T2比T1简单?可以发现,讨论的情况数不是很多。可以直接用线段树查询然后暴力讨论就好了。(写的好丑)#include<bits/stdc++.h>usingnamespacestd;#defineN1000010#......
  • 第四届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解
    没时间写题解了,随便写两笔吧,看不懂可以联系QQ160042137901(Easy)直接暴力枚举每个状态及其所有转移,时间复杂度\((T2^nn^2)\)。02(Easy)二分答案,用一个单调队列或者优先......
  • 【题解】病毒检测
    Trie+dfs#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<bitset>usingnamespacestd;constintN=500007;chars[1007];int......
  • 【题解】P4683 [IOI2008] Type Printer
    题目传送门:P4683[IOI2008]TypePrinter板子题贪心+字典树+dfs贪心:把最长的字符留在最后打或者最先打把每个字母插入字典树对trie树dfs一遍#include<cstdio>#inclu......
  • CSPS2022 题解
    T1容易想到枚举\(B,C\),然后\(A,D\)可以预处理,即对于\(i\)处理存在路径\(1\rightarrowj\rightarrowi\)中\(j\)的权值最大的,那么只需枚举\(B,C\)然后分别取最......
  • CSP-S 2022 T1题解
    题目描述:在一张图中找到能够到达的四个点,使之点权之和最大。先说说考场上的思路吧,要求不超过k次转车,其实就是要求长度不超过k。所以只需要找出这张图的全源最短路,然后建......
  • 2021 ICPC EC Final B. Beautiful String 题解
    2021ICPCECFinalB.BeautifulString题解题意问给定字符串t的所有子串中形如"114514"分割方案之和。其中'1'、'4'、'5'表示某一字符串,且可重复。分析(暴力\(n^3\))......
  • acm22纳新题题解:D.喜子哥开空调
    喜子哥开空调Description喜子掌管着工作室的空调遥控器,他可以自由调整室内的温度,(这么牛?!我咋不信。。)但每个人最喜欢的室内温度不都相同,如果当前室温k与自身适应的......