自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 二分模板

第一个>=x的位置 lwhile (l <= r){int mid = (l + r) / 2;if (lst[mid] < x) l = mid + 1;else r = mid - 1;}最后一个=x的位置 l-1while (l <= r){int mid = (l + r) / 2;if (lst[mid] <= x) l = mid + 1;else r = mid - 1;}while(l<r)如果为check成功 l=mid,e

2021-02-23 00:48:40 198

原创 C2. Guessing the Greatest (hard version) (二分、思维)

题目对于easy情况的做法是,对每个范围都询问两次第二大值,借用第二大值确定最大值所在范围,然后缩小范围。hard情况的做法是,先询问第二大值所在位置p,然后根据最大值所在其左还是右分情况进行二分,其比easy询问次数少了一半是因为每次问询都使用mid—p(假设最大值在p左边),如果第二大值位置还等于p,说明最大值位于mid—r范围内,使 l=mid,如果第二大值位置不等于p,说明最大值位置不位于mid—r范围内,使 r=mid-1,最大值在p右边的情况也类似。还要注意下不能询问范围为1的区间。Cod

2021-02-23 00:04:30 324

原创 D. Max Median (二分、思维)

题目从结果分析,答案必定是数组中的一个值,那么我们将值排个序开始二分。check的话,对于我们将要检查的值mid,将原数组中所有小于mid的值设为-1,大于等于mid的值设为1,对于一段区间看其中位数是否>=mid,只要看变化后该区间的总和,如果>0则其中位数>=mid。用一个前缀和sum记录即可,从k开始遍历(最小长度为k),假设遍历到了 k+3,那么sum[k+3]-sum[0] sum[k+3]-sum[1] … sum[k+3]-sum[3]都可以取用,我们想要使值尽可能

2021-02-22 23:49:10 444

原创 1408D - Searchlights (思维、枚举)

