luogu P2343 宝石管理系统 |分块+堆】的更多相关文章

题目描述 GY君购买了一批宝石放进了仓库.有一天GY君心血来潮,想要清点他的宝石,于是把m个宝石都取出来放进了宝石管理系统.每个宝石i都有一个珍贵值vi,他希望你能编写程序查找到从大到小第n珍贵的宝石.但是现在问题来了,他非常不小心的留了一些宝石在仓库里面,有可能要往现有的系统中添加宝石.这些宝石的个数比较少.他表示非常抱歉,但是还是希望你的系统能起作用. 输入格式 第一行一个整数m,q,表示已经取出来的宝石个数以及接下来的查询或插入操作个数. 第二行m个整数,表示这m个宝石的珍贵值. 以下q行…
Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, r]的时候,对于每个区间内的元素,如果pre[i] < l则这个颜色是第一次出现,ans++. 可以分块后把每一块内部的pre[i]都排好序,这样只要二分查找lower_bound(l)就可以知道块内有多少pre[i] < l的元素. 剩下不完整的块只需单独处理. 问题是修改的时候没法修改了,只…
Luogu P1114 "非常男女"计划/Luogu P2697 宝石串 (感觉我最近很爱做双倍经验的题啊) 使$d$等于第$i$个位置男生数(绿宝石数)减女生数(红宝石数)的差值. 那么差值相等的两个位置之间的人(宝石)是满足相等的. 所以找到在差值相等情况下最左边和最右边的位置. 特别要注意要把$0$的位置作为差值为$0$的起点. (两道题的读入略微有些不同) Luogu P1114 #include<bits/stdc++.h> using namespace std…
[LOJ2736] [JOISC 2016 Day 3] 回转寿司 (分块+堆) 题面 给出一个有n 个点的环,环上各点有一个初始权值 \(a_i\) 给出 Q 个询问,每次询问给出一个区间 [l,r]和一个值 A,对于 A 的变动定义如下 for (int i = l; i <= r; i++) if(a[i] > A) swap(a[i],A); 对于每个询问,回答遍历完区间[l,r]后 A的最终值. 分析 这种交换看起来很难用一般的数据结构维护,考虑对序列分块. 首先,我们发现如果一个块…
官方题解:这是一道论文题.集训队论文<根号算法——不只是分块>. 首先,题目要我们求的东西,就是下面的代码: for(i=k;i<=n;i+=p) ans+=value[i]; 即:从 k开始,每隔p个数取一个数,求它们的和. 这个算法的复杂度是的. 令答案为,表示模数是p,余数是k. 那么,对于第i个数,如何处理它对ans的贡献呢? for(p=1;p<=n;p++) //枚举模数 ans[p][i%p]+=value[i]; //处理对应的贡献 这样看上去很妙的样子,然而的预处…
((^ 0.0 ^)    )~ 堆是一个完全二叉树,对于小根堆,所有父节点<=子节点,下标就和线段树是一样的 在STL里就是优先队列 只有堆顶元素可以操作(询问或弹出). 加入新元素时x,heap[++size] = x,下标t=size: 每次比较它和父节点(t/2)的大小,如果它较小就swap. 删除堆顶元素时,用最后一个元素heap[size--]覆盖heap[1],下标t=1: 每次比较它和左右两个儿子的大小,和较小的swap. 注意: 下标t的值不能大于堆的size: 我一开始是这么…
题解 首先肯定是要求出单源最短路的,我用了堆优化dijikstra ,复杂度 mlogm,值得拥有!(只不过我在定义优先队列时把greater 打成了 less调了好久 然后我们就求出了$i$到源点的最短距离$dis_i$ 定义一个数组 $f_{i, k}$表示从源点到节点$i$的距离比$dis_i$大$k$的路径数,另外一个数组$sch_{i,k}$ 记录某条路径上 该状态是否存在, 若在某条路径上出现了第二次, 并且$k <= K$,则可判断有符合条件的$0$环 对于要求的$f_{i, k}…
嘟嘟嘟 带修改区间第k大. 然而某谷把数据扩大到了1e5,所以用分块现在只能得50分. 分块怎么做呢?很暴力的. 基本思想还是块内有序,块外暴力统计. 对于修改,直接重排修改的数所在块,时间复杂度O(√nlogn√n). 对于询问,二分答案,然后在每个块内再二分统计小于mid的数有几个,块外暴力统计,时间复杂度O(m * log1e9 * √nlog√n),所以只能过1e4. #include<cstdio> #include<iostream> #include<cmath…
题目链接 很巧妙的想法.一开始将1~k-1加入堆中,然后每次从堆里取出一个最小的,判断是不是答案,如果不是,那么就枚举新数的末一位加上. 代码如下 #include<cstdio> #include<cstdlib> #include<cctype> #include<cstring> #include<algorithm> inline long long read(){ ,f=; char ch=getchar(); while(!isdig…
按照国际惯例先发题目链接‍ woc从4月就开始做这sb题.最开始30分升到65分不管了,直到最近几天升到85分,再到今天AC.激动的心情自然是那些一遍就A或者一小时以内就A的神犇难以想象的. 下面说说主要几个分段. # 35分 按题意用堆模拟.每次暴力修改蚯蚓长度,于是get皮肤:TLE蓝. # 65分 考虑到暴力修改消耗的时间复杂度过大,于是考虑偷懒.既然我们不能暴力增长已经存进堆的蚯蚓长度,那就剪短将要存进堆的蚯蚓长度.将目前蚯蚓增加的长度记为mark,从堆里取出来的蚯蚓长度+mark,要存…