
codeforce
nof_uck
人一我十,人百我万
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces Round #680 1444A - Division
思路可以发现,当 ppp 不是 qqq 倍数的时候,答案就是 ppp,否则的话就需要找一找,那么对于 ppp 是 qqq 的倍数,相当于 ppp 包含了 qqq 的所有质因子。那么需要找一个 ppp 的因子,且 不能被 qqq 整除,且要最大。那么对于 qqq 质因数分解,得到如下形式 : q=p1k1∗p2k2...∗ptktq = p_1^{k_1}*p_2^{k_2}...*p_t^{k_t}q=p1k1∗p2k2...∗ptkt,显然 ppp 肯定包含这些质因数(次数),那么让 xx原创 2020-11-09 22:07:32 · 527 阅读 · 0 评论 -
Codeforces Round #677 (Div. 3) F - Zero Remainder Sum()
题意给定 n∗mn*mn∗m 的矩阵,每一行可以最多可以选 m2\frac{m}{2}2m 个数,可以不选。要求选择的数的和为 kkk 的倍数,求和的最大值。思路范围都是 [1,70][1,70][1,70],很显然的一个dp,可以先对每一行跑一个dp,即dp[j][nn][k]表示前 jjj 个数选了 nnnnnn 个数,和的余数为 kkk 的和最大值。然后对于每一行,即就是一个分组背包,定义 dp2[i][k]dp2[i][k]dp2[i][k] 表示 前 iii 行余数和为 kkk 的和最原创 2020-11-06 17:17:02 · 198 阅读 · 0 评论 -
ZeptoLab Code Rush 2015 F - Pudding Monsters 分治
题意可以转化一下:求区间max-min=R-L的区间个数。对于f(l,r) = f(l,m) + f(m+1,r) + 经过终点的区间 (m=(l+r)>>1)那么对于中间部分怎么求?无非4种情况:1)最值都在左边2)最小值在左边,最大值在右边3)最小值在右边,最大值在左边4)最值都在右边最值都在左边因为 max-min = R- L同时对应的 R = L + max - min对于m–>L,维护一个前缀的maxl,minl。对于m+1–>R,也维护一个前缀的m原创 2020-10-02 22:55:29 · 182 阅读 · 0 评论 -
Educational Codeforces Round 93 (Rated for Div. 2) D. Colored Rectangles
一上来看完题目,这很贪心,马上写了发贪心,wa7!hack样例,当面临选择的数有两个相同,然后选择了某一个,可能后序的操作,得到的值不如选另一个数的价值大。1 2 2100 90 9090 301 2 2 10090 3090 90 所以正解该是dp,记录了每个状态的最优解。很容易想到状态 dp[i][j][z]dp[i][j][z]dp[i][j][z] 表示分别选择了 i,j,zi,j,zi,j,z 个棍子的最大价值。然后转移的话可以从 dp[i−1][j−1][z],dp[原创 2020-08-15 16:53:59 · 161 阅读 · 0 评论 -
Codeforces Round #659 (Div. 2) C、String Transformation 1(思维+set)
思路:在相对应的位置,只要 aaa 串上的字母大于 bbb 串上的字母,那么无解,否则一定有解。要找到最小的步数,其实最大步数也就20吧。我们首先从小的开始选择字母,对于选定的字母,我们可以把它变成什么呢?选择的字母都有其要变成的值,我们让他们都变成要变成字母里的最小的一个,比如:aaa–>cdg,那么选择的字母是 ′a′'a'′a′,把它变成 ′c′'c'′c′ ,然后把其都变成 ′c′'c'′c′。具体实现使用 setsetset 来维护的,每个字母维护一个 setsetset,从小到大原创 2020-07-25 11:13:23 · 1525 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3) 部分题解(D、E、F)
[D. a-Good String](a-Good String)思路:很明显对于 ‘a’ ,有两种选择,在左区间和右区间,那么对于 ‘b’,‘c’,‘d’ 也同理。分析一下 ‘a’。如果’a’ 串 左区间全为 ‘a’ ,把其变为’a’ 的代价为 x ,那么右区间一定是 ‘b’ 串,把右区间变为’b’ 串的代价为 y(这里递归处理),其代价为 x+y。如果’a’ 串 右区间全为 ‘a’ ,把其变为’a’ 的代价为 z ,那么左区间一定是 ‘b’ 串,把左区间变为’b’ 串的代价为 f(这里递归处理原创 2020-07-18 15:18:09 · 431 阅读 · 0 评论 -
D. Berserk And Fireball(模拟)
题意:n个战士排成一排,分别有个武力值ai。你有两种法术,一个是火球(花费x个法力,消灭连续k个战士),一个是激怒(花费y个法力,选择相邻两个战士,武力值大的会消灭武力值小的)。求最后留下的战士排列成bi需要的最小法力花费思路:因为每个数都不同,所以肯定是划分成多个区间,对每个区间进行操作。1)1)1) 如果当前区间的长度 len<klen < klen<k :①区间最大值大于左右端点,那么无解。因为无法消去最大值。②区间最大值小于等于左右端点,消费就是 len∗ylen*yl原创 2020-07-16 15:25:49 · 391 阅读 · 2 评论 -
Educational Codeforces Round 74 (Rated for Div. 2) C. Standard Free2play (DP)
思路:对于2个点中间的所有点,其实都可以看做一个点(因为移动他们无需任何代价)那么我们把所有点的下一个点 x−1x-1x−1(不能为0) 放入集合,对这些点进行dp。定义dp[i]表示到达第 iii 个点都安全的最小代价。那么转移:如果下一个点是已经伸出的点:那么下一个点 dp[i+1] = min(dp[i+1],dp[i]+1) 因为改变这个点必会改变下一个点的状态,要让它保持不变,代价+1.下个点伸出,下下一个点如果是已经伸出的点,那么 dp[i+2] = min(dp[i+2],d原创 2020-07-09 15:33:04 · 211 阅读 · 0 评论 -
Codeforces Round #648 (Div. 2) E、Maximum Subsequence Value
题意:从a数组中选取一个长度为k的子序列,使得该子序列的value值最大。一个子序列的value值为2^i的和,i为二进制形式下的有效位。当且仅当该子序列中不少于k-2个数的二进制在该位下为1时,该位有效。思路:对于选取小于等于3个数,那么这些数每个数的位数都对答案有贡献。当随着k增大,要满足的条件就是k-2个数的相同位置二进制数要相同,所以随着k越大,答案就越小。对于k大于3时,当某位有效时,说明至少有k-2个数的该位为1,这种情况显然更加难以满足。但是若从这个子序列中挑三个数,则根据鸽巢原理必原创 2020-07-08 20:10:55 · 183 阅读 · 0 评论 -
cf
题目大意:有个一开始为空的序列。每次操作会往序列最后加一个 111 到 mmm 的随机整数。当整个序列的 gcd\gcdgcd 为 111 时停止。问这个序列的期望长度对 109+710^9+7109+7 取模的值。令 f[i]f[i]f[i] 表示当前的 gcdgcdgcd 为 iii (第一个位置的数为 iii 开始),到序列所有的 gcdgcdgcd 为 111 的状态的期望步数,初值 f[1]=0f[1] = 0f[1]=0,那么它的转移方程就是:f[i]=1m∗∑j=1m(f[gcd(i,原创 2020-06-27 23:37:13 · 238 阅读 · 0 评论 -
Educational Codeforces Round 88 (Rated for Div. 2) E - Modular Stability
东扯西扯,发现了个性质,就是恰好选的元素里面都是最小数的倍数时,这个肯定成立。原因:因为我们变换取模,最后对最小值取模之后,这个值就固定了,那么随意换顺序取模,能和mod 最小值一样的,这个序列就成立,所以其它数必然是最小值的倍数,对其他数取模的时候就相当于减去x被最小值。code#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 5e5+10;#define IOS i原创 2020-06-10 18:07:31 · 172 阅读 · 0 评论 -
Educational Codeforces Round 88 (Rated for Div. 2) D.Yet Another Yet Another Task
way1(枚举+最大子段和)a[i]a[i]a[i]的范围很小,所以可以从这方面入手,我们可以枚举最大值[0,30][0,30][0,30],然后做一个贪心的最大字段和。可能有一个疑惑,就是我们怎么确定枚举的最大值一定在这个区间呢if(a[i]>v||sum<0)sum = 0;这句a[i]>va[i]>va[i]>v就可以决定这个最大值在这个区间,虽然可能对于当前最大值v,大于这一段的元素(不存在这些元素里),但是最终答案肯定是取的存在的。因为 ans = max(原创 2020-06-10 15:54:30 · 183 阅读 · 0 评论 -
Codeforces Round #645 (Div. 2)D.The Best Vacation(贪心)
思路:考虑某个区间,对于这个区间左右2端点,如果左端点的值大于右端点值,那么我们把整个窗口往左移肯定会使答案增加,反之如果左端点的值小于右端点值,那么我们把整个窗口往右移肯定会使答案增加,知道左右端点相等,这样可以得到,我们结束的点一定是在某个月月末,然后我们就枚举每个月,处理一下前缀,用二分找一下。#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 4e5+10;#def原创 2020-05-27 23:39:35 · 183 阅读 · 0 评论 -
Codeforces Round #641 (Div. 2) E. Orac and Game of Life
对于某个点,只要它开始变化了,那么之后就一定呈周期性变化,所以我们只需要算出没个位置在第几次迭代开始第一次变化就好了,先把一个连通块元素个数大于2的全部放进去,然后在进行bfs搜出每个位置的dis,表示 到达这里需要最少需要多少次迭代。#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 1e3+10;#define IOS ios::sync_with_stdio(0)#d原创 2020-05-20 11:47:20 · 163 阅读 · 0 评论 -
Codeforces Round #643 (Div. 2) C. Count Triangles-- 差分、前缀和
题意给你 A,B,C,DA , B , C , DA,B,C,D问有多少种方法构造出三角形(X,Y,Z)(X , Y , Z)(X,Y,Z)使得 1≤A≤X≤B≤Y≤C≤Z≤D<=1051≤A ≤ X ≤ B ≤ Y ≤ C ≤ Z ≤ D <= 10^51≤A≤X≤B≤Y≤C≤Z≤D<=105思路组成三角形的条件是2边之和大于第三边,这里因为X≤Y≤ZX≤Y≤ZX≤Y≤Z所以只需要x+y>zx+y>zx+y>z,所以我们只要知道了x+yx+yx+y的值之后,原创 2020-05-19 00:18:39 · 270 阅读 · 0 评论 -
Codeforces Round #641 (Div. 2) Orac and Models最长上升子序列的变形
这题在最长上升子序列的基础上加上了一个限制条件,就是这个上升子序列的原数组下标当前能被前一个整除。思想还是 dp[i] 表示以 i 结尾的满足条件的最长上升子序列,普通的lst,dp[i]需要从1~ i - 1来得到更新,也可以理解成用1 ~i - 1的dp值来更新dp[i],那么对于这里,只需要枚举满足条件的下标去更新dp[i],即 i 这个下标的因子下标,用埃氏筛的思想。#pragma GCC optimize(2)#include<bits/stdc++.h>using names原创 2020-05-14 16:39:08 · 815 阅读 · 0 评论 -
Educational Codeforces Round 86 E. Placing Rooks
首先要满足所有格子都能被攻击,棋子的放置一定是①每一行都有或者每一列都有。(1)当k=0k=0k=0的时候,同时上面222个,答案就是n!n!n!,因为对于第一行有nnn个位置可放,第二行有n−1n-1n−1个位置号可放…答案就是n!n!n!(2)当k>=n的时候,答案肯定是0,因为kkk最多放置的情况就是全部放一列或者一行。(3)我们先只看把棋子放到每一行,对于列操作类似。因为要满...原创 2020-05-02 15:59:52 · 202 阅读 · 0 评论 -
Codeforces 1342 D - Multiple Testcases 贪心
题意题意是真难懂,就是给你n,k(<=2∗105)n,k(<=2*10^5)n,k(<=2∗105),第二行n个数,每个数<=k<=k<=k。然后我们要把n个数分成ans组,每组有一个限制条件,就是k个数,c[i]c[i]c[i]表示每组大于等于iii的个数要小于等于c[i]个。c1>=c2>=c3>=...>=ckc_1>=...原创 2020-04-28 23:37:46 · 220 阅读 · 0 评论 -
cf #634 (Div. 3) E2 - Three Blocks Palindrome (hard version)
思路:因为每个数比较小,可以从这里切入,开始想的是枚举中间那部分,但是中间固定了2边不好确定,因为2边要一样,所以我们可以固定2边,然后对于中间位置,只需找出出现次数最多的数,前缀和预处理一下。枚举第i个数,前面num个数,然后二分查找后面num个数的位置。code#pragma GCC optimize(2)#include<bits/stdc++.h>using name...原创 2020-04-15 22:31:49 · 199 阅读 · 0 评论 -
F - Kate and imperfection
题意在1~n的n个数中,对于k∈[2,n],在n个数中取k个数,对这k个数两两进行gcd,输出这个gcd最大的最小值思路首先觉得这题放到F题,感觉高估了难度最小肯定是1,那么只有全部互质才能满足,所以找出所有的质数(因为只有这些才可能完全两两互质),假设n以为的质数s个,那么大小s以内的都是1,然后对于后面的数,随便找一个数,肯定会与以存在的数gcd>1,(唯一分解定理),所以我们只...原创 2020-04-15 15:16:13 · 180 阅读 · 0 评论 -
codeforces 1330D: Dreamoon Likes Sequences(组合数学+规律)
题意给一个d,m,让你构造一个数组a大小为n,n不定,a满足严格递增,且元素范围[1,n]并且a的前缀异或也要严格递增。思路首先看二进制每一位上,因为是异或,所以如果a[i]的二进制第j位有1,那么a[i+1]必须如果最高位1是第j位是肯定不行的。即:(1)(2,3)(4,5,6,7)(8,9,10,11,12,13,14,15)(1) (2,3) (4,5,6,7) (8,9,10...原创 2020-04-07 20:00:38 · 262 阅读 · 0 评论 -
Codeforces Round #630 (Div. 2) D Walk on Matrix
题意给你一个kkk,让你构造一个矩阵n∗m,(n,m<=500)n*m,(n,m<=500)n∗m,(n,m<=500),方式一dp[i][j]=max(dp[i−1][j]dp[i][j] = max(dp[i-1][j]dp[i][j]=max(dp[i−1][j] & dp[i][j],dp[i][j−1]dp[i][j], dp[i][j-1]dp[i][j]...原创 2020-04-03 16:16:13 · 161 阅读 · 0 评论 -
Codeforces Global Round 7 D2:Prefix-Suffix Palindrome (Hard version)
题意给一个长度不超过1e6的字符串s,找一个回文串,回文串要求的条件是必须由a+b组成a为s的前缀,b为s的后缀。(a,b都可以为空)思路首先可以把首尾相同的去掉,那么剩下中间一段,只需要找中间最长回文串,回文串开头为首位或者结束为末尾。可以用马拉车来处理,然后对其选取的进行标记code#pragma GCC optimize(2)#include<bits/stdc++.h&...原创 2020-03-20 15:23:44 · 345 阅读 · 0 评论 -
Codeforces Round #625 D. Navigation System
题意给定一个有向图,n个点,m条边(2≤n≤m≤2⋅1052≤n≤m≤2⋅10^52≤n≤m≤2⋅105)然后k个点,表示沿路经过的点。然后每次会导航到最后一个点的最短路,如果最短路改变,那么重整次数加1,要求最小次数和最多次数。思路为什么会有最大,最小,肯定是当前到终点的最短路有多条,然后每次导航的不是当前要走的那条路,就产生了最大、最小值。每次我们都要得到一个到终点的最短路,很明显...原创 2020-03-03 20:21:17 · 346 阅读 · 0 评论 -
Codeforces Round #622 Skyscrapers (hard version)
题意:给你nnn个数mim_imi,要求找一个序列aia_iai满足ai<=mia_i<=m_iai<=mi并且aia_iai左右不能同时有aj>ai(j!=i)a_j>a_i(j!=i)aj>ai(j!=i)求这个序列和最大的情况。思路:首先aia_iai左右不能同时有aj>ai(j!=i)a_j>a_i(j!=i)aj&...原创 2020-02-25 17:42:06 · 394 阅读 · 0 评论 -
Codeforces Round #620 (Div. 2)
A Two RabbitsB. Longest PalindromeC. Air ConditionerD. Shortest and Longest LISE. 1-Trees and QueriesF2 Animal Observation原创 2020-02-22 18:17:01 · 120 阅读 · 0 评论 -
cf1304 E. 1-Trees and Queries
题意:先给你一棵树,然后q次询问,每次询问加上一条边,x<–>y的一条边,然后问a,b之间的边数是否为k,一些边可以重复走。每次询问独立,就是加了之后的这条边询问结束就删除了。思路:我们没加x<–>y这条边是,a到b就一条路径(树),然后加了一条边,无非就多了2种可能a到x ,x到y,y到ba到y,y到x,x到b就这三种可能,然后只要他们的边数小于等于k并且奇...原创 2020-02-22 13:34:49 · 232 阅读 · 0 评论 -
cf1304 D. Shortest and Longest LIS
题意:t组数据,每组一个n,一个n-1长度的字符串,只有 < > ,第i个的<是第i个数<第i+1个数,要求用1~n的数构造出两个序列,且其中一个lis最小,另一个lis最大。思路:如果只要求构造出来就很简单,直接建图,跑一边拓扑就行了,但这里要让lis最大和最小。所以要用一个贪心的思想来。求最小,肯定尽可能的让他们不能形成上升,但是 < < <...原创 2020-02-22 13:29:12 · 186 阅读 · 0 评论 -
cf1304 C. Air Conditioner
题意:给定n个区间和一个起始点温度m,然后从0分钟开始,温度每一分钟可以+1,-1,+0,接下来有n个三元组,s,l,r,表示目前s分钟,要求温度范围在l,r,问是否能满足在每个区间温度都满足思路:我们只需要维护一个最大温度ma,最小温度mi就ok了。然后每次只要当前区间mi > r || ma < l就不满足,细节看代码吧。code#pragma GCC optimiz...原创 2020-02-22 13:14:46 · 283 阅读 · 0 评论 -
cf1304 B. Longest Palindrome
题意:给定n个字符串,每个都m的长度,问是否能把这些字符串拼接起来,拼接顺序任意,形成一个回文串,要求最长。并且每个字符串都不一样思路:首先本身就是回文串的肯定是中间,然后如果拼接是回文串的分别放2边就ok了code#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int m...原创 2020-02-22 13:08:22 · 262 阅读 · 0 评论 -
cf1304 A Two Rabbits
题意给4个数,x,y,a,b,问x + at 是否等于y - bt等于就输入t,否则输出-1#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 2e5+10;#define IOS ios::sync_with_stdio(0)template <typ...原创 2020-02-22 13:04:54 · 234 阅读 · 0 评论 -
cf613 E Delete a Segment
题意有(n<=1e5)(n<=1e5)(n<=1e5)个区间,要求删掉一个区间,使剩下的区间不覆盖的个数。思路2中做法线段树首先给出的区间是乱序的,对其排个序,然后我们可以一次枚举删掉这个区间,然后求剩下的区间所剩的个数。可以用线段树来进行更新查询,可以类似求区间连续01个数那种方式,但我们由于这里是区间,所以把点化为区间,把区间扩大2倍[2l,2r],然后多加入这个[...原创 2020-02-20 14:13:04 · 207 阅读 · 1 评论 -
cf1284 Hello 2020 D. New Year and Conference
传送门题意有n对时间区间,分别表示在a场地和b场地的时间区间,然后现在要求你找这些所有的子集在a场地没有冲突,且对应的b场地也没有冲突,或者在a场地有冲突,且对应的b场地也有冲突。满足这些就输出yes,否则no思路首先我们可以转换一下,找no的情况,就是找所有子集在a有交集,b没有交集(a没有交集,b有交集)所有子集可以转化为任意2个区间是否有交集,因为3、4…都可以有2个组成,只需判是...原创 2020-02-15 15:29:39 · 233 阅读 · 0 评论 -
cf613 Dr. Evil Underscores 01字典树
传送门题意n个数,找一个数x使得x与每个数的异或的最大值最小。n<=1e5,0=<ai<=230−1n<=1e5,0=<a_i<=2^{30}-1n<=1e5,0=<ai<=230−1思路首先每个数全写成二进制的形式,我们可以发现,当第i位上全都相同(同1同0),这一位对最终的max可以没有贡献,让x的这一位与其一样就抵消了,但是如...原创 2020-02-15 14:43:19 · 162 阅读 · 0 评论 -
Codeforces Round #200 (Div. 1)D Water Tree
传送门题意给你n(n<=5e5)n(n<=5e5)n(n<=5e5)个节点的树。m(m<=5e5)m(m<=5e5)m(m<=5e5)个操作1 v 把v和儿子全部置为12 v 把root到v之间全部置为03 v 查询v思路树上的区间操作,很明显的一个树链刨分+线段树维护线段树的flag数组表示置为0或者1.区间修改+单点查询代码#pra...原创 2019-12-12 15:41:47 · 129 阅读 · 0 评论 -
Codeforces Round #597 (Div. 2)
A. Good ol’ Numbers Coloring判断2个数是否互质就行了AC代码#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 2e5+10;#define IOS ios::sync_with_stdio(0)template<typena...原创 2019-11-02 14:27:50 · 264 阅读 · 0 评论