- 博客(210)
- 收藏
- 关注
原创 2021 icpc上海(E,D,G,I,H)
文章目录[E. Strange Integers](https://codeforces.com/gym/103446/problem/E)[D. Strange Fractions](https://codeforces.com/gym/103446/problem/D)[G. Edge Groups](https://codeforces.com/gym/103446/problem/G)[I. Steadily Growing Steam](https://codeforces.com/gym/103
2024-11-08 16:21:49
883
原创 2022 icpc杭州(F,D,A,C,K)
比如枚举到某一个点x时,它的父亲节点的其它子节点和它有公共前缀,直到当前才不一样,并且顺序早于它,所以我们可以提前记录cnt[pre] [x]的个数,也就是pre在前,x在后,它们不一样,它们的前面是公共前缀,由于只有26个字母,所以cnt[30] [30]就够了。然而,在 q 个不同的平行宇宙中,字母表中的字符并不是按照原来的顺序出现的。注意,这样只能比较有公共前缀,且当前字符不同的情况,但是可能出现abc,ab这一情况,是记录不了的,所以每个字符串后面加一个比26个字母都都小的’a’-1。
2024-11-08 10:53:49
1158
原创 2023 ccpc桂林(G,M,K,B,I)
当然我们枚举mex的时候不能枚举[1,m+1],因为m的总和是不限制的,而n的总和是有限制的,我们枚举a去重后的所有值,然后我们来算一下询问区间一共有多少,如枚举mex=1,有3个位置,那么区间个数就是3+1=4,然后由于每个数所在的位置是不同的,所以我们实际上枚举的所有位置都是不重复的,故询问区间个数是O(n)的。那么,对于r=5的所有的询问来说,第一个位置上的1完全没有意义,因为r已经在第五个1的右边,对于任何查询的[L,5]区间来说,如果第一个1被算了,那么他完全可以用第五个1来替代。
2024-11-07 20:18:13
717
原创 2023 icpc杭州(M,J,D,G,H)
an,有 n 个事件,每个事件形如:如果 ai<bi,则 ai = ai +wi,事件随机顺序发生,问每个数的期望。一棵树,可能是链或者菊花,每次询问一条边存在性,确定是链还是菊 花。由于中间全部乘起来,如果存在大于2的数,那么最后会非常非常大,不可控,所以构造若干个1相乘。构造题,往往用最特殊,最简单的,自己构造,肯定简单化而不是复杂化。由于所有数都不能为0,所以特判一下n为3的情况,直接抄样例。所以x * y = -x-(n-2) * 2+2 * y。令y=1,则x=-x-2 * n + 4 +2。
2024-11-05 22:32:58
1027
原创 2020 icpc南京(K,L,E,F,H,M)
文章目录[K. K Co-prime Permutation](https://codeforces.com/gym/102992/problem/K)[L. Let's Play Curling](https://codeforces.com/gym/102992/problem/L)[E. Evil Coordinate](https://codeforces.com/gym/102992/problem/E)F.Fireworks[H. Harmonious Rectangle](https://co
2024-11-05 20:28:41
808
原创 2021 icpc南京(A,M,C,H,J,D)
文章目录[A.Oops, It’s Yesterday Twice More](https://codeforces.com/gym/103470/problem/A)[M. Windblume Festival](https://codeforces.com/gym/103470/problem/M)[C. Klee in Solitary Confinement](https://codeforces.com/gym/103470/problem/C)[H. Crystalfly](https://co
2024-11-02 16:39:12
915
原创 2022 icpc南京(I,G,A,D,M,B)
给定一个长度为n的整数序列a1,a2,··· ,an,同时给定另外 四个整数k,m,c与d,可以进行以下操作至多一次:选择 一个长度恰为m的连续子数组,并将一个长度为m,首项 为c,公差为d的等差序列加到该连续子数组上。我们反过来,上面是对每一个区间,这里我们就对每一个数,看有哪些区间(左端点代表一个区间)可以让该数从小于x变成大于等于x,将这些区间(左端点代表一个区间 )加1,这样就统计出对每个区间操作有几个数从小于x变成大于等于x了。由于对于一个数来说,合法的区间肯定是连续的,显然差分。
2024-10-28 19:02:36
714
原创 2023 icpc南京(I,C,F,G,L,A)
有n个操作和m个变量,初始值均为0。你可以优先选择k件物品获得他们的价值,随后再选择一些 物品,要求随后选择的物品的体积之和不超过W。但却不是本题的答案,因为本题要求“编号小的尽量靠前”,编号2还可以提前的:1 4 2 3,才是正确的序列。看上图,我们从1开始走,邻接点3和4,我们不知道后面还有个2,所以不知道3和4先选谁,故正向寻找是错的。方法:拓扑排序,同时用优先队列(小顶堆),这样就能保证,拓扑序列不唯一时,编号小的优先,即字典序最小。我们反向走,从最后面往前走,优先走编号大的,也就是字典序最大。
2024-10-24 18:18:23
1025
原创 2023 icpc济南(D,I,A,G,K)
c,其中[1,n]和[n+1,2 * n]各占一半,比如说1,2+n,3在同一个连通块里,那么1+n,2,3+n一定在另一个连通块里,因为对于1,要么选,要么不选,选即为1,不选即为1+n,这两个独占2。对于某个连通块,要么选择染1的所有,要么选择染2的所有,因为,一条边的两个点必须二选一,如果选择了某个1,那么顺着跑一遍,2不能选,1必须选,2不能选,1必须选…两两冲突,一条边连两个点,两个点只能选一个,而且是必须二选一,二分图染色,一条边的两个点,其中一个点染1,另一个点染2。
2024-10-23 14:40:07
886
原创 Codeforces Round 978 (Div. 2) C. Gerrymandering
保证格数是3的倍数,当i%3==0时,dp[i] [0]的格数是3的倍数,而dp[i] [1]和dp[i] [2]的格数不是3的倍数,也就是说dp[i] [1]和dp[i] [2]不需要去管,因为它不可能会用来转移。然后,我们要保证 dp[i] [j]的总格数是3的倍数,不然的话,当后面用到前面某个dp状态,如果都不能完全划分,根本就转移不了。当i%3==1时,dp[i] [1]和dp[i] [2]的格数是3的倍数,画个图,进行转移即可。首先,怎么问,怎么设,设为赢得的最大地区数。
2024-10-15 22:43:33
503
原创 Codeforces Round 974 (Div. 3) D. Robert Hood and Mrs Hood
实际上,每个区间的长度均是d,所以,区间的起点就能代表整个区间,我们将它看作一个整体,那么工作[l,r]对哪些区间会作出贡献呢?[l-d+1,r],所以我们对[d-l+1,r]均+1,利用差分就可以轻松解决了。一开始想的是将[l,r]均+1,但是这样会出现问题,就是比如统计[i,i+d-1]时,如果将其均加起来,那么有可能i中有一个1是工作x加的,j中有一个1也是工作x加的,这样就重复了。
2024-10-14 17:17:20
218
原创 Codeforces Round 971 (Div. 4) G1. Yunli‘s Subarray Queries (easy version)
一开始想自定义优先队列,优先个数最大的放在队头,但是试验了好多次,包括之前有道题目也试验过,发现不可行,如果想要自定义优先队列的话,那么自定义比较的信息必须是不变的,一旦变动,输出的信息奇奇怪怪,摸不着规律,比如说自定义出现次数大的优先。那么cnt[a]和cnt[b]的值必须始终不变,这是通过多次试错发现的。
2024-09-18 14:11:03
515
原创 Codeforces Round 972 (Div. 2) C. Lazy Narek
按照以往背包的经验,选与不选,先写上第一维dp[i]表示在前i个中选择,结果则是和问题相对应,为scoren−scorec 的最大可能值,其中如果遇到顺序的narek,加5分,否则如果n,a,r,e,k不在narek中,则减1分,简化为,遇到n,a,r,e,k减1分,遇到顺序的narek加10分,那么dp[i]则表示分数的最大值。除了启动源之外,如果是求最大,那么全初始化为很大的正数,如果是求最小,那么全初始化为很小的负数。初始化最后的时候再写,根据我们的循环第一次需要什么状态,作为一个启动源。
2024-09-18 12:24:29
591
原创 Educational Codeforces Round 167 (Rated for Div. 2)
check:记录均为1的数量,以及均为-1的数量,均为0的不用管,没有1的不用管,只有一个1的就只选1。首先a肯定是要的且是完整连续的,然后其它的只能在a的前面插入或者在b的后面插入。暴力枚举b的子段,然后判断是否为a的子序列,记录最长长度maxn。所以只要求出b的最长连续子段为a中子序列的长度,然后前后再插入。如果y小于等于0,则只要y小于等于-1则YES。答案即为len(b)-maxn+len(a)如果可以做到两部电影均大于等于x,则true。所以只要y大于等于-1则YES,否则NO。
2024-06-28 13:00:27
562
2
原创 算法分析与设计复习
4.活动选择问题(同最大不相交区间数量)5.最近点对问题 O(nlogn)6.哈夫曼编码(同合并果子)分治的计算题就画树,再回溯。3.调度问题(同排队打水)5.最佳邮局设置问题。
2024-05-23 13:30:36
575
1
原创 Codeforces Round 942 (Div. 2)
枚举b,然后a+b最大为n+b,所以a+b要满足是b方的倍数,直接通过整除来确定个数,最后多了0 1的情况,减去。如果可以列出所有情况,那就不是问题,耐心慢慢列出所有情况。暴力枚举a,然后枚举a的因数,这样达到2e9了,会超时。check x,如果不足x,则补为x,看k是否够。操作:取走一枚正面的硬币,翻转相邻的两个硬币。当U个数为奇数时,Alice赢,否则Bob赢。然后结果就是x+(n-1)*(x-1)使得n个数的最小值尽量大。再加上还有大于x的个数。假设最终的最小值是x。即a+b是b方的倍数。
2024-05-01 21:58:04
384
1
原创 Codeforces Round 941 (Div. 2)
但是如果先手遇到前后差值为1的,那么先手会处于被动,先手就不能有效控制后手了,所以先手可以选择拿光,变成后手,下一步又变成先手,也可以现在控制局势 ,下一步变成后手 ,所以仍可以控制局势,所以谁最先开始控制局势谁赢,或者都控制不了局势,那么直接模拟最终结果。题意:对于一个子矩阵, 如果两个角颜色相同,那么可以将整个矩阵颜色变得和 两个角一样,问能否使得整个矩阵颜色相同。先看左上角和右下角,如果不一样 ,就看右下角那一列和那一行上是否都有左上角,同理 ,看左上角。其实,只要让整个矩阵的两个角颜色相同即可。
2024-04-28 10:45:45
633
原创 Codeforces Round 939 (Div. 2)
a[k]这些位置的数(如果该位置有数的话),问最终剩下几个数,共有q次询问,每次询问都是独立的,每次询问初始个数n不同,但是要删除的位置a[1]~a[k]都是不变的)->这是一个样例,一共有t个样例。既然双方都是最优策略,那么肯定会避免对方在我方这里得分,而且双方的棋子在某种意义上可以说是对称的,所以要想得分,只能得到自己拥有两个的数字的分数。一开始用vector的erase删除数,一次要删好几个位置,删除迭代器的话,删除一个之后所有位置都变化了,会出大问题。
2024-04-14 12:05:57
917
6
原创 Educational Codeforces Round 164 (Rated for Div. 2)
当和第一个数不相等时,它的后一个数必须和第一个数相等,否则无需操作,本身就不是beauty。原本根据样例大概就能猜出做法,就是让x的某一个高位大,然后后面均让x的位不大于y的位。无奈,比赛时的那种写法如果不加特判就不会判两个数相等的情况,于是就wa在了这种情况。如果要将所有颜色变成一样的,那么最优肯定是数量最多的颜色不变,其它都变得和它一样。证明:x+y=定值,要使得x * y大,那么x和y尽可能接近。那么就尽量使得数量最多的颜色数量最少,肯定是平均分。否则就删去连续的和第一个数相等的一段就行。
2024-04-14 12:05:23
588
原创 第十四届蓝桥杯c++b组
这里我们删除一个元素时,需要将它左右两边的元素都加上它的值,但是我们无法在优先队列随意修改元素,所以这里有一个技巧,先记录下来下标为x的元素更新后的值,先不急着更新优先队列,类似于线段树的懒标记,等到用到了才更新优先队列,当队头的值是最新的值的时候,那么说明更新过了,那么执行删除操作,否则,需要在优先队列中更新它的值。将字符为c1的位置都存储下来,然后枚举到字符为c2时,二分到最大的满足以c2结尾,c1开头的长度大于等于k的位置,然后该位置以及前面的c1都满足,作为对答案的贡献。
2024-04-12 15:49:21
874
原创 Codeforces Round 938 (Div. 3)
首先对连续一段区间进行操作01反转(相当于和1异或),要保证将所有元素都变为1,那么常用的方法就是从头到尾如果为0的话就进行操作,将其一个一个变为为1,这样能保证全变为1,而且如果为0的话,操作区间是必须要包含到的,不然的话就不能将那个0变为1。然后删掉2个1,序列异或和仍为0,则2个1提供了一次贡献,同理,删掉2个2,提供一次贡献,再删掉2个2,提供一次贡献,以此类推。那么一开始的序列异或为即为0,贡献在于1个3,一个5,一个7,然后将这三个数删掉,则为2个1,4个2,6个3,4个4。
2024-04-09 12:20:01
953
2
原创 Codeforces Global Round 25
然后加上票价增长这一条件,我们之后所选择的单价都会增加,比如说前面买了x张,那么后面买的单价增加x,发现实际上增加的票价和原先买票的价钱是独立的,只不过每次增加了当前票买的张数*前面买的票的总张数,发现式子中只有张数,并没有票价,所以和买的票的顺序无关,只和每次买的张数有关,所以优先买票价低的,然而我们肯定每次尽可能买的多,因为前面票价低,这是直观上的感觉。
2024-04-07 21:47:28
650
原创 上海理工大学第二届“联想杯”全国程序设计邀请赛
说到全排列,我们也可以让一个数组不动,让另一个数组进行全排列,进行两两匹配。说实话有点坑,题目意思不明,必须是整个字符串作为一个完整的碎片才行。一开始没想明白,但实际上暴力不可行的话,就需要一边遍历一边求了。数据超级小,直接暴力,dfs,枚举所有的匹配情况。每遍历一个数 ,求以当前数结尾的等差为k的等差数列长度。
2024-04-06 17:09:46
246
原创 牛客小白月赛90
用优先队列,将物品一个一个放进去,维护队列元素个数为k,在中途记录最小值即可。m的数据很小,可暴力,直接二进制枚举选与不选,再用差分进行区间操作。
2024-04-06 13:28:00
330
原创 牛客练习赛123
如果剩余数中不存在绝对众数,那么对于偶数个元素,肯定可以全部两两抵消,那么最终剩下当前数 ,对于奇数个元素,偶数个两两抵消,剩下一个和当前数去抵消 ,如果当前数大于1,那么可保留。如果剩余的数中存在绝对众数,那么剩余的去抵消,最终为绝对众数减去其它数之和,如果最终剩下的小于当前数,那么当前数可保留。当前数先不算,然后其它数去抵消,如果最后剩下的数小于当前的数则可以保留当前数。然后这道题题意每次去两个不同的数相消,就是摩尔投票的过程。等价地说,绝对众数的出现次数大于总元素数的。还多,那么就称它为这个集合的。
2024-04-05 21:48:35
415
原创 2023年第三届 “联想杯”全国高校程序设计在线邀请赛暨第五届上海理工大学程序设计竞赛(同步赛)
容易想到将所有物品按照价值从小到大排序,然后枚举每件物品作为中位数,在它的前面取k/2件体积最小的,在它的后面取k/2件体积最小的,check是否总体积超过m,如果不超过,那么作为预选答案,取最大的答案。1.不是很好写,要想从vector里删除数,挺麻烦的,还要考虑越界,可以先标记要删除的数,比如值标记为-1,然后将不是-1的都放到一个新的容器里,就相当于删除了标记的数。如果sum%3=2,那么优先删除一个对3取模余2的数,如果没有则删除两个对3取模余1的数。只有赢和输两种情况,要么赢要么输,没有平局。
2024-04-03 11:04:37
1246
原创 CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!)
int n,x,y;vectorres;i>d;int ans=x;i
2024-03-31 16:25:50
864
原创 Codeforces Round 936 (Div. 2)
2.之前做过几道树的题目是不需要dfs的,只用分析度数,于是往这个方向想了很久,方向偏了,具体判断是否需要dfs的方法:如果树的具体形态不同,答案千差万别,那么肯定要dfs。对于二分出的连通块大小最小的最大值,dfs一遍,统计满足答案的情况下最多能分成多少个连通块,如果个数大于等于k+1,那么合法,取一堆合法中最大的那个。3.对于dfs的熟练度不够,特别是对于归(递归的归)的理解,一般是求子树的大小,子树的权值和,子树的异或和。A,B的思路都是很快就有的,没有什么卡顿,20分钟就出了,完全没有问题。
2024-03-23 14:49:52
676
原创 codeforces 1600分
文章目录1.[G. Special Permutation](https://codeforces.com/problemset/problem/1352/G)2.[D. Constructing the Array](https://codeforces.com/problemset/problem/1353/D)3.[C2. k-LCM (hard version)](https://codeforces.com/problemset/problem/1497/C2)4.[C. Circle of Mo
2024-03-20 22:56:25
1059
原创 Codeforces Round 934 (Div. 2)
脑子没转过来,就差转一个弯,如果一个数有多个的话,那么Bob肯定删不完,那么Bob战略性放弃,但是Alice知道Bob会放弃,所以她也不急着放有多个的数,所以Bob只能删掉个数为1的次小的数。如果一个数有多个的话,那么这个数字Alice肯定能放到c中,所以Bob战略性放弃,选择删掉后面的元素,找到第一个他可以让Alice得不到的元素,删掉它,然后就可以得到结果了。在a[1]到a[n]中取2*k个元素,在a[n+1]到a[2*n]中取2*k个元素,使得两者异或和相等。
2024-03-17 12:51:41
578
原创 Educational Codeforces Round 163 (Rated for Div. 2)
记录第一行连续左箭头的区间以及第二行连续左箭头的区间,然后两行相对应的区间不能有交集(直接从小到大枚举所有区间,因为自身区间不可能有交集,所以不用分一二行),如果有,则NO。题目读错了,做了一个小时,做了个假题,以为是可以顺着箭头一直走,然后就认定是低配版的关鸡(2024牛客寒假训练营1的B题),但实际上只能顺着箭头走一格。枚举长度len,然后check该长度是否合法(s[i]去和s[i+len]匹配,如果可以匹配就计数++,否则计数清0,看能否达到len),取最大的长度。问能否到达(2,n)
2024-03-16 13:03:11
597
原创 codeforces 1700分
文章目录1.[D. Solve The Maze](https://codeforces.com/problemset/problem/1365/D)2.[D. Another Problem About Dividing Numbers](https://codeforces.com/contest/1538/problem/D)3.[A2. Prefix Flip (Hard Version)](https://codeforces.com/contest/1381/problem/A2)4.[C. A
2024-03-13 22:20:21
1142
原创 牛客练习赛122
其它情况,整个棋盘均可以走遍,答案为n*m。然后,对于相同的ai,对应的bi必须相同。发现x和y均小于等于2时,答案为1。当其中一个为2时,答案为2。当x和y均为3时,答案为8。数据非常之大,猜测找规律。满足则YES,否则NO。bi必须在[1,n]
2024-03-08 21:17:58
321
原创 牛客小白月赛86
对于每个点,作为右端点,二分它的左端点至少到哪里,记为l,然后在此基础上,求dp[l-1],表示以[l-1]为右端点,区间和最大是多少,如果dp[l-1]大于0,那么加上。dfs一遍,把一个连通块的每个点的下标记录,行最小是多少,行最大是多少,列最小是多少 ,列最大是多少,然后检查整个矩形里是不是都是点。吃掉一段连续的蛋糕,使得饱腹度之和大于等于W,然后问最大可口值之和是多少。wi表示第i个蛋糕的饱腹度,di表示第i个蛋糕的可口值。段:分成连续的k段,每段元素种类只有一种,k要求最小。
2024-03-03 22:47:38
354
原创 Codeforces Round 931 (Div. 2)
通过问对角线的左下角,得到对角线上的那个地雷的可能位置,如果通过右上角得到的是假位置,那么通过左下角得到的一定是真位置,因为如果第二个地雷距右上角比第一个地雷距右上角近的话,那么第一个地雷距左下角绝对比第二个地雷距左下角近。综上,问(1,1),问得到的对角线的左上角和右下角,以此确定出的两个可能位置,两个位置中一定有一个是对的,所以只要问其中一个位置就行,最多问4次。这题一开始想用贪心,发现不可行,又想用完全背包,又不可行,那么将两者结合 ,阙值以上贪心,,阙值以下完全背包。目标确定其中一个地雷的位置。
2024-03-03 00:00:41
406
原创 2024牛客寒假算法基础集训营6
其他情况下可以进行贪心,将所有的节点赋值为1,然后根据红色节点的子节点权值和来修改该红色节点和它的任意一个白色节点。然后优先选大的(利用二分),然后选小的,选三个数,并减去,如果最后剩下的数大于0,那么无解。如果一个红点的儿子全是红点,那它必须也是3的倍数,不可能,这样是无解的,因为只能赋值1和2。利用二分,先将b升序,枚举a中的每一个数,在b中二分出离a最近的数,然后找到差值最小的。如果相乘不能为正,那么特判有没有0,如果有0,答案为0。求出数组a连续子段为正的最大,为负的最小,同理,对b。
2024-02-24 22:07:47
1286
原创 2024牛客寒假算法基础集训营5
有若干种物品,每种物品体积为bi,代价为ai,每种物品可以用无限次,问装满体积为n-1的背包最少代价是多少(这里一定可以刚好装满,因为可以花费p代价通知1个人,一定可以1个1个将剩余的补满)枚举第一行 ,然后看它左下,正下方,右下方,如果有相同的数字,那么只有一次就行,可以斜着断开或竖着断开,当然第一列和最后一列不能看正下方,因为并不能将连通块分成两块。如果n为奇数,从后往前,把第n-1个数变大 ,大到不能再大,不超过第n个数,同理,让第n-2个数,变大。贪心,从前往后枚举,能插入0就插入0。
2024-02-24 16:21:52
488
原创 think-cell Round 1
i了),如果我们操作第一个元素,那么变成5,4,3,1但是我们肯定想要5,4,3,2,可以先操作第4个元素,再操作第一个元素,就可以得到了,然和对原序列换一下顺序 ,变成4 2 5 5,可以先操作第四个元素,再操作第二个元素,再操作第一个元素,这样也可以得到5,4,3,2,如果是multiset的话,我们就直接全部放进去就可以了,但是set会去重,所以对于相同的,就算减小也不要让它被去重了。所以不管怎样,答案就是先降序,然后依次枚举,如果前面有的话,那么当前就减1。构造一个全排列,使得对于任何。
2024-02-22 12:18:02
833
原创 2024牛客寒假算法基础集训营4
对于每个星号(x,y),以它为顶点,往左下方(x+1,y-1)和右下方(x+1,y+1)拓展,如果两个都为星号(分别记为l,r),说明有机会可以拓展下去,然后看预先记录的区间有没有包含此区间,如果包含了,说明[l,r]全是星号,那么产生一个等腰三角形。一堆石子x可以分成1和x-1,那么就枚举每堆石子,可操作次数为ai-1,总操作次数如果为奇数,那么gui赢,否则sweet赢。动态前缀和,一边遍历,一边看前面是否出现过sum,如果出现,说明以当前为右端点,有一个数组和为k的倍数,那么就断开,成为一组。
2024-02-19 18:00:41
767
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人