自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)

题目链接题目大意:一天内有H小时,每小时M分钟,时针分针以恒定速率旋转。现在若时针分针的夹角<=α,则该时刻的分钟是贡献分钟。现在要求解一天里面的所有贡献分钟。分析:计算两个速率V1 V2,枚举小时【0,N-1】计算该小时内的有效分钟,显然是圆上弧长有一定关系,不妨写出如下暴力for(int i=0; i<n; i++){ for(int j=0; j<m; j++) { if(abs(m*i+j-n*j)<=k)

2021-07-19 17:04:40 1493 1

原创 Omkar and Circle CF1372D 题解

Omkar and Circle CF1372D裂开 ,想了好久怎么用线段树维护 QAQ 后面开始质疑这种解法了瞎写了一波线段树WA4 因为每次相邻元素相加我给标记了下标 但是如果值的次数出现大于1 就很有问题了 所以这显然行不通了打了一下午CF(corss fire) 再打CF(codeforces) - - 脑子更不好使了因为每次我们都是把a[i] 的相邻的值删掉 然后把和覆盖给a[i] 那么不妨自己画画图体会体会 ,显然按照每次覆盖掉最小值是可以得到题目要求的最大值但

2020-07-12 02:14:59 236

原创 Codeforces Round #643 (Div. 2)题解

Codeforces Round #643 (Div. 2) 传送门 传送刷题openA Sequence with Digits 水题暴力构造就好了 搞出一个0就输出就行 题意要求 元素x 加上 她的最小数位*最高数位 只要最小等于0 就会一直0#include<bits/stdc++.h>#define ll long long#define inf 0x3f3f3f3f#define mods 1000000007#define modd 9

2020-05-16 23:31:40 328 2

原创 Codeforces Round #641 (Div. 2)ABCD题解

A题:Orac and Factors 链接传送门水题 分类讨论a是奇数/偶数 操作就行了 奇数的话对a求因子 算贡献 代码如下ll a[manx]; int main(){ ll t=read(); while(t--) { ll a,b; a=read(); b=read(); if(a&1) { for(int i=2; i<

2020-05-13 11:04:15 880

原创 2024.5.22晚训题解

匀速运动的时间=一小段路程/(区间距离 除以 区间时间) 我们把除法转换一下,把分母的除法乘上去,变成 一小段路程*区间时间 除以 区间距离 这个公式就是我们的匀速运动的时间,不整除也没事,反正不整除的部分也不考虑,因为答案向下取整,所以本题算时间得这样子算,注意long long。在哪,用匀速运动算出那一小段时间,再加上前面的即可。我们考虑标记,按二进制位进行映射标记,把除了前两位,其他位一样的数字标记到一起,他们内部可以任意交换,为了使得最终数组字典序最小,那肯定是小的摆前面去。

2024-05-22 20:30:00 405

原创 贪心速刷晚训题解

因为有正负的情况,所以要考虑的有点多。因为本题数据较小,你要是考虑不清楚就直接枚举A里面隐藏哪个数,能得到的最大值最小化就行了。肯定是让越磨蹭的人 越靠后,这样子能使得整体上每个人尽量满足 生活常识,卸货也是这样的。考虑多看较短的影片,每个影片有个结束时间,排序,从小到大,开始新一轮的寻找,。直接开始看,能看就多看,这样子是最优的,越靠后结束,你能看的片子就越少。如果K大于等于2,我们可以先选N,然后补齐小于N的部分的所有的2进制位。直接排序,如果中间点是等于的状态,就会有不确定的对局,这是不行的。

2024-05-21 15:15:57 282

原创 2024.5.17晚训题解

根据这个思路我们就去记录,到达每个点走了多少步操作数。这里涉及到坐标的印射,最好使用pair<元素类型,元素类型>+map 去映射 ,pair<>记录的就是二元组,我们可以映射map<pair<元素,元素>,元素> vis ,使用的时候就是vis[make_pari(a,b)]=?,所以我们的策略是每次拿全部大于等于10的整的部分去买东西, 去算返现,把个位留着,加上返现进行下一轮计算。注意如果是全偶数或者N个数全是奇数但是加来的和是偶数,这都是变不出来的。实际上你会发现,如果你每次都全部拿去买东西,

2024-05-17 10:28:50 283

原创 2024.5.16晚训题解

我们的优先队列里面存的元素,其实是会内部排序,top一定是最小的,拿出最小的以后又会调整,始终保证我们放进多种组合价值后top还是当前最小值。你可以想象类似于BFS,起始状态是0,每次搜索N个菜拿走,每次从最小的价值组合继续搜索,因此第M次一定是第M小的组合。找到连着的两个T,把他俩变成PC,要求变得尽可能得多,那肯定从左往右碰到俩就变俩,这样能变出来最多的。小的组合,下一轮循环以此类推,这个快速维护最小值,以及去重操作,其实就是优先队列+set的操作。临近比赛,晚训更加频繁了,希望同学们继续坚持下去!

2024-05-16 14:46:01 248

原创 2024.5.15晚训题解

实际上就可以用v[j].push_back(i)来搞定,输出同理,排个序就完事了。跟温州市赛那题毫无区别,这题甚至还给了旋转公式,代码就不放了。对于操作1和操作2,我们可以开个vector数组,那么把数组。数据范围很小,可以直接枚举(s, t)的所有组合,判断即可。对于操作3来说有排序和去重操作,所以我们可以用set维护。直接枚举各个长度的十字架就完事了。当然码力弱的人未必能写。这场看起来相当暴力。

2024-05-15 18:59:53 266

原创 2024.5.14晚训题解

枚举26个字母,判断两个字符串关于这些字母的数量是不是一样的,如果不一样,那就要用@来变,如果变不出来那就是No ,注意变了以后现有的@数量要对应减去。我们先计算出串的最小值,枚举一遍串,先算出定值(已经固定数字的位置),然后根据贪心的思想,从最高位开始向低位枚举,寻找?根据二进制的规则,0111111111111 这个数字 +1 构成逢二进一,才能变成 1000000000000,所以说一个高位的1,比它后面所有低位都放1 是还要大的。例如(1<<0) 表示把1的二进制整体左移0位,相当于不变。

2024-05-14 20:30:00 626

原创 2024.4.14第二次阶段性测试

两个字符串修改成一样的,会有一个花费,这个花费说白了就是字母的间距,因为题目不允许成环状修改,所以我们一个字母变成另一个字母的花费就是它们之间的间距。总的来说,最近半个月不上课不晚训,很多同学啥也不做不练,二分也没学好,甚至连基本的模拟题都不会写,如果以这种状态继续学下去,那你只能仰望同班同学了。,那么一个矩阵的规模也就40000,我们枚举每个点,每个点需要计算一遍左右对角线,也就是至多。,只要是变成这俩字母中间的任意字母,其实花费都是一样的,因此我们直接把。个点,不过题目也保证了,所有T组数据里面的。

2024-04-14 11:42:47 1008

原创 VJ二分专题题解

如果这个数目大于C头牛,说明我们这个间距是可以的,我们考虑扩大间距继续二分;然后我们不断的计算相邻牛栏的间距并求和,当间距>二分答案时,我们必须在当前牛栏放一头牛了,否则间距会超过我们二分的答案。都减去x以后然后求和,如果求和大于等于0,说明这一段的数平均值是大于等于x的,这就是核心的check思路,我们不要关注这个平均值到底由几个构成。这题的意思是说,有N个位置的牛栏,但是牛会打架,所以一个位置只能放一头牛,现在想问放进去C头牛,使得所有牛之间的间距的最小值尽可能地大,是多少?

2024-04-10 10:39:15 917

原创 【入门】二分答案题解

考虑二分跳跃距离x,直接从左往右枚举石头,计算出相邻石头的跳跃距离并求和,如果该求和距离<x,我们记录石头数量,因为这些石头都是需要被搬走的。如果最后一段一直跳跃到终点,距离和还是<x,那么需要再搬走一块石头,相当于把上一次的落脚点石头直接移除掉,这样子一步跳跃到终点,满足了“跳跃距离至少为x”如果在当前答案下,段数小于M,说明我们的二分的答案比较大,我们尝试缩小答案;直接二分答案,对于答案而言,代入回每段木头check,利用整除就能计算出某段木头能切割出多少。二分答案,表示某一段和的最大值x。

2024-04-07 10:19:59 265

原创 YCKCOJ清明进阶专题题解

--

2024-04-06 14:47:23 874

原创 【整数二分】难题选讲

其实就是从左到右的一个过程,每次拆完数字以后,计算出这一段数字有多少个,我们当前的总长度+1就是本段数字的起点位置,当前总长度+当前段的长度就是本段数字的终点,因为前面也有很多段数字。我们对录取分数线排序一下,为了更好地明确范围,我们把原本录取分数数组两端新增两个值,一个极小值-1e9,一个极大值1e9,然后二分查找录取分数里面小于等于当前估分且最接近当前估分的录取分数的位置。因为本题估分可能超过录取线,也可能低于录取线,总之差的绝对值就是不满意度,为了计算某个估分的不满意度,实际上我们需要两个分数,

2024-04-06 10:18:30 732

原创 2024.4.2abc晚训题解

数组相当于是睡眠的记录数组,偶数位置是开始睡觉的时间,奇数位置是醒来时间,我们可以考虑记录一个睡眠累计时长的前缀和。数组中(最接近的不大于的元素位置),有了位置就可以考虑利用前缀和处理。简单语法题,输出有点小技巧会方便点,像一般遇到环状的数据,我们考虑把数据从0位置存入。因为差至多为D,而且还要加起来的和尽可能大,实际上最优的答案对于。每日积累的知识,每天放弃的娱乐时间,势必化成我前进的力量。我们把它当成检查的判断,对排序(从小到大)后的。要么是醒来的时间,要么是睡觉的时间点,饼干矩形的哪一个角。

2024-04-02 22:00:00 560

原创 温州市第一届青少年程序设计竞赛(小学组)题解

例如题目询问第Q大,我们就按每个位可以选择的种数,将Q拆解成某个进制,利用进制的思想,0表示该位置最小的值,1表示该位置上能摆放的次小的值…其实题目已经保证一定有解了,那么依次旋转矩阵,然后按照同行递增,同列递增的规则判断验证一遍即可,注意如何写矩阵的旋转。可以取,两者取最小值,就是可行解的个数。简单的条件判断题,注意判断三角形类型,再判断是否等边等腰。非常经典的进制思维的题目,与这一题如出一辙。规模的矩阵,两种填法有多少个格子的值一样。第一种填充方式对于第。列的位置的数字来说,列的位置的数字来说,

2024-04-01 18:43:58 1152

原创 图片。。。

2024-03-31 18:19:23 88

原创 2024.3.28abc晚训题解

当我们遇到右括号时,判断前面有没有能用的左括号,如果有那么就不断删除数组尾部的字符,直到我们遇到左括号,也要删除,并且左括号数量-1.如果前面没有可以用的左括号,那么就把右括号也存入数组尾部。题目的F(i)函数指的是值为i的数字出现的第二次的下标 ,排序所有F(i)以后依次输出对应的i。如果吃了,那么第i天一定会是无毒的,考虑dp[i][0]可以由昨天怎么变过来?对于第i天的菜如果是解毒的,考虑吃还是不吃的问题。我们考虑第i天的状态,要么无毒要么中毒了。对于第i天的菜是有毒的,考虑如何吃的问题。

2024-03-28 23:00:00 380

原创 2024.3.26abc晚训题解

如果我们以x作为答案代回去检查,那么对于第x天还在吃药的情况,计入吃药的数量,判断最终吃药的数量是不是小于等于K,如果是,说明我们这个答案是可行的,但是我们要找更小的答案,所以我们把答案范围缩小。那么由某个位置pos构成的MEX字符串有多少个就很好算了,直接pos前面M的数量*pos后面X的数量就是由该位置的E组成的MEX总个数。旋转矩阵的外围一圈,写法也挺多的,简单点的思路就是用一个数组把外圈存起来,然后依次控制顺时针摆放回去,考验同学们指针控制的能力。每天吃的药的总量,很明显,是一种单调不递增的序列。

2024-03-26 23:30:00 359

原创 2024.3.24阶段性测试题解

当然有同学好奇这样子转移,是如何做到"移除第一项或者最后一项 的" 我举个例子 1 1 1 1 2 3 4 5 从左到右依次对应的L[i]就是1 1 1 1 2 3 4 5,所以说如果存在a[i-1]与a[i]无法衔接的情况(因为衔接起来会导致当前L[i]>a[i]) ,但是上一步至多是持平的,所以说如此转移。枚举制作i=0~i=A_max道A菜,然后枚举N个原材料的消耗,A的材料消耗了以后用剩余的材料去看看最多能计算多少个B菜,然后A的数量+B的数量就是总数,对总数取最大值就是我们最多能做的总菜数。

2024-03-24 10:05:15 1032

原创 2024.3.21div4晚训题解

因为前面的小朋友已经跟i握手过了,不再产生贡献。一个简单的模拟游戏而已,模拟出石头掉落,最终落在哪里,注意一开始可能有些石头是悬空的,如果你从上往下枚举去处理石头的掉落,会出现上面的石头掉落在下面悬空着的石头上面。本题就是一个两端往中间吃的过程,不难发现,因为最终要使得两个人吃的数量是相同的,那么双方有不平衡的时候,就应该让弱势方继续吃,平衡的时候保存一遍答案。实际上有两种,因为此时我们枚举的字符串是ij (第一个字母是第i个字母,第二个字母是第j个字母),与它恰好只有一个不同的字符串是。

2024-03-21 23:30:00 681

原创 2024.3.19abc晚训题解

每次拆一半,最坏的情况是要拆出50多层,我们画一下图就很容易知道每一层要处理的f(x)是上一层的2倍,那么就会爆炸程序。但是本题涉及到的f(待处理) 重复出现了很多次,所以说可以用存储数据的方式,把每个f(待处理) 的值算出来以后,存起来,当其他分支情况再遇到它时就可以直接查询出答案,而不是再向下搜索一遍。所以说修改以后我们第i次上下车后,车上总人数就又是0人了,控制在一个刚刚好的边界,最终就能保证车上人数最小。如果为负,说明一开始车上0人是不科学的,那么要补齐,补到当前这个前缀和的负数变为0。

2024-03-19 23:45:00 353

原创 2024.3.15abc晚训题解

定义vis[i]=i ,表示一开始所有第i个字母最终都变成了第i个小写字母。每次修改的时候,把c[i]字符改编成d[i]时,涉及到一个问题,那就是经过若干次修改变化后,我们可能一开始多个vis[i] 都变成了同一个字母,所以说每次修改的时候要判断一下26个字母里面当前变成c[i]的哪几个,然后都修改成 d[i]。最终输出的时候按照vis[]字母表输出。晚训网址https://vjudge.net/contest/615489。F题参考程序(暴力检查即可)按照个 十 百 千 拆分即可。

2024-03-16 12:38:38 355

原创 2024.3.13abc晚训题解

因为涉及到对应某个人的分数数值修改,所以说我们需要标记出每个人的分数情况,以便快速查询并且修改。考虑到把A,B,C数组枚举一遍找到所有的和并标记起来,然后Q次询问的时候能直接查询。晚训题目地址https://vjudge.net/contest/615340。N是非常大的,K是回文立方数,我们可以考虑枚举x,不难发现在最大值为10。那么涉及到种数的减少或增加,所以我们要标记每个分数的总数。当某种分数的总数因为当前操作,数量变为0时,种数减1.map如何使用,可以见B站讲解视频。的情况下,x最大为10。

2024-03-14 15:53:29 355

原创 2022牛客寒假算法基础集训营1 I题(概率)

题目连接。。很显然的算出false方案数/总方案数不就是 失败概率了然后(1-p(flase))*m ll x=qow(2,n-1); ll x1=inv(x); cout<<(x-1)*x1%mod*m%mod<<'\n';

2022-01-25 09:52:46 295

原创 Codeforces1629D Peculiar Movie Preferences(STL)

题目链接题目大意就是给你N个字符串,问你是否存在一个子序列中字符串按顺序连接是回文串。分析: 显然长度为1 一定存在,长度为2的 只需要存在一个与它相反的串即可,长度为3的,假设abc 那么检查是否存在cba 以及 abc+ba // cb+abc注意位置关系以及某个字符串是否多次出现(WA死我了,一直没想到一个字符串可能多次出现) #include<bits/stdc++.h>#include<stdlib.h>#include<algorit

2022-01-23 14:49:57 580

原创 Bitwise Or vs LCM(规律)

题目链接打表,开写。ll a[2111111];ll b[2111111];ll vis[2111111];signed main(){ ll n; read(n); ll pos=-1; ll ma=0; for(int i=1; i<=n; i++) { ll x; read(x); b[i]=x; vis[x]=i; a[x]++; i

2022-01-20 10:15:05 386

原创 AtCoder Regular Contest 132 Shift and Reverse(思维)

题目链接题目保证了给定输出一定有解,所以序列一定是从1—n 按操作1变换来的或者说从n—1按操作1变换来的,然后计算一下还原步数就可以。signed main(){ int n; read(n); int a[n+5],pos[n+5]; for(int i=1;i<=n;i++){ read(a[i]); pos[a[i]]=i; } int ans; if(pos[1]<pos[n]){

2022-01-19 15:07:46 576

原创 Codeforces1626C Monsters And Spells(双指针)

题目链接题意:N个怪物,出现时间是Ki 有着Hi的血量。 人蓄力释放魔法第k次时,伤害力为K,且魔法消耗值也为K,一个怪物只能打一次,问打败所有怪物所需的最少魔法值是多少。解析:考虑到是若干条直线一样的东西(抽象)我们定义一个直线的区间为【L,R】这个区间里面的怪物都能打败且从L时刻开始蓄力。那么如果我们倒着枚举,即Kn作为第一个区间的R,左端点很显然的算得出来,同理,计算Kn-1时,当且仅当 L<=Kn-1 必须合并这个区间,L取更小的端点值。struct pe{ ll

2022-01-19 14:38:22 572

原创 CSUST小精灵爱打工(二分)

题目链接感觉像一种树的编码又不知道咋编。我们二分时间x为答案,显然ai越大的要越先建筑。令bi表示对应ai的精灵出现的时间,那么显然在x以内且能完成建筑时就要尽可能的分裂,分裂到n个小精灵。ll n,t;ll a[111111];ll b[111111];bool cmp(ll x,ll y){ return x>y;}bool check(ll x){ ll cnt=1; ll now=0; b[1]=0; for(int i=1; i

2022-01-18 11:12:34 97

原创 CSUSTOJ 安排课程(贪心)

题目链接一道十分经典到老掉牙的题显然我们要按截止时间从小到大排序,同ddl按工作时间排序。维护三个东西,ans答案,now当前总花费时间,以及当前状态下有贡献的课程集合中的最大工作时间。用优先队列维护答案集合中的最大工作时间,如果当前时间now+当前任务时间<= 该任务截止时间那么可以之间放入集合。反之我们去替换答案集合中最大工作时间的任务。PS:我是直接替换的,没判断当前任务时间是否大于答案集合中的最大时间所以导致WAstruct pe{ ll x,y;} a[11111

2022-01-18 10:00:44 221

原创 CSUSTOJ use(二分思想)

题目链接首先我们把题意中的式子化为一个表达式就是ai-bi>bj-aj令ci=ai-bi那么就是求有多少个ci+cj>0 对于任意的 i<j首先对C数组排序后二分,注意,我们要从原先pos=1 枚举着二分意思就是我们枚举的第一个数不一定是当前sort后的最小值二分出合法的区间端点X 那么答案就是在【X,N】,但是考虑到题目的i<j我们是从原数组的最小下标开始枚举二分的,因此每次只需要把该pos标记下,并算出【X,N】区间内有 cnt个已经标记的那么答案就是Σ

2022-01-17 16:46:50 258

原创 CSUSTOJ字符串的交换(思维)

题目链接其实画个图就很显而易见了,题目询问的是改变次数。那么对于一个对称点i ,如果对应的字符是偶数个,就可以分配到一致否则需要更改,另外注意下中断点 判n的奇偶性。十分easychar s[222222];char b[222222];ll vis[28];signed main(){ ll n; read(n); scanf("%s%s",s+1,b+1); ll ans=0; for(int i=1; i<=n/2; i++)

2022-01-16 16:02:21 206

原创 Codeforces1627D Not Adding(数论)

题目链接题目大意:给出一个序列A且各不相同,定义操作为任意取两个数做gcd(ai,aj)并放入序列中,前提是该gcd值不存在于序列中,之前。询问最多可以玩多少次操作分析:显然,gcd再大也不会大过A序列中的最大值。如果我们想得到一个数x 那么有两种办法1 该x原本就存在于序列A中2 该x由一个A序列的子集gcd构成如果要满足条件2,显然,存在gcd(ai,aq,ap -----)=x 那么显然该子集的a? 一定是x的倍数,所以易知 如果令起始数为x ,枚举x的倍数,如果该倍数存在

2022-01-16 15:48:36 259

原创 AtCoder Beginner Contest 235 E MST + 1(最小生成树思维)

题目连接题目大意:一个给定的无向图中,可能重边可能自环,但是任意两条边的边权一定不相等,询问对于给定的Q条边中,如果每次只把当前Qi 边放在图中,问该边是否会出现在该图的MST(最小生成树)中,回答yes/no思路:Q条边是独立的,我们可以按Q+M(最初的边集) 条边求最小生成树利用并查集,过程中如果被加入到MST集合里面的是Q集合里面的某边,对应号标记即可,否则就是no,这样子保证了最小且联通的性质#include<bits/stdc++.h>using namespace s

2022-01-16 14:57:11 402

原创 2021CCPC广州Three Integers(思维)

The 2021 CCPC Guangzhou Onsite H题 Three Integersemm真没啥好说的,分类讨论即可,合理运用倍数关系注意存在一个0的时候且存在一个数为1 那么倍数就必须扩大下 否则会被hack到死因为x y z 不能超过1e18且a b c范围1e9我设置的倍数趋近于1e9但是可能会被这种数据卡,a=0,b=1,c=1e9此时不能单纯的用signed main(){ ll t; read(t); while(t--.

2021-11-16 18:55:39 2001

原创 AtCoder Beginner Contest 227G题Divisors of Binomial Coefficient(数论)

题目链接大概意思是求组合数C(N,K)的因子个数由于K<=1e6显然组合数拆分后可以得到n*(n-1)***(n-k+1)/k!因子个数可以由每种质因子的幂次计算得到。把式子上下消除后按质因子幂次归纳,可以得到一个新的式子此时我们只需要处理1–K的质数并计算出第i个质数在k!中出现了多少次,在分子又出现了多少次然后计算答案,最终统计下分子上方仍然不为1的(说明是大质数)答案乘2#include <bits/stdc++.h>using namespace std;c

2021-11-15 15:12:19 306

原创 AtCoder Beginner Contest 227D题Project Planning(二分)

题目链接考虑二分答案,如何check呢?假设答案为mid ,那么相当于要摆放mid个盒子,每个盒子要有K个不同的小球,因为同种小球不能摆在一起,故每种小球只能摆放min(mid,a[i]) 个填充的思想,直到填满K层 记为true #include<bits/stdc++.h>#include<stdlib.h>#include<algorithm>#include<stdio.h>#include<string.h>#inc

2021-11-14 22:04:16 560

原创 AtCoder Beginner Contest 227C题ABC conjecture(数学)

题目链接题意很显然,但是咋求捏。考虑枚举A,即有n1/3 这么多然后枚举B,B是>=A的那么会获得一个最大的范围即N/(A*B)现在C的取值方案只需要范围减去B的方案即可emmm(不知道听不听得懂)signed main(){ll n;read(n);ll ans=0;for(int i=1;i*i*i<=n;i++){ ll ok=n/i; for(int j=i;j<=n;j++){ ll now=n/(i*j); if(now&l

2021-11-14 22:01:17 374

空空如也

空空如也

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

TA关注的人

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