题目从结果来分析,最小的步数必然是往右走多少步使一部分盗贼到达安全区域,然后再向上走一部分使余下的盗贼到达安全区域。那么我们从0到1e6+1枚举所有向右走的步数加上在该步数下最小向上走的步数,取其中最小值即为答案。那么问题来了,这个最小向上走的步数我们如何能够快速得到答案?其实只需要一个从后往前遍历记录的向上移动所需最大值数组即可。简单来说就是,对于一个盗贼x,y,灯塔tx,ty,可以让盗贼向右移动tx-x+1使其脱离范围,也可以使其向上移动ty-y+1使其脱离范围。然后我们用一个数组dis[tx-x+

2021-02-22 23:24:01 170

原创 1438C - Engineer Artem (构造)

题目思路:如横纵坐标相加为奇数则将对应位置的数变为奇数+1或不加,如横纵坐标相加为偶则将对应位置数变为偶数。这题我觉得要培养一种感觉,看到一个题目,它给了什么条件要按给的条件那个方向去多思考一下,就像本题说可以加一或不加,那么我们想想加一其实比较容易想到的就是改变奇偶性。而有些题它给了一些数据大小,其实也是一种引导,引导着我们要去用符合数据范围的算法,从出题人的角度想想这些条件可能要考什么。#include<iostream>using namespace std;int main(

2021-02-19 22:50:13 122

原创 D. Irreducible Anagrams (思维、前缀和、构造)

题目题意:一个字符串如果只是其中字符顺序被打乱则称其和原字符串相互为字谜。对于两个互为字谜的字符串,两个字符串按相同的位置分割开成为n(n>=2)个小串,然后每个小串都互为字谜,则称这两个字符串是互为可还原的,现在给我们一个字符串,再给出q次问询,每次问询给出一个区间,要我们判断区间内的字符串是否具有任意一个不可还原的字符串与之对应(不可还原需要两个字符串互为字谜且不是可还原的)。思路:其实判断其是不是可还原串拆成n个小串变为拆成2个小串就可以了,因为可以拆成n个必定也可以拆成2个。然后我们构造一

2021-02-18 22:34:20 135

原创 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 243

原创 C. Floor and Mod (分块整除)

题目a/b=i, a%b=i -> a=i*(b+1),(对于一个b可以配出几个i就可以产生几个贡献)可以知道对于给出的x,y 取任意1<=b<=y,一个b产生的贡献为min(x/(b+1),b-1)当x>=(b+1)(b-1)时对于此时的b的贡献全取b-1当x<(b+1)(b-1)时按x/(b+1)的贡献,此时用整除分块求解另注意下范围,细节见代码Code:#include<iostream>#include<cmath>#def

2021-02-18 00:56:05 213

原创 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 485 3

原创 F. Equalize the Array (map、思维)

题目思路:看一个例子x:y 表示 拥有x个相同的数有y个(2:3 1 1 2 2 3 3)现在有 4:5 3:3 1:8 即 有5个数量为4的数 3个数量为3的数 8个数量为1的数现在我们要求使得剩下的数的数量都相同的最少删去数的个数,即让剩下数的个数最大我们假设要让最后所有的数都剩下数量为4,那么把1和3的所有数删掉即可,剩下数的个数4*5=20.继续这个过程如要让剩下的数数量都为3,那么我们需将那5个数量为4的数各自删掉一个数,再加上所有数量为3的数,即为20-(4-3)*

2021-02-17 23:39:43 539

原创 E. Accidental Victory (思维、二分)

题目思路:首先将数组排个序,容易知道要看一个数能不能成为冠军,其实就是将这个数从小到大不断与比他小于等于的数合并相加如果最终能够合并为一个数则其有成为冠军的机会。在这我们先看看暴力的思路,就是遍历每一个数然后让它与最小的数开始相加直到最终它不能再和后面的数相加(前面所有的总和都比后面的某个数小)或合并为一个数了,O(n^2)这毫无疑问会超时。我们想如何进行优化,其实在这我们可以发现对于两个数a<b,a会一直把前面小的数加完 而b也会把a加的那一部分数再加一次,这就重复进行了操作,这时我们可以先从

2021-02-17 22:56:09 526 2

原创 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 189

原创 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 239

原创 C. Minimum Ties (构造)

题目当n为奇数 ,构造第一人获胜情况前(n-1)/2项为1,后(n-1)/2项为-1,其余人的获胜情况就是前一人往后滚动一位如:n=5第一人对第二三四五人的情况 1 1 -1 -1第二人对第一三四五人的情况 -1 1 1 -1第三人对第一二四五人的情况 -1 -1 1 1第四人对第一二三四人的情况 1 -1 -1 1第五人对第一二三四人的情况 1 1 -1 -1当n为偶数 ,构造第一人获胜情况前(n-1)/2项为1,中间那项为0,后(n-1)/2项为-1,其余人的获胜情

2021-02-16 01:16:27 3013 4

原创 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 2895 3

原创 1368 D. AND, OR and square sum (贪心、位运算)

题目思路:看一个例子对于两个二进制数11001010100100AND结果:0100100 OR结果:1100101如果两个二进制位都为1或0,AND OR 中结果不变还是1或0,如果一个是0 一个1,就会把1转到OR结果中AND中的那个位变为0。我将这个过程看作是一个让1往一个数(OR结果)分配的过程,所有二进制每个位总的个数不变,但通过上述操作可以让1集中到一个数上面,我们可以通过无限次操作总是拼出来一个大的数,相应的这个数花费的各个二进制位数减1,直到所有二进制位的个数耗尽,这样得出来

2021-02-12 22:28:27 255

原创 1372 D. Omkar and Circle (思维、前缀和)

题目思路:对于为n的奇数,可以进行(n-1)/2次让一个数取代相邻两数操作,直到最后只剩下一个数,其实每次操作就是删掉了一个数,那要如何让删除后的总和最大? 首先贪心一下,我们一定不能删掉变成了两个数相加的那个数,如 1 2 3 4 5 假设第一步删掉1 -> 7 3 4 那之后删掉的数不能是7 因为 再删7=删掉1 2 5相当于删去了3个数,我们可以对比删掉2 5一定优于删掉1 2 5。而要不删掉已经加过一次的数就一定要删掉不是相邻的数,问题就转化成了从n个数中删掉(n-1)/2个不相邻的数

2021-02-12 12:37:15 193

原创 D. Radio Towers(dp、逆元)

题目思路:状态方程dp[i]代表从1–n都被照亮的方法数。dp[i]=dp[i-1]+dp[i-3]+dp[i-5]+dp[i-7]…可以看一个例子i=5,假设0表示没照亮1表示照亮dp[5] 1到5都亮可以由以下状态转变而来dp[4] 11110 在i=5处放亮度为1的灯dp[2] 11000 在i=4处放亮度为2的灯dp[0] 00000 在i=3处放亮度为3的灯故dp[5]=dp[4]+dp[2]+dp[0]再如dp[6]=dp[5]+dp[3]+dp[1]所以我们

2021-02-11 00:29:08 230

原创 逆元

参考于此篇博客:https://www.cnblogs.com/kongbursi-2292702937/p/10582258.html逆元定义:对于a*b≡1(mod m),b是a在模m下a的逆元。首先对于同余符号≡,如 a≡b%m 表示的意思是a%m=b%m,a、b模m后余数相同。逆元可以看作一个数的倒数 c * b≡1(mod m)(b为c的逆元)可得(a/c)%m=(a*b)%m推导过程:(a/c)%m=(a/c)*1%m=(a/c) * c * b%m=(a * b)%m由费马

2021-02-10 19:48:04 1187

原创 D - AB Graph (构造、图)

题目思路:分为两种情况:1.当m为奇数时,直接12121212…构造出的一定是回文。2.当m为偶数时,可以知道n>=3时一定可以构造出。证明如下:当1,2,3三个点中出现来回字母一样,只需两个点不断循环即可。当无上述情况,来回必然是a,b交叉,因此我们一定可以找到如下的图。其实就是有连续两个a,1->2->3->1,或2->3->1->2,或3->1->2->3,这几种情况aab,aaa,aba…因为是循环的一定可以找出两个连续的a构成

2021-02-08 17:20:45 336

原创 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 342

原创 1481C Fence Painting (list、map)

题目思路:对于失败有两种情况:1.统计所有的需要修正成各种颜色的数目,如果发现对于一种颜色我们所拥有的画师数少于所需修正的数目,则失败。2.我们会发现其实可能有画师会画不属于b[i]中所有的颜色,如果这个画师是最后一位画师(最后画)那么没有任何的画师可以在之后将他的画修改为正确颜色,失败。再来分析成功的画师分配:对于每个需要修改颜色的地方用队列做位置记录,分配画师的时候队列不空就pop掉一个,空了的话就(也就是这种画师该修改的颜色位置已经全部修正完毕,该画师多余)直接修改最后一个画师的画,反正最后

2021-02-07 21:59:55 390

原创 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 447 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 114

原创 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 168

原创 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 160

原创 树状数组模板

#define lowbit(x) (x&(-x))int c[Max], n;//n为元素个数void add(int x, int v)//单点给元素+v{for (int i = x;i <= n;i += lowbit(i))c[i] += v;}int que(int x)//询问前x元素的总和{int ans = 0;for (int i = x;i != 0;i -= lowbit(i))ans += c[i];return ans;}...

2021-02-04 18:30:35 96

原创 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 114

原创 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 206

原创 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 159

in.txt,题目所读数据文档

题目所读数据文档

2020-06-01

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除