- 博客(167)
- 收藏
- 关注
原创 第十三届蓝桥杯-李白打酒加强版(dp)
一共最多有200个位置,每一个位置可以选择:加倍或者-1。加倍只能加n次,那么我们可以考虑定义状态dp[i][j][flag]dp[i][j][flag]dp[i][j][flag]表示第i个位置还有j次可以加倍,当前的操作选择的是flag,flag=0代表-1,flag=1代表加倍的种类数。但是如果当前定义的状态,那么信息不够,因为题目最终要问的是最后一次遇到花,而且刚好全部喝完酒了有多少种可能。我们还需要开设一个维度,代表当前还剩下多少酒。也就是dp[i][j][k][flag]dp[i][j.
2022-04-10 14:11:50
929
3
原创 CF1244E Minimizing Difference(二分+双指针)
题目传送门#include<bits/stdc++.h>using namespace std;#define int long longconst int N=1e6+10;int a[N];int sum[N];int n,k;bool check(int mid){ for(int i=1,j=1;i<=n;i++){ while(a[i]-a[j]>mid)j++;//j,i if((a[i]-mid)*(j-1)-sum[j-1]+sum[n]-s
2022-02-21 00:00:00
374
原创 CF1251D Salary Changing(二分+贪心)
题目传送门这个题是二分答案来找最大的中位数,那么中位数的性质就是第n/2+1个数的左边不小于这个数,右边不大于这个数。根据性质我们就可以很容易写出来check函数,那就是找n/2+1个工资大于mid的最大值的临界值。#include<bits/stdc++.h>using namespace std;#define int long long#define endl '\n'typedef pair<int,int>pii;int n,sl;struct node
2022-02-15 20:50:16
847
原创 CF1630B Range and Partition(二分+中位数的性质)
题目传送门在牛客的寒假算法训练营1中,炸鸡块君出了一个题对于中位数的结论在这里的体现也是非常恰当的:记数列中≥ ????的数字有????????????????个,< ????的数字有????????????????个,则答案为???????????????? − ????????????????,该值≤ ????时则不存在答案。那么分析这道题,我们要求[l,r][l,r][l,r]数的个数大于非[l,r][l,r][l,r]内的数的个数。那么我们怎么进行问题的转化呢?原问题其实就是让求
2022-02-15 18:53:43
733
原创 炸鸡块君与FIFA22(st表)
题目传送门做法是st表,这道题其实有一个比较麻烦的地方就是状态就是如果当前得分是3的倍数,那么输了不掉分,那么怎么就想到了st表做法?当前的起点得分是k,因为给出的原字符串的输赢已经成定局了,所以从当前起点,到终点的增加的得分是一个定值,也就是静态的,对于区间的静态查询我们就不难想到使用st表,对于st的初始化,就可以定义状态st[i][j][k]st[i][j][k]st[i][j][k],代表了jjj到j+2k−1j+2^k-1j+2k−1这一段时间,当起点得分取模是i的时候这一段区间加了多少分。这
2022-01-26 11:50:39
542
原创 Average and Median(二分)
题目传送门其实这道题的平均数求解就是正常的求平均数的套路,但是这题有一个限制,就是相邻两个格子,必须要有一个被选中,因此我们就可以在这里跑一个dp,当前位置的状态划分可以分为,1:选,0:不选,然后对之前的状态进行转移(基础的背包问题),如果可以check函数返回yes,反之则返回no。那么中位数在比赛的时候,没有意识到,中位数需要排序,然后选中间的较小的那个数,就没想出来,结果比赛结束幡然醒悟,其实中位数的check就是:二分出来一个中间值,check一下当前位置和中间值的大小关系,如果大于当前的mi
2022-01-25 19:15:13
971
原创 牛牛看云(二分做法)
题目传送门这个题目可以根据数据优化#include<bits/stdc++.h>using namespace std;#define int long longint a[21000000];signed main(){ int n; map<int,int>mp; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; mp[a[i]-500]++
2022-01-25 19:02:11
443
原创 CF754D Fedor and coupons(优先队列)
题目传送门思路这道题我刚开始的思路,是按照l为第一关键字,r为第二关键字从小到大排完序以后,二分答案,后来wa掉了,其实就是排完序的结果未必能够连续使用。因为如果区间非常长的小比如k=31 95 65 96 10如果是用二分的话5 6是没有办法排掉的因此我们可以用优先队列,将l从小到大进行遍历,然后将右端点r压入优先队列,将小的先弹出,因为最后的答案一定是所有区间的交集,那么l是所有区间的左端点的最右边那个,右端点就是最左边那个,所以我们遍历左端点,然后保证了当前的端点已经是我们判断的端
2022-01-15 21:47:25
3908
原创 VA1626 括号序列 Brackets sequence(区间dp)
题目传送门这道题有两个难点如何找到当前区间最小的添加值现在我们使用两个指针i,ji,ji,j,用这个两个指针dp[i][j]dp[i][j]dp[i][j]来记录一下,如果s[i],s[j]s[i],s[j]s[i],s[j]是合法的一对括号序列,那么状态转移方程就是:dp[i][j]=min(dp[i][j],dp[i+1][j−1])dp[i][j]=min(dp[i][j],dp[i+1][j-1])dp[i][j]=min(dp[i][j],dp[i+1][j−1])然而对于所有情况来说,
2021-10-09 17:31:59
168
原创 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest J. Prime Game(数论)
题组传送门题意现在给你一个含有nnn个正整数的集合a[]a[ ]a[],现在定义一个函数mul(l,r)mul(l,r)mul(l,r)代表al∗al+1∗...∗ar−1∗ara_l*a_{l+1}*...*a_{r-1}*a_ral∗al+1∗...∗ar−1∗ar并定义fac(l,r)fac(l,r)fac(l,r)代表mul(l,r)mul(l,r)mul(l,r)中含有不同的素因子的个数。请你计算出fac(i,j)fac(i,j)fac(i,j)思路...
2021-09-28 19:55:46
162
原创 2021 ICPC网络赛I-A Busiest Computing Nodes(线段树)
题意现在给你若干个机器nnn和若干组需求mmm,每一个需求的第一个数是开始时间,第二个数字是持续时间,现在对于每一组需求(第iii组需求,我们需要优先安排到第i%ni\%ni%n的机器中,如果当前时间机器正在工作中,那么挪到(i+1)%n(i+1)\%n(i+1)%n个,以此类推,如果当前我们要开始的时间发现所有的机器均在工作,那么当前需求作废,看下一个)。输入的第一行是n,mn,mn,m接下来的mmm行代表需求的个数,每一行的第一个数代表当前需求的开始时间,第二个数代表当前需求要进行的时间。(持..
2021-09-20 21:12:08
523
2
原创 P1450 [HAOI2008]硬币购物(容斥原理)
题目传送门问题引入我们现在可以给出这样的一个问题:现在给你nnn种不同的价值的硬币,分别是c[i]c[i]c[i],现在你要购买一个价值为sss的商品,每一种硬币不限,请问你有多少种购买的方式。那么很显然,这个是一个背包问题,我们只需要遍历每一个价值,对每一个硬币的价格进行dp,二重循环就可以。这个很简单。现在题目加一些难度现在给你nnn种不同的价值的硬币,分别是c[i]c[i]c[i],现在你要购买一个价值为sss的商品,第一种硬币只能使用k次,其他的每一种硬币不限,请问你有多少种购买的
2021-09-12 20:48:18
182
原创 集合计数(容斥原理)
题目传送门-洛谷思路分析首先对于一个有nnn个元素的集合一定有2n2^n2n个不同的子集,在这些子集中,也一定有22n2^{2^n}22n个不同的子集取法,刨去空集,那么我们就获得了22n−12^{2^n}-122n−1种取法,那么因为你选的若干个集合中一定有kkk个元素作为交集,那么我们现在先要选出来这些元素都是啥,因此要求出CnkC_n^kCnk,现在我们的答案就是要求Cnk∗(22n−k−1)C_n^k*(2^{2^{n-k}}-1)Cnk∗(22n−k−1),你以为完了吗,不!这并不是最终
2021-09-11 16:54:06
527
原创 CF1567C Carrying Conundrum(组合计数+思维)
题目传送门思路这个题和我们正常的竖式运算的区别在于:正常的竖式运算是向下一位进位,而本题的新定义运算是隔位进位,因此我们就可以考虑将这些数按照奇数和偶数位进行拆位:例如:150051500515005可以拆位成为:105105105(奇数位)和505050(偶数位)这样的情况下奇数位一共有105+1种可能性(分别是:0 105、1 104、2 103…104 1、105 0)同理还有偶数位一共有51种可能性,因此我们可以先计算总体个数:106*51但是现在我们有一个问题,就是我们获得
2021-09-07 20:21:44
218
原创 CF1567D Expression Evaluation Error(数学+思维)
题目传送门思路这道题的思路其实就是,比方说我们现在要拆10000为3位,那么我们肯定拆成1000 1000 8000要比9998 1 1 好,(位数越低,其代表的值越小)前者是10∗11310*11^310∗113后者是9∗113+9∗112+9∗111+10∗1109*11^3 +9*11^2+9*11^1+10*11^09∗113+9∗112+9∗111+10∗110因为是10进制转换为11进制,因此进位越多其损耗越大,因此我们需要让我们拆分的位数加起来进位越少越好,所以,每一位拆成以1打头的
2021-09-07 20:12:44
101
原创 CF1558A Charmed by the Game(STL)
题目传送门考察set的用法,可以注意迭代器遍历。#include <iostream>#include <string>#include <vector>#include <set>#include <algorithm>using namespace std;int sum[2102100];int a[2102100];int b[2102100];int main(){ ios::sync_with_stdio
2021-09-05 10:46:45
274
原创 CF1562D2 Two Hundred Twenty One (hard version)(思维)
传送门(easy version)传送门(hard version)题意思路(easy version)对于easy版本来说我们只需要明白一点:我们只需要求出最少的删除数字的个数,而且还有一点值得注意的是:删除某个数字以后,后面的位置对求和以后的贡献正好是倒转的,(正变负,负变正),因此我们先按照答案要求的来模拟,最后得到的数据,如果是0,那么我们的答案就是0(不用删除就可以完成结果),但是如果最后的答案不是0,如果结果是奇数,那么我们只需要删除一个,也就是 A-A结构,A和后面的A对答案数值贡
2021-09-04 22:15:37
146
2
原创 CF1556D Take a Guess(位运算)
题目传送门题意您可以发起不超过2∗n2*n2∗n次提问,提问的内容是对于两个不同下标的两个数ai,aja_i,a_jai,aj,可以提问他们的aia_iai&aja_jaj或者aia_iai|aja_jaj,求出整个数组,并对其排序,求出第kkk个数据。思路关于位运算,这里有个结论:(牛客多校D8-D)ai+aj=aia_i+a_j=a_iai+aj=ai & aj+aia_j+a_iaj+ai | aja_jaj那么我们就可以询问aia_iai和任何位
2021-08-30 08:30:51
176
原创 关于两数相乘
a∗ba*ba∗b 的计算方法,现在给你两个数a和b,但是他们的数据范围不同则应该选择不同的计算方法来落实这个问题,保证(a,b在ll范围内)a*b(0<=a,b<=1e4)直接int乘一下不必多说a*b(0<=a,b<=1e6)会爆ll,要开lla*b(0<a,b<=1e18)取模(mod<=1e10)因为有模数限制,因此我们需要对这个东西取模,取模以后结果仍然在ll范围内,因此还能正常O(1)求。取模(mod<=1e18)这样的两个数相乘
2021-08-23 10:00:19
804
原创 斐波那契(矩阵快速幂)
传送门眼快瞎了也没找出来错,还是希望下一回细心一点构造左矩阵:1 1 1 4 6 41 0 0 0 0 00 0 1 3 3 10 0 0 1 2 10 0 0 0 1 10 0 0 0 0 1构造右矩阵1618421然后带入板子就好啦#include<iostream>using namespace std;#define LL long long #define int long long const int mod=1e9+7;struct Ma
2021-08-22 18:50:29
107
原创 全排列模型
做CF的时候会发现一些题有相似的手法解决题目传送门-CF1555D Say No to Palindromes题意这道题其实就是不希望这次询问的这个区间有长度大于等于2的回文子串(ss这样的也不行),也就是“严格不回文”,请问这个区间最少的改变次数。当然你不能随便改这个字符,你只能在abc这三个中选一个改。这题实际上也是暴力,但是一看m,n数据范围都不小,我没有办法去完成这件事情,但是观察abc这三个选择倒不算很多,字符串ABCABC(ABC分别代表了不同的单元)就是满足了严格不回文的要求,那么我就
2021-08-19 18:40:31
98
原创 CF1509C The Sports Festival(dp+思维)
题目传送门题意给你一个序列,你可以任意交换这个序列的位置,现在让你求出前n个子序列的最大值减去最小值之和的最小值。思路这道题要求前n个子序列的最大值减去最小值最小,那么贪心考虑我们肯定尽量让最小值或者最大值在最后,如果不然,那么我们最大值-最小值(差值最大)的情况将会有两种,因此,将进行区间dp。#include<iostream>#include<algorithm>#define int unsigned long longusing namespace std;
2021-08-09 14:46:11
215
原创 CF1451D Integers Have Friends(博弈问题)
题目传送门题意Alice和Bob又来做游戏啦!这次他们做的是,给你一个直径为d的圆,现在有一枚棋子位于(0,0)原点,每一次操作可以把棋子向右或者上方移动一个单位长度,Alice先手,Bob后手,棋子只能位于圆中,不能移动则失败,请输出赢者。思路这道题和在桌面上放硬币的思路非常相似:先手先占据桌子的中心位置,那么后手无论怎么放置,我们的先手都可以按着这个中心对称的位置跟着放就可以了,因此先手必赢。那么按着这个思想。我们现在设xxx是2∗(x∗k)2<=d22*(x*k)^2<=d
2021-08-08 23:08:38
107
原创 CF1493D GCD of an Array (分解定理+思维)
题目传送门这道题有一个非常牛逼的数据结构就是multisetmultisetmultiset题意先给你一个序列,然后给你几组询问,询问的第一个数是在第x个位置上,第二个数p代表,在第x个位置上乘p。请找到这个序列的gcd,并输出。思路这道题肯定是让你找到所有数的公共的因子,那么就可以以因子为下标,存到multisetmultisetmultiset里面,同时开一个数组标记一下,这个数作为了几个数的因子。如果能找到这个因子,并这个数已经作为全部的因子,答案乘这个数。#include<iost
2021-08-06 18:17:27
118
原创 CF1548C The Three Little Pigs(组合数学+dp)
题目传送门题意这道题实际上就是让求∑i=1nC3∗ix,x\displaystyle\sum_{i=1}^{n}C_{3*i}^x,xi=1∑nC3∗ix,x是我们每次询问的数值,nnn是小猪进场的轮数。思路我们可以定义一个dpdpdp方程,dp[x][m]dp[x][m]dp[x][m]代表∑i=1n−1C3∗i+mx\displaystyle\sum_{i=1}^{n-1}C_{3*i+m}^xi=1∑n−1C3∗i+mx因此,我们可以得到dp[x][0]+dp[x][1]+dp[x]
2021-08-03 12:24:53
315
原创 CF1549D Integers Have Friends(st表+二分/双指针)
题目传送门题意这道题让你找一个最长的区间,这个区间里面的每一个数,都要对于m>=2m>=2m>=2同余思路这道题用到一个同余的性质如果 x≡y(modp)x≡y(mod p)x≡y(modp)那么(x−y)(x-y)(x−y)%p=0p=0p=0那么对于一整个区间来说,我们只要满足这个区间的差分数组不互质就可以。因此问题就转换成为了,维护一个差分数组,找到最长的不互质的子序列。因此我们就要用到二分+st表,如果想优化你也可以双指针(100ms的优化)同时这道题用scan
2021-08-02 20:45:27
545
原创 2021牛客多校5-Double Strings(dp+组合数学)
这道题不要读假题呀,这道题不是让你选连续的一段(要是连续的一段不就成签到题了么)dp思路用dp[i][j]dp[i][j]dp[i][j]表示只考虑 AAA中的前iii个字符和BBB中的前jjj个字符时的相同的子序列的个数。状态转移如下:dp[i][j]=dp[i−1][j]+dp[i][j−1]−dp[i−1][j−1]dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]dp[i][j]=dp[i−1][j]+dp[i][j−1]−dp[i−1][j−1]...
2021-08-01 13:20:08
176
原创 2021牛客多校5-King of Range(单调队列/ST表+假的二分)
这个题可以用ST表写,但是我很荣幸地收获了TLE,下面我把我的代码贴在下面。#include<iostream>#include<cmath>using namespace std;typedef long long ll;int st[2102100][30];int sta[2102100][30];int k;int checka(int i,int mid){ int k=log2(mid-i+1); return max(st[i][k],st[mi..
2021-07-31 22:37:50
456
1
原创 CF689D Friends and Subsequences(ST表+二分)
题目传送门题意给定序列 aaa 和序列 bbb,长度均为 nnn。问有多少组 (l,r)(l,r)(l,r),满足 1≤l≤r≤n1\le l\le r\le n1≤l≤r≤n 且maxi=lrai=mini=lrbi\max_{i=l}^r a_i=\min_{i=l}^r b_ii=lmaxrai=i=lminrbi1≤n≤2×1051\le n\le 2\times 10^51≤n≤2×105,∣ai∣,∣bi∣≤109|a_i|,|b_i|\le 10^9∣ai∣,∣bi∣
2021-07-30 15:31:17
412
原创 CF1554C Mikasa(思维+贪心)
题目传送门题意现在已知n,mn,mn,m,请求mmm⊕{0,1,....,m0,1,....,m0,1,....,m}的MEXMEXMEX(最小的没有出现过的自然数)思路本题转换为n⊕x=yn⊕x=yn⊕x=y现在已知 0<=x<=m0<=x<=m0<=x<=m,可以将式子转换为n⊕y=xn⊕y=xn⊕y=x现在已知,yyy没有在我们的运算结果这个集合中出现,那么x>mx>mx>m因此n⊕y>=m+1n⊕y>=m+1n⊕y&g
2021-07-30 12:41:21
280
3
原创 CF1547F Array Stabilization (GCD version)(ST算法+数论)
题目传送门思路STSTST算法STSTST算法能在O(nlogn)O(nlogn)O(nlogn)时间处理以后(动态规划思想),然后O(1)O(1)O(1)时间来查询的一种及其高效的做法。最大公约数的一个性质:gcd(i,j,k)=gcd(gcd(i,j),k)gcd(i,j,k)=gcd(gcd(i,j),k)gcd(i,j,k)=gcd(gcd(i,j),k)因此设st[i][j]st[i][j]st[i][j]表示数列中在下标子区间[i,i+2j−1][i,i+2^j-1][i,i+2j−
2021-07-28 14:54:25
167
2
原创 2021牛客多校4-Average(二分答案)
题目传送门思路这道题最后推出来矩阵的平均值,其实就是横向平均值的最大值+列项平均值的最大值那么我们就可以用二分答案(本问题的答案具有单调性)对于每一个数组中的每一个元素枚举a[i]-mid的前缀和,来找这个序列中是否存在大于我们规定数组长度的前缀和大于0的,如果存在那么我们就继续往大二分,反之,就说明我们的mid取大了就往小里来二分。#include<iostream>#include<cstring>using namespace std;const double
2021-07-27 10:26:10
355
原创 CF1551E Fixed Points (DP)
题目传送门题意在每一组测试中,第一行给你两个数n,k,第二行给你一个大小为n的数组要求你可以删一些数,至少有k个能满足,a[i]=i,请问删除的数最少有几个,如果没有这样的数字,输出-1思路这道题其实很容易能看出来这是一个dp,但是我们应该怎么分析呢?首先对于dp[i][j]代表前i个数,删除第j个了以后有几个满足这样的情况。1.我们这个点不删if(a[i]==i−j)if(a[i]==i-j)if(a[i]==i−j)dp[i][j]=dp[i−1][j]+1dp[i][j]=dp[i-1
2021-07-27 10:08:08
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人