- 博客(36)
- 收藏
- 关注
原创 归并排序,快排
之前都只是听过这些排序的名字,但因为感觉用不上就没学,今天看了一下,感觉看讲解还没直接看代码理解快,大概是看几分钟就能自己实现的程度。
2022-08-15 21:50:07
115
原创 牛客小白月赛39 G-冷静 线性筛最小质因子+树状数组
原题链接题意:中文题面,q次查询,每次查询给出n,q,求1-n中可以写成都是大于等于k的质数的乘积的形式的数的个数,即将一个数写成质因子相乘的局面时最小质因子大于等于k,如10 = 25,20 = 225,30 = 23*5。思路:线性筛预处理所有数的最小质因子,只要将标记操作时赋值1改为赋值pri[i]就可以了,然后给所有查询按照n升序排序,离线处理插入树状数组查询。#include<bits/stdc++.h>#define LL long long#define INF IN
2021-10-27 10:52:57
191
原创 2021CCPC网络赛重赛 _ 1011 _ HDU7136 _ Jumping Monkey 并查集,重建树
原题链接转载博客写的很好了,这里只做记录:D贴个代码#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 998244353#define ls rt << 1#define rs rt << 1 | 1using namespace std;typedef pair<int,int>pa;const int N = 1e5+7;int
2021-10-14 20:14:51
125
原创 Codeforces Round #674 (Div. 3) F.Number of Subsequences 简单线性dp
原题链接题意:给一个长度为n的由a,b,c,?组成的字符串,?代表任意填abc,问所有情况产生的字符串中有多少个abc子序列。思路:经典递推dp,特殊的地方在于?的处理上,当?取a的时候应该加的值不是1,设当前下标前出现过的?次数为x,当前位置出现a的时候加的值是3^x,再把?取bc的情况传递一下就ok了#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 1000000007#d
2021-10-13 17:50:57
86
原创 2021CCPC网络赛重赛 _ 1005 _ HDU7130 _ Monopoly 正负数同余性质,细节题
原题链接题意:有1-n个节点,从0出发,每次只能往右走一个节点,n的下一步会回到1节点,每走到一个节点获得ai(-1e9-1e9)点分数,m次查询,每次查询最少走多少步分数可以到达x。思路:令从1-n走完一轮的总分数为sum根据每个点的前缀和对sum取余得到的值分组,然后每次查询二分查找x对sum取余同余的那组最优的节点,没有则说明没有合法点思路不难想,赛中一开始想歪了,后面纠正回来的时候没多少时间了,在写法上一直在犹豫,最后成功把自己送走。#include<bits/stdc++.h&
2021-10-11 16:29:44
214
原创 2018 ICPC 青岛站 F-Tournament zoj-4063
原题链接题意:n个骑士要进行m轮对决,每一轮每个骑士都要有一个对手。而且每个对手只能打一次。假设a与b打了,c与d打了,那么后面的任意一轮如果a与c打了,那么b就必须和d打,问是否存在方案,存在就输出字典序最小的一组,否则输出Impossible思路:构造,将骑士分成2幂次组,然后在组内循环,看到其他题解都只是说了用lowbit(n)来判断是否合法,但并没有说原因的,我在这里补充一下吧,lowbit取的是2进制最低位,减一得到的就是二进制最右端的连续0转化成1,正好对应了2幂次分组的幂次和。最容易
2021-10-07 17:05:56
332
原创 Codeforces Round #724 (Div. 2) D - Omkar and Medians 树状数组+离散化
原题链接题意:已知一个数组a和数组b,bi是a数组中前i个元素的中位数,现在给定b数组,判断是否可以求出a数组思路:假设第b[i]前都满足,那么说明此时b[i]就是a数组中的中位数,现在插入b[i+1]会出现两种情况。1.如果b[i+1]和b[i]之间没有出现过数,那么只要插入一个b[i+1]再根据大小关系插入一个+inf或者-inf就行了2.如果b[i+1]和b[i]之间出现过数,那么仅插入两个数最多只能使中位数移动一位,并不能移到b[i+1]身上,所以这种情况是不行的。所以直接树状数组查询中
2021-10-02 15:32:12
84
原创 Codeforces Round #541 (Div. 2) 1131D. Gourmet choice 头铁大模拟(std拓扑排序+并查集
原题链接题意:有个厨师吃了2天,每天吃m道菜,然后给每道菜打分,给出一个n*m的字符矩阵,s[i][j]表示第一天的第i道菜和第二天的第j道菜的评分的大小关系,求这两天吃的菜的评分。思路:按>和=数量排序,先给最大的赋值1e4,每次取两个字符串对比,讨论一下各种组合情况,判掉不合法情况,求出第一天的评分,再根据每一列的符号求出第二天的评分。这时候求出来的只是相对大小,还要把所有的值在数轴上往左移,把最小的数移到1就可以了,细节比较多,很锻炼码力。改到wa9的时候搜了一下题解,看到tag是拓扑
2021-09-10 10:53:09
145
原创 Codeforces Global Round 15 1552D. Array Differentiation 思维好题 场景转换(建边/dp)
原题链接题意:给出n个数a1…an,问能否找到n个数b1…bn使得任意一个ai可以由b数组中两个数相减得到。思路:很容易发现x+1个bi是可以随意构造出x个ai的,一个b0=0,其他bi=bi-1 + a[i] 就可以了,所以只要这x+1个bi中还可以构造出一个其他ai就是可行的。现在的问题就变成了是否存在一段ai的和等于另一段没有重复元素的ai的和,如图所示,有一个像这样环就是可以的。这是dfs写的,还有一种写法是用三进制枚举,=每一个ai是加还是减或者跳过,然后看有没有sum==0的情况,
2021-09-08 15:19:12
231
3
原创 “红旗杯”第十五届东北地区大学生程序设计竞赛 D - Lowbit
原题链接题意:n个数,m次操作。操作1:给l,r之间的数加上一个自身的lowbit(二进制下的最低位)。操作2:查询l,r区间和。思路:可以发现进行操作1只有两种情况。1.如果这个数是2的倍数,那么进行操作1只需要*2就可以了。2.如果这个数不是2的倍数,那么就是最低位往左移一位。根据题目中a[i]的范围可以知道一个数最多只能进行15次第二种情况的操作,就是10101010101010101这样的形式的时候。所以可以对不是2的倍数的值进行暴力单点修改,当一个区间内的值都是2的倍数的时候再
2021-09-04 18:40:00
572
原创 Codeforces Round #643 (Div. 2) 1355E. Restorer Distance 三分
原题链接题意:n堆由相同砖块堆成的堆,有三种操作:1.在第i堆放一块转,花费a。2.在第i堆拿走一块转,花费r。3.把第i堆的砖拿到第j堆,花费m。求使得所有堆高度相同的最小化费。思路:先增后减的函数曲线,三分高度算花费。#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 998244353#define ls rt << 1#define rs rt &l
2021-09-03 15:56:55
142
原创 Codeforces Round #697 (Div. 3) G. Strange Beauty 线性筛变形思维
原题链接题意:n个数,问删除多少个数之后剩下的数组中的数满足:对于任意一对i,j满足ai%aj==0 || aj%ai ==0。思路:题目给的ai只有2e5,很容易想到从ai入手,算出如果当前这个ai是留下来的数中最大的数时,有多少数不用被删除。先计算每个数出现的次数,然后给原数组排序去重,遍历出现过的数的倍数,然后取最大值就可以了,注意每一组都是独立的,所以是分别计算取最大值,不是累加。#include<stdio.h>#include<algorithm>#i
2021-09-01 21:57:25
147
原创 牛客小白月赛37 I-加减 二分/双指针+前缀和
原题链接题意:小红拿到了一个长度为n的数组。她每次操作可以让某个数加 1 或者某个数减 1 。小红最多能进行k次操作。她希望操作结束后,该数组出现次数最多的元素次数尽可能多。你能求出这个最大的次数吗?思路:固定ai让左右的数往ai靠,然后二分区间长度或者双指针遍历区间,前缀和O1算区间贡献,不错的思维题。二分#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 99824435
2021-08-31 11:12:22
6763
4
原创 Deltix Round, Summer 2021 (rated, Div. 1 + Div. 2) C - Compressed Bracket Sequence 反人类绕远路乱搞思维
原题链接题意:给一个长度为n的数组,下标为奇数的ai表示这个位置的连续的左括号个数,下标为偶数的ai表示这个位置的连续的右括号个数,求合法的连续子串个数。思路:如果是比较短的括号序列,经典栈+dp就可以解决,但这道题显然不能一个括号一个括号遍历,(为了方便用LR代替左右括号)因为LR是交替出现的,我的想法是根据每一对LR的大小关系来统计,那么就有了三种情况。1.L==R,那么ans += L,L,R个数都清空,并且这一块的LR可以作为合法情况和左边的合法情况进行组合,如果i-1的R也为0,那么就至
2021-08-30 18:55:24
176
原创 hdu6992 Lawn of the Dead 查询区间会变的线段树小变形
原题链接题意:n*m的棋盘,k个地雷,从(1,1)开始走,只能走右下两个方向,显然地雷不能走,问能到达的格子数思路:两棵线段树维护一下上一次层能到的区间,然后根据这一层的地雷位置推出理论上能到的区间,再更新这一层实际能到的区间。#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 1000000007#define stree SegTree[f][root]#define ls
2021-08-27 16:56:13
124
原创 hud6986 Kanade Loves Maze Designing 简单dfs
原题链接#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 998244353#define ls rt << 1#define rs rt << 1 | 1using namespace std;typedef pair<int,int>pa;const int N = 100005;const int b = 19560929;vect
2021-08-27 16:48:38
424
原创 hdu6976 Game on Plane 数组的巧妙应用
原题链接#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 998244353#define ls rt << 1#define rs rt << 1 | 1using namespace std;typedef pair<int,int>pa;const int N = 100005;pa a[N];int cnt[N];int mai
2021-08-27 16:35:29
127
原创 2021牛客暑期多校训练营2 K.Stack
原题链接#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 998244353#define ls rt<<1#define rs rt<<1 | 1using namespace std;typedef pair<int,int>pa;const int N = 1000005;struct node{ int p, x;}a[N
2021-08-27 15:23:56
122
原创 E2. Three Blocks Palindrome (hard version) 双指针+前缀和
原题链接题意:n个数,求像图片中这样回文子序列的最大长度,x,y,z可以为0全程做假题,最后百思不得其解,看题解才发现题意都读错了…思路:因为限定了最多只能出现两种不一样的数,所以直接枚举两边那个数的种类和长度就可以了,双指针把每种数跑一遍,然后用前缀和跑一下中间那个数的最大贡献,一时之间竟然想不到什么做法可以过E1卡E2#include<bits/stdc++.h>#define LL long long#define INF INT64_MAX#define MOD 998
2021-08-18 20:03:36
84
原创 Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version) 稀疏表+二分
原题链接题意:给一个正数数组,每一步操作会把所有ai变成gcd(ai, ai+1),对于an=gcd(an, a1),求最少多少步之后会使得所有数都相同。思路:答案具有单调性,所以可以二分答案,查询操作可以用线段树或稀疏表维护一下区间最大公因数,题目给了四秒,基本怎么写都不会超时,我线段树跑了1169ms,稀疏表跑了549ms,试了一下其他人的稀疏表可以跑到300多ms。线段树#include<bits/stdc++.h>#define LL long long#define I
2021-08-18 16:01:40
143
转载 Codeforces Round #630 (Div. 2) - E. Height All the Same (思维+组合数学)
原题链接这篇博客已经讲得很好了,这里只做一个指路和记录。题解博客
2021-08-16 10:29:05
77
原创 Codeforces Round #632 (Div. 2) F - Kate and imperfection 思维好题+贪心策略
原题链接题意:给一个1-n的排列,问当选取大小为k=2,3,…n-1,n的子序列时,对于所有对i,j中Max(i,j)最小为多少。比如n=4时,取大小为2的子序列{1,2},gcd(1,2)=1;取大小为3的子序列{1,2,3},gcd(1,2)=1, gcd(1,3)=1,gcd(2,3)=1,所以还是输出1取大小为4的子序列{1,2,3,4},gcd(2,4)=2,是最大的,所以输出2.思路:首先最容易想到的就是先选素数,然后去找素数的倍数,这是最自然的想法,我当时也是这样想的,然后写着写
2021-08-13 20:23:56
100
原创 POJ3321 Apple Tree dfs序+树状数组
原题地址题意:给一颗根为1的树,节点数为n,一开始每个节点上有一颗苹果,现有两个操作:1.Q x,输出x的子树上的苹果个数。2.C x,如果x点有苹果就拿走,没有就长一个出来。m次操作。思路:用dfs序把树上的节点转换成区间形式,然后用树状数组或者线段树维护和查询,模板题。#include <iostream>#include <stdio.h>#include<cmath>#include <cstdio>#include<algo
2021-08-08 21:29:03
126
原创 Codeforces Round #734 (Div. 3) D2. Domino (hard version)
原题地址题意:nm的矩阵,有横的竖的12的多米诺骨牌,问能用骨牌填满的情况下,只放k个横的多米诺骨牌的放法,相邻的骨牌用不同的小写字母表示,保证n*m为偶数。思路:两种情况。第一种n为偶数的时候,我们可以通过观察发现这时候如果不放横的骨牌,竖的骨牌是肯定可以放满的,但是如果只放一个横的骨牌,就会多出一个1 * 2的空间,这时就不能只用竖的骨牌放满了,所以当n为偶数,k也为偶数,并且k <= n*(m/2)时(m/2就是每一行最多能放的横的骨牌)输出YES。第二种n为奇数的时候,我们可以通过观察
2021-08-08 16:44:12
186
原创 6971 I love max and multiply 位运算小性质
题意:两个数组a,b,数组ci = max(ai*bj)(同时i&j >= k),求数组c位运算小性质:当i&j==0时,i xor j >= i, i xor j >= j。思路:令sum = 2^k >= n, i 从 sum到1枚举,j从2的0次方开始枚举,2的一次方,2的二次方一直到2的k次方,太巧妙了,举个例子,一个二进制数10011000,j == 1的时候会继承10011000,j == 10的时候,他会继承10011010,这时候的10011010
2021-08-06 11:34:17
167
原创 Educational Codeforces Round 111 (Rated for Div. 2) C - Manhattan Subarrays (思维好题)
原题地址题意:给一个数组,求好的连续子数组的数量,坏的连续子数组的定义:数组中任意三个数a[i],a[j],a[k]构成的点(ai, i) (a[j], j) (a[k], k) 的曼哈顿距离满足x=y+z。数组中找不到这样的三个数就是好数组。思路:典型的暴力复杂度爆炸,找隐藏条件和性质,思维好题。我们根据曼哈顿距离的求法可以发现,当i < j < k时,只有i -> k或者 k-> i满足 |k-i| = |j-i| + |k-j| 或者 |i-k| = |i-j|
2021-07-15 11:12:42
198
原创 Codeforces Round #712 (Div. 2)(A-E题解)
场次链接后悔啊后悔,当天晚上打的时候工作室网炸了,开场五分钟镜像页面才看到题目,A题读完就想到判断最前面和最后面能不能加就行了(字符串渣第一时间没想到直接在原字符串上加,反而去判断s[0]和s[n-1]等不等于’a’然后再写,饶了好大一圈)。写完了准备交的时候原网站也刷出来了,看了一下A过题人数已经有2300了,就没急着交,先去读了一下B和C,吗的读B的时候漏翻了一个prefix,以为可以在任意位置翻转,想了一下卧槽好像很复杂,不对劲啊,这场这么难吗?然后读了下C,发现是个字符串构造,想的时候刷新了一下题
2021-04-06 11:36:26
264
2
原创 结构体排序 重载运算符
struct node{ int v, s; bool operator < (const node &a) const { //if return v<a.v; //else }};
2021-04-03 10:23:52
225
原创 CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave
原题链接题意:m个点,n次操作,操作分为1和2两种;操作1:一次走⌈x/100000⌉个点,可以走0-y次(走0次-走y次都算一步);操作2:一次跳到⌈x*当前位置/100000⌉处,同样可以走0-y次(同上);问:每个点最快多少步可以到达?思路:暴力,乍一看暴力的复杂度是nmy,但是实际上y是跑不满的,所以只要写的不是太烂基本2nm就可以跑完,我的写法是n次循环,每次把m个点都跑一遍,把可以跑到的点标记一下,然后再套一个m循环判断一下是否合法,这样跑出来的一定是最快的。#include<
2021-03-31 20:48:33
161
原创 Codeforces Round #710 (Div. 3) G. Maximize the Remaining String
原题链接题意:t组数据,每组给一个由小写字母组成的字符串,将每个出现过的字母删减至只剩一个,输出删减后字典序最大的字符串。该说不说,这场div3的官方题解就写的就nm离谱,明明有更好理解复杂度更低的解法,硬是要放最难理解复杂度最高的解法,无语惹。思路:用vector存一下每个字母的下标,然后从z到a遍历,二分查找一下当前字母(比如是z)最贪心的位置,再判断一下比z小的字母下标中最后一个下标是否比这个位置小,如果存在就说明z不行,会有比z小的字母无论怎么删减也会在z前面,大概就是这个意思,细节还是看代码
2021-03-29 10:10:56
166
原创 Codeforces Round #710 (Div. 3) F - Triangular Paths
原题链接题意:有一个无限三角形,顶点为(1,1),左下角分叉横坐标+1,右下角分叉横纵坐标各+1,假设你从(1,1)出发,(x+y)为偶数时向左下移动,(x+y)为奇数时向右下移动,可以强行修改路线,花费为1,求满足经过n个点时的最小花费。可以画一个0代表偶数,1代表奇数的图,可以发现是有规律的,我是分三种情况讨论。1.同在一条为1的斜线上或在相邻01线上则花费为0;2.同在一条为0的斜线上贡献就是两个点的距离;3.在不同斜线上,如果前一个点在0上,则距离–;#include<bits/
2021-03-27 11:46:54
164
原创 set容器取最后一个值
#include<bits/stdc++.h>#include<vector>#include<map>#include<queue>#define LL long long#define INF INT64_MAX#define MOD 1000000007#define stree SegTree[root]#define lson SegTree[root << 1]#define rson SegTree[root <
2021-03-26 18:53:16
4946
原创 Codeforces Round #702 (Div. 3) G. Old Floppy Drive
结构体lower_bound思路很简单,之前在牛客写过一道类似的题目,那道题的题面是勇者屠恶龙打BOSS,可以除一下然后直接暴力,这道不行,要用二分查找,不过即使是这样我也并不觉得这道题有1900的难度。记录一下a数组总和sum和最大值Max,可以算出答案所在轮次,然后再二分查找具体的下标,有一个细节就是可以在记录Max的时候把每次更新Max的值用结构体存起来,后面直接二分这个结构体数组就可以。#include<bits/stdc++.h>#include<vector>#
2021-03-11 16:46:00
115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人