题解
_Rikka_
- v -
展开
-
C. Covered Points Count (线段问题---差分、排序)
题目两种解法:1.用差分思想,l—r所有点加1用map[l]+1,mdp[r+1]-1表示,前缀和即是当前点所对应覆盖线段数。Code:#include<iostream>#include<stack>#include<map>#include<string>#include<algorithm>using namespace std;typedef long long ll;const int Max = 1e6 + 5;原创 2021-03-06 22:00:57 · 272 阅读 · 0 评论 -
Cable master POJ - 1064 (二分精度)
题目思路:二分每条绳子的长度,循环100次即可。判断条件:每一段向下取整求最大可以裁剪的数量,如果所有数量大于等于k则满足l=mid,小于则不满足r=mid。使用流输出还需注意cout规定小数精度后是四舍五入的,但printf是只截取前多少位。#include<iostream>#include<cmath>#include<iomanip>using namespace std;typedef long long ll;const int Max = 1原创 2021-03-06 13:35:30 · 105 阅读 · 0 评论 -
C. Long Beautiful Integer (构造)
题目思路:先构造成最小的情况,从前k个数的每个数开始,之后每隔k个数令其等于前面的该数,如 lst[3]=2 i=3(k=4) lst[7] lst[11] lst[15]…=lst[3]=2, 如果此时构造出来的数满足大于原数,则输出。如果不满足则把lst[k] lst[2k] lst[3k]…全体+1,但可能会发生+1后变为10,所以需要从lst[k]往前找到第一个小于9的数位置噢p,将其每隔k个全变为lst[p]+1 lst[p+k]=lst[p]+1…然后再将p—k的数每隔k个全部原创 2021-03-01 21:44:42 · 195 阅读 · 0 评论 -
D. Genius‘s Gambit (构造、细节)
题目这一道题思路其实都有,主要细节比较多,我就wa了很多次…对于x的构造前面b个a后面全是0如 3 6 6 x:111111000再看b的构造首先当k<=a前面1—b-1全为1,第b+k个元素为1,其余0如 4 3 2x:1110000y:1100100当a<k<=a+b-2第a+b个元素为1,再从b-(k-a)+1—b为1,然后就是还剩下的1的个数c=b-1-(k-a)使最开始的c个元素为1,即1—c为1。如 3 6 6x: 111原创 2021-03-01 18:21:12 · 370 阅读 · 2 评论 -
1408D - Searchlights (思维、枚举)
题目从结果来分析,最小的步数必然是往右走多少步使一部分盗贼到达安全区域,然后再向上走一部分使余下的盗贼到达安全区域。那么我们从0到1e6+1枚举所有向右走的步数加上在该步数下最小向上走的步数,取其中最小值即为答案。那么问题来了,这个最小向上走的步数我们如何能够快速得到答案?其实只需要一个从后往前遍历记录的向上移动所需最大值数组即可。简单来说就是,对于一个盗贼x,y,灯塔tx,ty,可以让盗贼向右移动tx-x+1使其脱离范围,也可以使其向上移动ty-y+1使其脱离范围。然后我们用一个数组dis[tx-x+原创 2021-02-22 23:24:01 · 180 阅读 · 0 评论 -
C. Mind Control (暴力)
题目思路:先来看一个简化版的问题,就是对于 2 9 2 3 8 5 ,我是第3个人,那么答案其实就是前面二人取(前面两个)2,9 max(2,5)=5前后各一个 2,5 max(9,8)=9后面两个 8, 5 max(2,3)=3答案为min(5,9,3)=3 即最小都能达到的先在来看原问题,我们还可以指定选k个人,那么其实也就只有k种情况,让k个人全取前面0个人取后面,k-1人取前1人取后面…O(n^2)可以实现。而假设指定1个人取前面,1个人取后面,就相当于将原数列原创 2021-02-18 21:37:25 · 257 阅读 · 0 评论 -
G. Old Floppy Drive (math、二分)
题目思路:失败的情况:n个数全部相加一遍总和<=0,且前缀和的最大数max也比所询问的数x小成功的情况:因为询问的次数较多,用二分查找优化,先创造个二分的递增条件对于能在一个循环就找到符合条件的答案 x<=max(上文提及)模拟一下过程,3 -2 2 -1 5 4 -3 , 前缀和: 3 1 3 2 7 11 8 如果x=7 要用二分找出第一个>=7的数所在位置,可以知道对于3后面的那个1来说前面的3已经小于7了,1比它小也不可能大于所以这个1是无效的,只有出现>3的数原创 2021-02-18 00:18:00 · 496 阅读 · 3 评论 -
C. The Hard Work of Paparazzi (dp)
题目思路:这是一道最长递增子序列的变式。dp[i] 代表前i个名人中第i个名人被访问所能访问的最大名人数目先看暴力的方法,那么我们直接遍历前面所有情况当abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j] i<j 时dp[i]=max(dp[i],dp[j]+1)但这时时间复杂度O(n^2) 会超时,我们需要优化一下这时我们发现最大的距离不会超过2r-2,而对于每个名人出场的时间是递增的,也就是说一旦出场的名人相隔超过2r-2位那么他们相隔时间也超过原创 2021-02-17 12:02:00 · 196 阅读 · 0 评论 -
F. Zero Remainder Sum(四维dp)
题目状态:dp[i][j][k][o] 代表第i行前j个数已经选定k个数余o最大总和的值首先来单独看一行,lst[i][j] 代表第i行第j个数dp[i][j][k][o]=dp[i][j-1][k][o] , 此代表在第i行我们不选第j个数,所以选定的个数k不变,余数也不变dp[i][j][k][o]=dp[i][j-1][k-1][(o-lst[i][j]+70p)%p] ,此代表第i行选择了第j个数,所以由选定数k-1转换而来,p是题目要求余的数,o-lst[i][j]表示,要想得到加了l原创 2021-02-17 10:31:07 · 248 阅读 · 0 评论 -
D. Pythagorean Triples (math、暴力)
题目题解:因此c=(a*a-1)/2+1我们暴力枚举a,从a=1到(a * a-1)/2+1<=n (C需要<=n)如果满足(a * a-1)%2==0,即b为整数,且c=b+1,C也为整数,符合条件,贡献+1Code:#include<iostream>#include<cmath>#define pii pair<int,int>#define FAST ios::sync_with_stdio(false),cin.tie(0),cou原创 2021-02-16 01:00:07 · 2926 阅读 · 3 评论 -
D - Two Divisors (素数筛)
题目首先:对于gcd有gcd(a,b)=gcd(a+b,b)且若gcd(a,b)=1,则gcd(a,c)=gcd(a,c*b)=gcd(a,c * b^n)现有gcd(d1,d2)=1,->gcd(d1+d2,d1)=1,gcd(d1+d2,d2)=1->gcd(d1+d2,d1 * d2)=1,->gcd(d1+d2,d1^n * d2^n)现在再来看题目要我们求什么,我们只需找到ai的两个互质因数d1,d2 , ai=d1^ n * d2可得gcd(d1,d2)=1,由原创 2021-02-08 00:41:36 · 355 阅读 · 0 评论 -
1481C Fence Painting (list、map)
题目思路:对于失败有两种情况:1.统计所有的需要修正成各种颜色的数目,如果发现对于一种颜色我们所拥有的画师数少于所需修正的数目,则失败。2.我们会发现其实可能有画师会画不属于b[i]中所有的颜色,如果这个画师是最后一位画师(最后画)那么没有任何的画师可以在之后将他的画修改为正确颜色,失败。再来分析成功的画师分配:对于每个需要修改颜色的地方用队列做位置记录,分配画师的时候队列不空就pop掉一个,空了的话就(也就是这种画师该修改的颜色位置已经全部修正完毕,该画师多余)直接修改最后一个画师的画,反正最后原创 2021-02-07 21:59:55 · 402 阅读 · 0 评论 -
1481B New Colony (暴力)
题目看到题目中山最大只有100,那么我们直接暴力模拟O(N^2),对于每一个石块都从第一座山放下去,如果发现有前面的山高于自己则将自己所在的山高度加一,再开始下一块石块,如果有一块石块在这个过程中没发现有比当前山高的顺利度过了所有山那么直接输出-1,结束。如果当到了最后一块石块,则记录最后一个填补的位置,输出即可。#include<iostream>#include<memory.h>using namespace std;typedef long long ll;con原创 2021-02-06 00:47:17 · 455 阅读 · 1 评论 -
1421D - Hexagons (贪心)
题目思路:将此坐标转化为直角坐标系(纵坐标,横坐标),然后将六条路径优化,上cs = min(c6, c5 + c1), 下cx = min(c3, c4 + c2), 左cz = min(c5, c4 + c6), 右cy = min(c2, c3 + c1)。因为还有右上、右下的路径,所以干脆一并优化了 cys = min(c1, cy + cs), czs = cz + cs, cyx = cy + cx, czx = min(c4, cz + cx);//cys右上 czs 左上… 然后直接计算原创 2021-02-05 13:44:15 · 123 阅读 · 0 评论 -
1469D - Ceil Divisions (思维)
题目思路:首先对于1 2 3 4 . . . 2e5 我想啊,让 i=3 到 2e5-1的数全部 i/2e5 那么这些数就全为1了,1 2 1 1 1 … 1 1 2e5 ,我们这时操作次数还剩下8次(1,2,2e5没用掉),但2e5/2 8次不够用啊,所以接着我想留出一个10来现在操作次数剩下9次,2e5/10 用掉了6次,10/2又要用掉4次,比9次多了一次.那么我想这让2e5/a 用掉5次,a/2还是用4次就可以了。将a最大化16,16/2用4次,2e5/16用5次,那不就解决了嘛。但n原创 2021-02-05 13:28:25 · 184 阅读 · 0 评论 -
1430E - String Reversal (树状数组、队列)
题目思路:首先贪心一下,我们想要使得移动次数最小那肯定用前面离得近的元素去移动,所以我们用一个que来记录各个元素的位置,每使用完这个前面的位置的就pop掉。其次对于每一次移动我们需要知道它之前还剩多少个元素在这我们用树状数组来维护,每移去一个元素我们就让这个元素-1,初始时都为0.然后每次操作只需+que(i)-1的贡献即可。如:3 4 5 3 7 6 3假设我把7移到了最前面(干脆直接当作7不存在了) 3 4 5 3 (7) 6 3,那么对于原本7后面的6 3,他们下一步想要移到队首需要交换的次原创 2021-02-04 18:55:56 · 170 阅读 · 0 评论 -
1420D - Rescue Nibel! (组合数+排序)
题目思路:首先给所有的区间排个序,使L(左边界)小的排在前面,然后开始枚举,每枚举完一个区间把该区间的R(右边界)加入到multiset中,如果遇到当前区间的L大于multiset中的R值则抛出该R,因为L是递增的该R也不会对之后的区间产生贡献,对于每个枚举的区间ans+=cal(multiset.size(),k-1)表示已经选定了该区间再从multiset之前出现过的区间中选出k-1个区间(不符合条件的R>该L的已经被erase了),这种方法是不重不漏的。现在解释一下,为何这是不重不漏的。首先原创 2021-02-03 21:05:24 · 122 阅读 · 0 评论 -
Guess The Numbe (交互题)
D. Guess The NumberTime limit 2 secondsMemory limit 512MbInput standard inputOutput standard outputThis is an interactive problem.Somebody has secretly set the number x (1 ≤ x ≤ n). Your program has to guess this number interacting with the testi原创 2021-02-01 21:39:57 · 217 阅读 · 0 评论 -
1400B - RPG Protagonist (暴力)
题目思路:一开始觉得像个dp,但一看范围太大了。然后发现每种刀剑的质量固定的特点,那么很容易想到贪心肯定先把质量小的搞完,而数量范围最多2e5。所以暴力遍历主人拿质量小的货物(刀或间)从0–最大可拿的数量个,然后剩下的容量去拿另一种。到了仆人尽可能先拿质量小的货物,剩余容量去拿质量大的。注意边界即可。Code:#include<iostream>#include<cmath>#define pii pair<int,int>using namespace st原创 2021-02-01 14:16:07 · 168 阅读 · 0 评论 -
1478C Nezzar and Symmetric Array (构造)
题目思路:首先来看一下这个距离是怎么计算的-4 -3 -2 -1 0 1 2 3 4 不难发现4到3和-3的距离和=2 * 4 到-2 2到-1 1的距离和也都为2 * 4,在此可以发现规律一个较大的数到两个较小的数的距离和等于其自身二倍。观察0 1 2 -1 -2…到4 -4的距离和为都为2*4,又发现了一个规律一个绝对值较小的数和两个绝对值比它大的正负数的距离和=二倍大数的绝对值。那么给出了d的序列,不难得出最大的那个di必然是最大的那个数和其他数的距离和,其对应的ai值为(di/2)/n,现在原创 2021-01-29 01:32:23 · 1664 阅读 · 3 评论 -
1334 - D. Minimum Euler Cycle(思维)
题目思路:其实构造起来还是不难的,要使形成一条字典序最小的欧拉回路。如下:n=5121314152324253435451从这不难发现规律,我们只需找到它的起始位置,然后开始模拟,假设是第i行,i i+1 i i+2 i i+3…n每次到了n时到下一行i+1开始,正好模拟r-l+1步即可,细节见代码。Code:#include<iostream>#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)原创 2021-01-27 21:57:42 · 247 阅读 · 0 评论 -
1334 - C. Circle of Monsters(贪心)
题目思路:当我们选定了一个怪物作为开始先杀掉后,对于余下的怪物我们一定要按顺序一个个杀掉,因为对于一开始被杀的后一个怪物(如果没炸死的话)我们最终一定要杀掉的,如果他是在他后面一个怪物被杀之后被杀那么它的爆炸不会产生贡献,我们在贪心的决断下,一定要先杀他让它的爆炸伤害物尽其用。那么其实我们只需枚举一下各个怪物第一个杀,取最小即可。但暴力的话复杂度O(n^2),但可以发现其实对于每一个结果只是改动了一个小地方。我们先求出一个假设每个怪物的爆炸伤害都做出了贡献的sum=min(i-1的爆炸伤害-i的生命值,0原创 2021-01-27 21:00:15 · 199 阅读 · 0 评论 -
1475C Ball in Berland (思维)
题目思路:看N为2e5可知复杂度为O(n)或O(nlogn),在这我用两个map分别记录每个男和女各自可以和多少匹配,首先选好一组匹配,那么还可以找出多少组匹配与之组成两组呢?答案为:k - 此组匹配中男生可以匹配女生数 - 此组匹配中女生可以匹配男生数+1(他们自身匹配那条线多匹配了一次)。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#includ原创 2021-01-26 01:20:02 · 972 阅读 · 2 评论 -
1399D - Binary String To Subsequences(队列)
题目思路:看数据大小1e5可以知道我们需用O(n)或O(nlogn)的算法。故开两个队列,q0,q1,一个表示存储以0结尾一个存储以1结尾,当队列空时另增加一个新的子序列,不为空时将转变一个序列从q0->q1(当遇到1且q0中还剩下xxxx0的字序列时,不剩则再增加一个子序列),细节见代码。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#incl原创 2021-01-25 16:49:58 · 147 阅读 · 0 评论 -
1293C - NEKO‘s Maze Game(分块、贡献)
题目思路:可以知道每一个点要想造成一个不能通过的结果,需要它的正对面 左对面 右对面 ,1岩浆0空地 故我们将其贡献算为,如果当前为x,y为1->0,则贡献减少lst[3-x][y]+lst[3-x][y-1]+lst[3-x][y+1],如果为0->1则减少,另y=1或n时特殊判断。Code:#include<iostream>#include<string>#include<map>#include<algorithm>原创 2021-01-24 23:10:21 · 129 阅读 · 0 评论 -
1301D - Time to Run(思维、模拟)
题目思路:先进行一遍全部过程的模拟储存下来,为了方便模拟尽量先将相同的方向走完,而对于多少步step,将连续的相同方向当作一步,如DDDDDULLL->5D1U3L,只需判别存储好的全部模拟字符串前后不同步数+1即可,细节见代码。#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>#include<cmat原创 2021-01-24 14:55:46 · 186 阅读 · 0 评论 -
1474 - C. Array Destruction (set、思维)
题目思路:可以知道一开始所选的两个数一定要包含最大的一个,假如不包含,那么后面的任何一个数加上最大的那个不可能构成另一个数,按着这个思路走下去,后面的每一步都需要包含还剩下的数中最大的数,如果不包含,理由同上,不可能继续构造下去。所以现在我们只需枚举一开始每一个数当成最初和最大数一起排除出去的即可,细节见代码。Code:#include<iostream>#include<set>#include<vector>using namespace std;typ原创 2021-01-22 17:45:46 · 239 阅读 · 0 评论 -
1358 - D. The Best Vacation (贪心+二分+前缀和)
题目思路:贪心一下,要使拥抱次数最多必然是以每一个月的末尾为最后一天时,假设b(n-3) b(n-2) b(n-1) b(n) …c(1) c(2)… c(n)…a(n-4) a(n-3) 完后挪一个 b(n-2) b(n-1) b(n) …a(n-3) a(n-2) 当a(n-2)>b(n-3)时会使值增加,那么肯定继续挪到最后一个时a(n)最优。而a(n-2)<b(n-3)时我们往回挪使值增大,也挪到c(n)时最优。现在可以知道我们只需枚举每一个最后的点即可,再前缀和记录预处理原创 2021-01-17 22:45:59 · 160 阅读 · 0 评论 -
1265 - C. Beautiful Regional Contest (贪心)
题目思路:要求每个金牌切的题高于银牌,银牌高于铜牌,铜牌高于铁牌,那么必然对于切题一样的队伍只会获得相同的牌。此时我们把切题一样的队看作一个个打包好了的队伍堆,给牌必须一堆一堆的给。且要求金牌一定小于铜牌和银牌,最后要使给出的牌子最多,且给的牌子<=总数/2,每个牌子>0。那么先贪心一下,让金牌只取一个切题最高的堆(留下更多的堆,为了满足每种牌子都有的给,且有多余的堆就给铜和银,不会造成牌子浪费),然后再给银牌取到正好大于金牌,剩下的还能给牌子且使牌子总数<=n/2全给铜牌,如果最终答案原创 2021-01-17 22:23:08 · 251 阅读 · 0 评论 -
1265 - B. Beautiful Numbers
Beautiful Numbers思路:先想想暴力的方法,对于m把从一到m每个数的位置求出来,如果最右边的减最左边的数+1等于m,则说明所有数覆盖的范围刚好是m不会有其他的数是一个1–m的置换。但暴力会T掉,我们再优化一下,其实我们求m+1是否满足可以利用前面求到的范围,只需对m+1这个数更新一下范围,再看是否符合即可,细节见代码。Code:#include<iostream>#include<string>#include<map>#include<a原创 2021-01-17 22:10:19 · 158 阅读 · 0 评论 -
1358 - C Celex Update (思维)
题目思路:一开始我想错方向了,以为是向动态规划一样找递推然后推公式,后来发现其实只要用能得到最大的值减去最小的值就可以得出答案,然后找规律发现先下再右最大,先右再下最小,而且每次两个数相差为1 2 3 … x … x…3 2 1但是会到达一个峰值–min(x2-x1,y2-y1),维持这个峰值,再递减回到1,答案等于(1+2+…+x-1)*2+(x2+y2-x1-y1-1)*x。#include<iostream>#include<string>#include<原创 2021-01-17 01:01:38 · 284 阅读 · 0 评论 -
1263 - D. Secret Passwords (并查集)
题目思路:从答案上来看我们可以知道密码数最多只有26种即26个字母,然后根据可以等效的的密码(即直接或间接拥有相同的字母),我们让可以等效的密码放在一个集合里(对每个密码让每一个字母与第一个字母连边构成一个连通图(并查集)),然后最后的集合数即为答案。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>#in原创 2021-01-16 20:36:45 · 221 阅读 · 0 评论 -
1263-C Everyone is a Winner! (整除分块)
题目老实说一开始并不知道这题是整除分块,就打表找规律做出来的。想着当一个数15 先除以15/1 = 15 15 /2=7 15/3=5 15/4=3 15/5=3 15/6=2 15/7=2 15/8=2…可以知道除到前面一定只有一个值,到了后面出现出现重复的后从3开始2 1 都会存在且重复。所以把从重复的数比其小的取完,再把前面分散的大的也取完就可以,因为有剪枝不会T掉。最开始的代码:#include<iostream>#include<string>#inc原创 2021-01-16 20:28:22 · 186 阅读 · 0 评论 -
1303 C Perfect Keyboard (DFS)
题目思路:这是一道图论题,通过观察我们可以发现如果一个字母旁边出现过三种及以上的其他字母则无解,并且出现环时也无解如:ABCA因为如果有一个环,那必然有两条边,而这个环想要跳到下一个字母必然还需要一条边.其实正确的答案就是链和一些孤立的点了。那么我们就可以把相邻的两个字母连线,统计度数,DFS遍历一遍度数<2的点,链从度为1开始及度为0的孤立点。最后再判断是否有点没被访问到,当出现环时(因为不dfs度为2的点)会出现有点没被访问,细节见代码。Code:#include<iostream&g原创 2021-01-16 15:09:26 · 326 阅读 · 1 评论 -
B - National Project(思维)
题目题意:要做N天活,其中质量好至少(n+1)/2天,然后先g天好,b天不好。思路:找出至少需要(n+1)/2天好的最少天数S,如果>n天,则答案为S,如果小于n天则剩下还要干活的天数全用质量差的也可,答案为n。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>#include<cmath&g原创 2021-01-16 11:44:51 · 170 阅读 · 0 评论 -
1360D - Buying Shovels(因数)
题目思路:求一遍因数,取其中最小且满足<=k即可。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>#include<cmath>#define pii pair<int,int>#define FAST ios::sync_with_stdio(false),cin.ti原创 2021-01-15 22:06:10 · 132 阅读 · 0 评论 -
C. Canine poetry (贪心、思维)
题目思路:首先可以知道如果我们要消灭长度>=4的回文串,那么这个大的回文串必然包含小的回文串。所以我们其实只要消灭小的回文串就可以了。其实就是干掉aaa、aba、aa这三种。那么对于很长的一串回文串我们要使其任何子串都无长度>=2的回文串,我们从头开始遍历。如果开始出现aa,贪心一下我们干掉第二个字符,这样会尽可能减少a与之后的形成回文串。类似,aaa干掉后两个,aba干掉第三个,细节见代码。Code:#include<iostream>#include<string原创 2020-12-31 15:58:40 · 555 阅读 · 0 评论 -
1371D Grid-00100
题目思路:要想差值最小,那么我们肯定是要使得这个二维数组的数尽可能平均起来,再看一下数据k<=n*n,故我们往数组中填1,并且要尽可能让每一行每一列的值相差最小,所以我们先将所有行和列的R C值先将其变为1,2,3,4…直到填完k个数。填的方式如图:Code:#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>原创 2020-12-30 13:07:30 · 178 阅读 · 0 评论 -
E1. Close Tuples (easy version)
题目原谅兄弟我只A了easy…所以就写个easy的题解吧…思路:用一个map记录各个值的次数,然后如果某数字数量>=3则可以构成n*(n-1)(n-2)个相同的3个数组成的元组,如果某数字(a)数量>=2则可以构成n(n-1)/2*(a-1的数量+a-2的数量+a+1的数量+a+2的数量)个两个数字为a,其余一个为a+1或a-1或a+2或a-2的元组,如果某数字a的数量>=1则可以构成a的数量a-1的数量a+1的数量三个数字不同(a-1,a,a+1)的元组。对了,还要注意下开long原创 2020-12-16 00:51:43 · 444 阅读 · 0 评论 -
C. Unique Number(思维)
题目思路:其实贪心一下,我们要想数字越小,则在后面的位的数字应该越大,这样留给前面的位的数字才会越小,使得数字总值越小,因此我们从后往前填9 8 7 6…直到填到值大于总和的值然后填入还剩下的数补上即可,并可以发现最大数字值为45 ,123456789,每个数字不同。细节见代码。Code#include<iostream>#include<string>#include<map>#include<algorithm>#include<mem原创 2020-12-16 00:40:40 · 611 阅读 · 1 评论