自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(194)
  • 收藏
  • 关注

原创 Codeforces Round 941 (Div. 2)

但是如果先手遇到前后差值为1的,那么先手会处于被动,先手就不能有效控制后手了,所以先手可以选择拿光,变成后手,下一步又变成先手,也可以现在控制局势 ,下一步变成后手 ,所以仍可以控制局势,所以谁最先开始控制局势谁赢,或者都控制不了局势,那么直接模拟最终结果。题意:对于一个子矩阵, 如果两个角颜色相同,那么可以将整个矩阵颜色变得和 两个角一样,问能否使得整个矩阵颜色相同。先看左上角和右下角,如果不一样 ,就看右下角那一列和那一行上是否都有左上角,同理 ,看左上角。其实,只要让整个矩阵的两个角颜色相同即可。

2024-04-28 10:45:45 189

原创 Codeforces Round 939 (Div. 2)

a[k]这些位置的数(如果该位置有数的话),问最终剩下几个数,共有q次询问,每次询问都是独立的,每次询问初始个数n不同,但是要删除的位置a[1]~a[k]都是不变的)->这是一个样例,一共有t个样例。既然双方都是最优策略,那么肯定会避免对方在我方这里得分,而且双方的棋子在某种意义上可以说是对称的,所以要想得分,只能得到自己拥有两个的数字的分数。一开始用vector的erase删除数,一次要删好几个位置,删除迭代器的话,删除一个之后所有位置都变化了,会出大问题。

2024-04-14 12:05:57 607 4

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

原创 第十四届蓝桥杯c++b组

这里我们删除一个元素时,需要将它左右两边的元素都加上它的值,但是我们无法在优先队列随意修改元素,所以这里有一个技巧,先记录下来下标为x的元素更新后的值,先不急着更新优先队列,类似于线段树的懒标记,等到用到了才更新优先队列,当队头的值是最新的值的时候,那么说明更新过了,那么执行删除操作,否则,需要在优先队列中更新它的值。将字符为c1的位置都存储下来,然后枚举到字符为c2时,二分到最大的满足以c2结尾,c1开头的长度大于等于k的位置,然后该位置以及前面的c1都满足,作为对答案的贡献。

2024-04-12 15:49:21 725

原创 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 700 2

原创 Codeforces Global Round 25

然后加上票价增长这一条件,我们之后所选择的单价都会增加,比如说前面买了x张,那么后面买的单价增加x,发现实际上增加的票价和原先买票的价钱是独立的,只不过每次增加了当前票买的张数*前面买的票的总张数,发现式子中只有张数,并没有票价,所以和买的票的顺序无关,只和每次买的张数有关,所以优先买票价低的,然而我们肯定每次尽可能买的多,因为前面票价低,这是直观上的感觉。

2024-04-07 21:47:28 479

原创 上海理工大学第二届“联想杯”全国程序设计邀请赛

说到全排列,我们也可以让一个数组不动,让另一个数组进行全排列,进行两两匹配。说实话有点坑,题目意思不明,必须是整个字符串作为一个完整的碎片才行。一开始没想明白,但实际上暴力不可行的话,就需要一边遍历一边求了。数据超级小,直接暴力,dfs,枚举所有的匹配情况。每遍历一个数 ,求以当前数结尾的等差为k的等差数列长度。

2024-04-06 17:09:46 147

原创 牛客小白月赛90

用优先队列,将物品一个一个放进去,维护队列元素个数为k,在中途记录最小值即可。m的数据很小,可暴力,直接二进制枚举选与不选,再用差分进行区间操作。

2024-04-06 13:28:00 231

原创 牛客练习赛123

如果剩余数中不存在绝对众数,那么对于偶数个元素,肯定可以全部两两抵消,那么最终剩下当前数 ,对于奇数个元素,偶数个两两抵消,剩下一个和当前数去抵消 ,如果当前数大于1,那么可保留。如果剩余的数中存在绝对众数,那么剩余的去抵消,最终为绝对众数减去其它数之和,如果最终剩下的小于当前数,那么当前数可保留。当前数先不算,然后其它数去抵消,如果最后剩下的数小于当前的数则可以保留当前数。然后这道题题意每次去两个不同的数相消,就是摩尔投票的过程。等价地说,绝对众数的出现次数大于总元素数的。还多,那么就称它为这个集合的。

2024-04-05 21:48:35 255

