线段树
qcccc_
这个作者很懒,什么都没留下…
展开
-
[SDOI2009]HH的项链
题目链接 个人感觉这是一道很精妙的写法,首先如果在线求的话不好求,那么考虑离线,离线的话,肯定要排序,那就得看按左端点 排序还是按右端点排序,这里按右端点排序,至于为什么等下就知道了。我们要找的是区间内不同数的个数,因为按照 右端点排序了,所以根据贪心的想法,如果一个数在一个一直往右扩张的区间中,出现多次那么我们只要算最右边的那 个数的贡献就好了,所以我们找出每一个数的上一个数是多少然后使得该位置贡献-1(原来是1),然后现在这个位置+1 然后算答案的时候是sum(a[i].r)-sum(a[i].l-1)原创 2021-08-20 11:09:22 · 55 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(8)Counting Stars
Counting Stars 官方题解是这样的 题目类似于求根号的和,就是对于第一种操作每一个数最多减少lon(a[i])次,那么总体用线段树单点修改的话就只要修改n*lon(a[i])^2次,对于第二种操作,只对最高位有用,所以可以考虑开两个线段树来维护最高和除了最高位的其他数,最高位可以区间修改,最低为位单点修改。 #include <algorithm> #include <deque> #include <iomanip> #include <iost原创 2021-08-12 21:42:23 · 93 阅读 · 0 评论 -
Codeforces Round #731 (Div. 3) F
F. Array Stabilization (GCD version) 本题大概题意是: 给你一个数组,每次变换为a[i]=gcd(a[i],a[i+1]),而且是一个环状的,即a[n]=gcd(a[n],a[0]),每次操作遍历一遍数组, 问经过多少次操作是得a[1]==a[2]==a[3]==....a[n]. 思路是: 第一次操作后a[1]=gcd(a[1],a[2]),a[2]=gcd(a[2],a[3]),a[3]=gcd(a[3],a[4])... 第二次操作后 a[1]=gcd(a[1],g原创 2021-07-15 15:09:18 · 90 阅读 · 0 评论 -
Can you answer these queries? HDU - 4027(线段树)
Can you answer these queries? HDU - 4027 本题是一个看起来像是区间修改的单点修改线段树,因为区间修改不好维护。这个也太难为我了,我想了想好像我不会这种题目,只能暴力求解了,但是问题来了,单点修改的话,绝对超时,但是我不信,写了一发,wa的很开心,然后就想怎么减枝,仔细想了想发现当一个区间的最大值小于等于1的时候就不用修改的,那就很舒服,因为每次是开根号,所以很快就会变成1或0了,时间复杂度是O(能过),值得注意的是x和y的大小是不确定的 #include<i原创 2020-08-14 16:03:05 · 74 阅读 · 0 评论 -
Mayor‘s posters POJ - 2528
Mayor’s posters POJ - 2528 这是一个线段树的题目,不过要离散化,而离散化是一个板子,但是这个离散化和之前的离散化有点不一样,这个离散化后还要处理离散化后的结果,我就不解释了,直接上大佬们的链接,反正我也是看他们的代码打的,我化石太菜了,每天自己再打一遍,不看别人的代码再打一遍,看看还能不能打出来。 大佬的题解链接 下面是本菜鸡的菜鸡程序,几乎照着大佬的代码打的 我离散化的板子,感觉挺好用的 vector<int>v; int getid(int x) { r原创 2020-08-12 21:54:49 · 88 阅读 · 0 评论