题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) #define maxn 300003 #define ll long long using namespace std; int n,m; ll mx[maxn<<2],mn[maxn<…
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有三种:区间加.区间开根.区间求和. $n,m,a_i\le 100000$ . 题解 线段树+均摊分析 对于原来的两个数 $a$ 和 $b$ ( $a>b$ ) ,开根后变成 $\sqrt a$ 和 $\sqrt b$ ,它们的差从 $a-b$ 变成了 $\sqrt a-\sqrt b$ . 又有 $(\sqrt a-\sqrt b)(\sqrt a+\sqrt b)=a-b$ ,因此开方后的差小于原来差的开方. 而当区间差为…
#228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一个长度为 nn 的数列 AA,接下来有 mm 次操作,操作有三种: 对于所有的 i∈[l,r]i∈[l,r],将 AiAi 变成 Ai+xAi+x. 对于所有的 i∈[l,r]i∈[l,r],将 AiAi 变成 ⌊Ai−−√⌋⌊Ai⌋. 对于所有的 i∈[l,…
题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; long long a[N]; struct node{ int l,r; long long maxx,minn,sum; long long lazy; void up(long long val){ maxx+=val;minn+=val;sum+=(r-l+)*1ll*val; lazy+=val; }…
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之间,每次除的数在 $[2,10^9]$ 之间. 题解 线段树+均摊分析 和 [uoj#228]基础数据结构练习题 类似的均摊分析题. 对于原来的两个数 $a$ 和 $b$ ( $a>b$ ) ,原来的差是 $a-b$ ,都除以 $d$ 后的差是 $\frac{a-b}d$ ,相当于差也除了 $d$…
get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一个长度为 nn 的数列 AA,接下来有 mm 次操作,操作有三种: 对于所有的 i∈[l,r]i∈[l,r],将 AiAi 变成 Ai+xAi+x. 对于所有的 i∈[l,r]i∈[l,r],将 AiAi 变成 ⌊Ai−−√⌋⌊Ai⌋. 对于所有的 i∈[l,r]i∈[l,r],询问 AiAi 的和…
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几次就会成1,而这个必须利用开根的性质 我们维护区间最大.最小.和.区间加操作可以直接做. 区间开方操作需要特殊考虑. 首先对于一个区间,如果这个区间的所有数取$x=\left \lfloor \sqrt{x} \right \rfloor$值一样,那么就可以直接区间覆盖. 分析上述过程,一个区间可以…
题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间的数相等,那么他们开方的数也相等,我们直接转化为减去一个数就行了. 但是这是没有办法$AC$的,我们还要加一个特判,就是最大值与最小值差为$1$,且他们开方以后的差也为$1$,如$8$和$9$这两个数,这样就能通过所有数据了.复杂度证明?我不会.. //It is made by wfj_2048~…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4127 题解 首先区间绝对值和可以转化为 \(2\) 倍的区间正数和 \(-\) 区间和.于是问题就转化为区间正数和. 因为每一次增加的量 \(d \geq 0\),所以每一个数只会被从负数变成正数一次.也就是说,从负变正的操作最多出现 \(n\) 次. 于是我们考虑在线段树上对于从负数变成正数的操作暴力修改. 如何判断一个区间内有负数变成正数的操作呢.令 \(c\) 表示这个区间的最大负数.…
传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖可以改成区间减去一个数),否则的话如果最小值等于最大值加一,且最小值和最大值开方之后减少的值一样,也直接打上区间减标记,否则递归下去 考虑复杂度,如果两个相邻的点导致包含这两个点的区间必须从这里分开才能进行开根操作,那么就称其为一个分界点,一个分界点相当于把区间开根分成两次.因为序列的初始值小于等于…