5177: [Jsoi2013]贪心的导游 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 32  Solved: 15[Submit][Status][Discuss] Description 南京有一条著名的购物街.购物街嘛,就是一排整齐的商店啦~ 导游小Z每次都会把游客团带到购物街里走一段,然后选择一个商店进去购物.小Z接待的游客都是购物狂,他们恨 不得将店内的商品洗劫一空,也就是说,只要他们能买,就一定会继续买(钱够不够你不用考虑,他们都有…
首先预处理出对于每个模数,所有被模数按结果从大到小排序的结果,那么对于一个询问,如果可以在$O(1)$时间内判断某个数字是否出现,则可以$O(1000)$回答. 考虑对序列进行分治,对于区间$[l,r]$,取$mid=\lfloor\frac{l+r}{2}\rfloor$. 处理出$mid$到$[l,r]$内每个位置里每个数字的出现次数,回答所有经过$mid$的询问,然后递归分治$[l,mid)$和$(mid,r]$. 时间复杂度$O((n+m)\log n+1000m)$. #include…
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5177 在网上看到的题解基本都是用主席树,也就是带点骚操作的暴力直接艹过去的.这里分享一个比较清真的分块做法. 因为$ p , a_i $的值域较小,因此我们可以考虑把序列分成$ size $块,预处理出每个块内的数模每个$ p $的最大值,那么查询时只需查询区间中的整块答案,然后再统计零散的元素的贡献.预处理时,我们可以考虑对当前块维护一个数组$ last[i] $表示在当前块内出现…
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如果取了一个数,就把它再在\(Trie\)树上查一次新建一个元素丢回堆里就行了. #include<iostream> #include<cstdio> #include<queue> using namespace std; #define ll long long #de…
经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ,M=; ],rs[N*],v[N*]; void ins(int &x,int y,int L,…
Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或 运算.第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 li 道到第 ri 道中选择.请你帮助他们找出最美味的菜. Input 第1行,两个整数,n,m,表示菜品数和…
示例:输入:25 1 11 10 125 1 23 2 3输出:12 题意:n种树,第i种树有P[i]颗,砍掉每颗树的代价是C[i], 高度是H[i].需要用最小的花费砍掉一些树,让最高的树超过一半. 题解:按高度分类,从小到大枚举最大高度,比当前枚举的高度 h 要高的,一定删,比它小的,如果删前 ? 小的. 贪心代码: #include<bits/stdc++.h> #define ll long long using namespace std; ; struct node{ ll h,v…
给定长度为 \(n\) 序列 \(a[i]\) ,每次询问区间 \([l,r]\) ,并给定 \(b,x\) 中的一个数 \(p=a[i]\) ,使得最大化 \(b \bigoplus p^x\) 主席树+按位贪心. 我们可以直接贪每一位长什么样子,然后再主席树上区间查询即可. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring…
原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L,R]\)之间的数,查询时考虑一下\(x_i\)的影响就行了 #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio&g…
「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% p\) 是分段的且在各段内递增,所以我们可以先分块,记一下每个块内小于等于某个数的最大值,记为 \(g_i\) ,那么我们显然是要在所有的 \(i = kp - 1, k \ge 1\) 中查询 \(g_i\) 并减掉会被 % 掉的部分,那么我们就可以预处理出一个块内的答案了,然后查询的时候暴力查就…
A. 梦境 没啥可说的原题.... 贪心题的常见套路我们坐标以左端点为第一关键字,右端点为第二关键字 然后对于每个转折点,我们现在将梦境中左端点比他小的区间放进$multiset$里 然后找最近的右端点, 然后没了...... 思路总结: 1.贪心套路,坐标排序,最优性选择 2.再有原题一定要赶紧打 B. 玩具 大神题,我考场再也不敢肝期望了kukuku 定义三个数组 $dp_{i,j}$表示当前森林中有$i$个点,然后有$j$个点在第一棵子树的概率 $f_{i,j}$表示当前树有$i$个点,深…
题目链接 要求 \(b\ xor\ (a_j+x)\) 最大,应让 \(a_j+x\) 的最高位尽可能与b相反.带个减法Trie树好像很难做?反正我不会. 从最高位开始,如果这位b是0/1,判断是否存在 \(sum+(1<<l)-x\leq a_j<sum+(1<<l+1)-x\) / \(sum-x\leq a_j<sum+(1<<l)-x\).用主席树判断. 我还在想对于一个询问怎么一次算..直接O(logn)枚举. 注意要从0开始! //46136kb…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4299 https://lydsy.com/JudgeOnline/problem.php?id=4408 (双倍经验) 题解 考虑如果直接给一个序列要求出它的神秘数应该怎么做. 对于第 \(i\) 个数,如果我们已经有了前 \(i-1\) 个数的神秘数 \(s\),那么也就是说 \([1, s - 1]\) 的正整数全部都是可以组成的. 如果 \(a_i \leq s\) 的话,那么 \([…
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小生成树弄出来,因为要求次小生成树.至于为什么次小一定只在最小的基础上改变了一条边,我也不会严谨的证明......打表找规律大法好 剩下的可以有一堆数据结构来维护最大值和次大值(原理两位巨佬都讲清楚了,这里只分析一下算法的优劣) kruscal+倍增+LCA 山楠巨佬的做法,我也写了这一种.复杂度\(…
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一个堆里面 取出最大的\(K\)个就行了 但是,很显然,我们做不到都取出来 所以,考虑怎么优化这个过程 每次堆里面对于每个点就先维护一个最大贡献 显然的,只有取出了最大贡献,才会取出次大贡献 那么,最大/次大/\(K\)大贡献怎么算? 一个点,能够和他组成和弦的是一个连续的区间 最大的贡献就是它和区间…
[BZOJ4571]美味(主席树) 题面 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 i 位顾客认为第 j 道菜的美味度为 bi XOR (aj+xi),XOR 表示异或 运算.第 i 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 li 道到第 ri 道中选择.请你帮助他们找出最美味的菜. Inpu…
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 1064  Solved: 421[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都摆有一本书,上数第i 行.左数第j 列 摆放的书有Pi,…
[BZOJ5304][HAOI2018]字串覆盖(后缀数组,主席树,倍增) 题面 BZOJ 洛谷 题解 贪心的想法是从左往右,能选就选.这个显然是正确的. 题目的数据范围很好的说明了要对于询问分开进行处理. 先考虑询问的模板串长比较大的情况. 那么只需要每次找到一个范围内的最小位置然后接着暴力跳就可以了. 这个这个过程可以把\(AB\)两个串拼接在一起求\(SA\),这样能够匹配上\(P\)串的\(A\)的后缀的起始位置在\(SA\)上就是一段连续区间.考虑每次找出在\(A\)的\([l,r]\…
在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送.现在你要招募一批忍者,并把它们派遣给顾客.你需要为每个被派遣的忍者 支付一定的薪水,同时使得支付的薪水总额不超过你的预算.另外,为了发送指令,你需要选择一名忍者作为管理者,要求这个管理者可以向所有被派遣的忍者…
题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以了 *数组开小查了很久 代码: #include <bits/stdc++.h> using namespace std; #define IL inline #define rint register int #define rep(i,h,t) for (rint i=h;i<=t;i+…
题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的先选单价低的果汁. 那么我们按美味度从大到小将每种果汁排序,然后对于每种果汁建立一个版本的主席树,主席树维护的权值是果汁单价. 每次验证时在对应版本主席树中查找,如果左子树中总体积大于L则递归左子树,否则将答案加上左子树所有果汁的总价然后递归右子树. #include<set> #include&…
题目描述 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操作,操作如下: 1  x y    查询节点x的子树中与y异或结果的最大值 2 x y z    查询路径x到y上点与z异或结果最大值 输入 第一行是两个数字n, Q; 第二行是n个数字用空格隔开,第i个数字vi表示点i上的权值  接下来n-1行,每行两个数,x,y,表示节点x与y之间有边  接下来Q行,每一行为一个查询,格式如上所述. 1 < n, Q ≤ 100000 ,查询1中的y ≤ 2…
分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <iostream> #include <queue> #include <algorithm>…
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小生成树弄出来,因为要求次小生成树.至于为什么次小一定只在最小的基础上改变了一条边,我也不会严谨的证明......打表找规律大法好 剩下的可以有一堆数据结构来维护最大值和次大值(原理两位巨佬都讲清楚了,这里只分析一下算法的优劣) kruscal+倍增+LCA 山楠巨佬的做法,我也写了这一种.复杂度\(…
传送门 自认为是一道思想很妙的题. 直接分析问题. 如果没有xxx的干扰直接上可持久化01trie01trie01trie走人. 但现在有了xxx这个偏移量. 相当于把整个01trie01trie01trie向左平移了xxx. 这个感觉01trie01trie01trie维护不是很可做. 于是我们把可持久化01trie01trie01trie转成主席树. 发现只是把选择左/右子树变成了选择左/右半区间. 然后照样贪心查询就行了. 代码: #include<bits/stdc++.h> #def…
题目链接: https://acm.bnu.edu.cn/v3/problem_show.php?pid=52317 As Easy As Possible Case Time Limit: 1000msMemory Limit: 524288KB 题意 给你一个只含'e','a','s','y'的字符串,问你区间[l,r]内像"easyeasyeasy"这样的最多"easy"重复的子序列,输出easy重复的次数. 题解 1.用倍增的思路来做,每个点只记录最靠近它的…
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一个堆里面 取出最大的\(K\)个就行了 但是,很显然,我们做不到都取出来 所以,考虑怎么优化这个过程 每次堆里面对于每个点就先维护一个最大贡献 显然的,只有取出了最大贡献,才会取出次大贡献 那么,最大/次大/\(K\)大贡献怎么算? 一个点,能够和他组成和弦的是一个连续的区间 最大的贡献就是它和区间…
贪心思想.将a排序后,对于每一个a,找到对应的删除m个后最小的b,每次更新答案即可. 如何删除才是合法并且最优的?首先,对于排了序的a,第$i$个那么之前就应该删除前$i-1$个a对应的b.剩下$m-i+1$可以删,那么在剩下的b中查找第$m-i+2$小即可.每次做完就删除当前a对应的b. 注意离散化. 还有数组不要开大了.... #include<bits/stdc++.h> #define LL long long using namespace std; void read(int &a…
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优的 然后发现这里有一个很重要的性质,\(a_i\)互不相同.那么就必定存在一个点\(mid\),在\(mid\)左边(包括\(mid\))的空格子和人一样多,右边(不包括\(mid\))也一样多 那么很明显,\(mid\)左边的所有人都需要往右跑,\(mid\)右边的所有人都需要往左跑 然后来康康答…
传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$a_j+x$的第$i$位为0时才能让答案的第$i$位为$1$ 考虑把$x$的影响去掉.如果当前的答案是$ans$(即令前面几位贪心情况下最大且第$i$位为0时的$a$),那么只有在区间$[ans-x,ans+(1<<i)-1-x]$的数能在加上$x$之后第$i$位为0(这个可以自己手动算一算) 如…