原创 2023年第三届 “联想杯”全国高校程序设计在线邀请赛暨第五届上海理工大学程序设计竞赛(同步赛)

容易想到将所有物品按照价值从小到大排序,然后枚举每件物品作为中位数,在它的前面取k/2件体积最小的,在它的后面取k/2件体积最小的,check是否总体积超过m,如果不超过,那么作为预选答案,取最大的答案。1.不是很好写,要想从vector里删除数,挺麻烦的,还要考虑越界,可以先标记要删除的数,比如值标记为-1,然后将不是-1的都放到一个新的容器里,就相当于删除了标记的数。如果sum%3=2,那么优先删除一个对3取模余2的数,如果没有则删除两个对3取模余1的数。只有赢和输两种情况,要么赢要么输,没有平局。

2024-04-03 11:04:37 1116

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

原创 Codeforces Round 936 (Div. 2)

2.之前做过几道树的题目是不需要dfs的,只用分析度数,于是往这个方向想了很久,方向偏了,具体判断是否需要dfs的方法:如果树的具体形态不同,答案千差万别,那么肯定要dfs。对于二分出的连通块大小最小的最大值,dfs一遍,统计满足答案的情况下最多能分成多少个连通块,如果个数大于等于k+1,那么合法,取一堆合法中最大的那个。3.对于dfs的熟练度不够,特别是对于归(递归的归)的理解,一般是求子树的大小,子树的权值和,子树的异或和。A,B的思路都是很快就有的,没有什么卡顿,20分钟就出了,完全没有问题。

2024-03-23 14:49:52 574

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

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

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

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

原创 牛客练习赛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 232

原创 牛客小白月赛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 297

原创 Codeforces Round 931 (Div. 2)

通过问对角线的左下角,得到对角线上的那个地雷的可能位置,如果通过右上角得到的是假位置,那么通过左下角得到的一定是真位置,因为如果第二个地雷距右上角比第一个地雷距右上角近的话,那么第一个地雷距左下角绝对比第二个地雷距左下角近。综上,问(1,1),问得到的对角线的左上角和右下角,以此确定出的两个可能位置,两个位置中一定有一个是对的,所以只要问其中一个位置就行,最多问4次。这题一开始想用贪心,发现不可行,又想用完全背包,又不可行,那么将两者结合 ,阙值以上贪心,,阙值以下完全背包。目标确定其中一个地雷的位置。

2024-03-03 00:00:41 343

原创 牛客小白月赛87

利用两个双端队列 ,第一个队列表示光标左边部分,第二个队列表示光标右边部分。

2024-03-01 23:24:25 210

原创 2024牛客寒假算法基础集训营6

其他情况下可以进行贪心,将所有的节点赋值为1,然后根据红色节点的子节点权值和来修改该红色节点和它的任意一个白色节点。然后优先选大的(利用二分),然后选小的,选三个数,并减去,如果最后剩下的数大于0,那么无解。如果一个红点的儿子全是红点,那它必须也是3的倍数,不可能,这样是无解的,因为只能赋值1和2。利用二分,先将b升序,枚举a中的每一个数,在b中二分出离a最近的数,然后找到差值最小的。如果相乘不能为正,那么特判有没有0,如果有0,答案为0。求出数组a连续子段为正的最大,为负的最小,同理,对b。

2024-02-24 22:07:47 1193

原创 2024牛客寒假算法基础集训营5

有若干种物品,每种物品体积为bi,代价为ai,每种物品可以用无限次,问装满体积为n-1的背包最少代价是多少(这里一定可以刚好装满,因为可以花费p代价通知1个人,一定可以1个1个将剩余的补满)枚举第一行 ,然后看它左下,正下方,右下方,如果有相同的数字,那么只有一次就行,可以斜着断开或竖着断开,当然第一列和最后一列不能看正下方,因为并不能将连通块分成两块。如果n为奇数,从后往前,把第n-1个数变大 ,大到不能再大,不超过第n个数,同理,让第n-2个数,变大。贪心,从前往后枚举,能插入0就插入0。

2024-02-24 16:21:52 368

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

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

原创 Codeforces Round 926 (Div. 2)

如果输了,下次我们投那种我们赢了就可以赚的,这样它就只能让我们输,我们就靠这种方法逼它让我们输,一直输到连续x次,如果我们还有本金还可以赢的比最初的多,那么YES(不包括和最初的本金相等),否则NO。如果连续输了x次,那么可以放一个很大的数,把钱都赚回来,但是它赢一次输一次,这样无法确定什么时候赢,就不敢乱下注。所以如果对角线条数小于等于(n+n-2)*2,那么是一个单元格产生两条对角线,超过的,1个单元格产生一条对角线。进行投注,下注y个硬币,如果赢了,那么变成y*k,如果输了就失去本金。

2024-02-18 22:16:58 340

原创 codeforces 1500分

文章目录1.[C. Partitioning the Array](https://codeforces.com/contest/1920/problem/C)![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=.%2Fassets%2Fimage-20240116104959680.png&pos_id=img-hjWQL48F-170815391

2024-02-17 15:13:26 949

原创 Codeforces Round 925 (Div. 3)

题意为共n个人,k个人发出聊天截图,每个人都只把自己放在最前面,然后其他人相对顺序不变,问可否确定出顺序,实际上就是第一个人不看,然后从第二个开始到最后一个,相对顺序固定,看k种截图展示的是否有矛盾。4.两两进行配对,如要满足两个要求,第一个要求是对y取模相等,第二个要求是对x取模互补,那么可以将pair放入map中,假设当前为{aa,bb},那么与之匹对的是{aa,(x-bb)%x}3.同余方程,a-b是y的倍数,那么(a-b)%y=0,a%y=b%y。

2024-02-14 13:20:57 339

原创 codeforces 1400分

文章目录1.[B. Phoenix and Beauty](https://codeforces.com/problemset/problem/1348/B)2.[C. Rotation Matching](https://codeforces.com/problemset/problem/1365/C)3.[C. Element Extermination](https://codeforces.com/problemset/problem/1375/C)4.[D. Epic Transformation

2024-02-10 01:29:00 598

原创 Codeforces Round 811 (Div. 3)

除了0和5特殊一些,其它均可以进入到2->4->8->6的循环中,并且从2到2会增加20,比如12->14->18->26->32。贪心,从前往后,哪个延申的长度长就选哪个,如果延申不出去,则无解。求各数位之和为s的最小数(所有数位要求均不同)问将文本串全部涂色最少多少次操作,无解输出-1。操作:ai加上ai%10(可以多次对同一下标)每次都只加个位,所以个位上的数字只要看个位即可。每次都只加个位,所以个位上的数字只要看个位即可。操作:选择一个字符串,文本对应部分涂色。长度为n的数组a(数[0,1e9])

2024-02-04 23:53:20 398

原创 codeforces 1300分

文章目录1.[B. Random Teams](https://codeforces.com/contest/478/problem/B)2.[D. Anti-Sudoku](https://codeforces.com/problemset/problem/1335/D)3.[B. Trouble Sort](https://codeforces.com/problemset/problem/1365/B)4.[Problem - 1401C - Codeforces](https://codeforce

2024-02-04 20:15:35 849

原创 CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)

第二种是两个不同的序列进行匹配,比如说每次匹配差值最大的,要么序列a的最大和序列b的最小匹配,要么序列a的最小和序列b的最大匹配,再比如说要求是ai大于bi刚好有x个,那么需要a中最大的x个去和b中最小的x个匹配,保证有x个,但不是a的最大和b的最小匹配,而是分别升序,然后按顺序匹配,合理性通过反向思考感受。第三种是两个一样的序列进行匹配,一般是通过自身元素的两两交换来满足某个要求,本质上就是自身和自身匹配。第一种是序列内部进行两两匹配,比如说最小和最大匹配,次小和次大匹配。

2024-02-04 00:15:11 363

原创 2024牛客寒假算法基础集训营1

然后,考虑最后或起来是比m小的值,那么肯定需要把某位1变成0,这样才能变小,但是想要能或上的数很多,那么1肯定要多,所以把该位后面的位全变成1,这样仍然是小于m的,是合法的,即为m1,如果m1或上一个数还是等于m1的话,那么就可以或上。可以用set存下所有位置,然后对于第一行的(1,y),看(2,y-1),(2,y),(2,y+1)有没有着火点,以此判断左半边和右半边有没有被堵死。首先,如果最后或起来的值刚好为m,肯定是合法的,如果m或上一个数还是等于m的话,那么就可以或上。数据比较小,直接暴力,dfs。

2024-02-03 17:55:59 713

原创 Educational Codeforces Round 158 (Rated for Div. 2)

【代码】Educational Codeforces Round 158 (Rated for Div. 2)

2024-02-01 23:26:09 228

原创 Codeforces Round 921 (Div. 2)

x=(k1+k2+k3+k4)*g,所以g是x的因数,那么最大公因数只要在x的因数里选就行了,只要x/g大于等于n即可,因为至少要分成n组,枚举因数需要根号x,因为枚举g,同时得到x/g。第一组最后的字母是b,如果在该组前面出现过了,那么这一组早结束了,所以b在这一组只在最后出现了一次,这样选择每组的最后一个字母,就不会在前面出现过。选反例的话,就选每组的最后一个字母加上最后一组没出现的字母,因为每组的最后一个字母都是每组前面没出现过的字母,比如说aaaaab bbbb。

2024-01-28 14:24:06 380

原创 Codeforces Round 914 (Div. 2)

没有想到可以再次选择两个同样的数,这样的话,三次一定可以得到0。长度为n的数组a(数[1,1e18]) n大于等于2。操作:选取两个数,将两数的差的绝对值放在数组的末尾。其它只要讨论k为0以及k为1的情况。求数组a种最小值最小是多少。

2024-01-25 23:32:14 237

原创 codeforces 1200分

文章目录1.[B. Same Parity Summands](https://codeforces.com/contest/1352/problem/B)2.[C. Challenging Cliffs](https://codeforces.com/problemset/problem/1537/C)3.[B. Sorted Adjacent Differences](https://codeforces.com/contest/1339/problem/B)4.[C1. k-LCM (easy ver

2024-01-25 16:07:54 1041

原创 Codeforces Round 915 (Div. 2)

那么这个序列就是非升序的,每次循环右移就是把最小的一位放到最前面,那么最少的次数就是把这个序列排成非降序,用整个序列的个数减去最大的那个的个数即可,因为如果最大的不止一个,那么不需要再移了。从大到小贪心选取后面出现的最大的(利用后缀最大值,当等于后缀最大值时就选取)操作:得到字典序最大的子序列,并循环右移一位。最后,把排好序的序列放回原来的位置,进行检验。问最少几次可以排好序,无解输出-1。

2024-01-23 22:22:03 368

原创 Educational Codeforces Round 160 (Rated for Div. 2)

第二种是两个不同的序列进行匹配,比如说每次匹配差值最大的,要么序列a的最大和序列b的最小匹配,要么序列a的最小和序列b的最大匹配。但是你会发现,每一位二进制数都只用一次,该题中每个2的次幂不止一个,实际上从大到小贪心和每个2的次幂只用一次的贪心本质上是一样的。如果某个2的次幂有多个的话,那么就只保留一个(有奇数个)或者 一个也不保留(有偶数个),然后其余的进行合成,往上进位。两个一样的序列进行0和1的匹配,分别统计0和1的数量,从头开始遍历,一直到不能匹配。get w问是否可以从集合中取得一些数,和为w。

2024-01-22 13:51:29 1171

原创 Codeforces Round 918 (Div. 4)

还有其它的方法,就是我们只要将左端点从小到大排序,然后发现,只要右端点逆序就存在一个包含区间(就是说如果左端点小,但是右端点大,那么它就把一个区间包含住了),所以只要统计逆序对的数量即可,用归并排序。于是改用树状数组,但是有一个问题就是数的范围太大了,达到了1e9,要想用树状数组的话,这些数值本身作为一个位置,空间肯定爆了,所幸数的个数比较小,于是先离散化,这样的话空间就不会爆了。ai代表第i个人的起始位置,bi代表第i个人的结束位置(所有a,b数组的数均不同)通过手玩发现,包含和被包含关系才会相遇一次。

2024-01-21 13:15:44 401

原创 Educational Codeforces Round 161 (Rated for Div. 2)

并查集不可行,并查集不能有环,那就用两个并查集,往右的和往左的,但是这样是错的,因为并不是走到并查集的头就断了,可以先利用城市距离过去再继续走最近城市。由于不能走回头路,所以我们利用一个前缀和以及后缀和就可以了,如果可以走最近城市那么就加1,否则就加两城市之间的距离。x和y在两个方向,x朝着y方向走,一直走最近,直到最近的是往回走,千万不能走回头路,此时直接花费距离金币到y。不能走回头路,然后如果能走最近城市就走最近城市,如果不能走就花费距离金币,这样花费代价是最小的。共m座城市,位于ai,按升序排列。

2024-01-20 11:59:57 345

空空如也

空空如也

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

TA关注的人

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