- 博客(162)
- 收藏
- 关注
原创 [Codeforces Global Round 14] F. Phoenix and Earthquake (组合数学+打表逆元+dp)
题目链接:F. Phoenix and Earthquake题解我们考虑手动开灯情况,很明显就是一段段连续的1中间最多隔一个0。每个区间内灯被点亮的方案数为2len−1{2^{len-1}}2len−1个,(len为区间长度)。定义:设dp[i][j]:前i个灯有j个手动开,最后一个是手动打开的方案数。{设dp[i]}[j]:前i个灯有j个手动开,最后一个是手动打开的方案数。设dp[i][j]:前i个灯有j个手动开,最后一个是手动打开的方案数。初始化:dp[i][i]=2i−1{dp[i][i]=
2021-05-13 10:22:34
206
原创 [“深圳计算科研院杯“E起来编程暨第三届湖北省赛] D.WA (优先队列)
题目链接:D.WA题解维护出相邻a之间的长度以及左右下标,按照长度从小到大放入优先队列,显然队首出队的永远是长度最小的,我们就将该区间内的字母全部变为a即可。注意第一次出现a往前的区间以及最后一次出现a往后的区间没有考虑。所以如果k有剩余就考虑这两个区间,不断变a即可。代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bits
2021-05-06 19:10:00
323
原创 [2021年度训练联盟热身训练赛第一场] E. Early Orders (单调栈)
题目链接:E. Early Orders题解题目大意是给一个长度为n的序列,要求找到一个字典序最小的子序列只包含1~k一次。本题可以用单调栈解决,每当我们遍历到一个数ai{a_i}ai,如果当前数小于栈顶的元素并且存在aj(j>i){a_j (j>i)}aj(j>i)等于栈顶元素,那么我们就可以删除当前栈顶的元素,不断删除直到不符合条件为止,然后将当前元素入栈。再用一个vis标记元素是否已经在栈里,如果当前元素已经在栈里,就不再需要入栈。代码#include<iost
2021-05-06 17:02:54
107
原创 [AcWing] 1319.移棋子游戏 博弈论 Sg函数板子题
题目链接:1319.移棋子游戏题解好久没写博弈论的题了,写几道复习一下,博弈论SG主要由两大部分组成:SG函数和SG定理SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不在S内的最小非负整数。SG定理:游戏和的SG函数等于各子游戏SG函数的NIm(异或)和。本题DAG图,博弈论SG的典型运用,记忆化搜索。代码#include<iostream>#include<algorithm>#include<cstdio>#i
2021-05-04 16:08:00
235
原创 [Acwing] 区间最大公约数 线段树入门
题目链接:区间最大公约数题解本题有两个操作给区间加上一个数以及查询区间gcd(最大公约数)。查询按照线段树查询模板操作即可。难点在于区间修改。单纯的暴力每次修改O(nlogn),显然比直接暴力还暴力,定会超时。遇到这种给区间加上一个数的一般可想到差分思想刚好由夹逼准则不难证明一个等式:gcd(a1,a2,...,an)=gcd(a1,a2−a1,...an−an−1){gcd(a_1,a_2,...,a_n)=gcd(a_1,a_2-a_1,...a_n-a_{n-1})}gcd(a1,a2,
2021-05-02 23:46:46
143
原创 __int128输入输出
输入和快输很像,更改声明类型即可。void scan(__int128 &x)//输入{ x=0;int f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=x*10+ch-48;ch=getchar();} x*=f;}inline void print(__int128 x){ if(x<0){ putchar('-');
2021-04-28 10:46:17
2789
原创 [Codeforces Round #708 (Div. 2)] E2. Square-free division (hard version) (尺取预处理+dp)
题目链接:E2. Square-free division (hard version) 题解本题E1的解法是先把每个数的所有平方因子杨了(ec-final学了一手),然后判断当前数是否曾经出现过,如果出现则说明需要在此划分,否则继续向下遍历。但E2加了一个条件可以更改k个数。首先我们需要清楚一点,假如前i个数有两个重合的,那么我们通过更改重合的那个数是否一定能使前i个数不重合,或者是否能保证更改后也一定不和后面的数重合。E2的做法同样是先把平方因子杨了,所以假如重合了,更改后的那个数把平方因子杨
2021-04-27 21:46:42
173
原创 [Acwing ] 238. 银河英雄传说 (边带权并查集)
题目链接:238.银河英雄传说题解本题的难点在于查询同一集合的两艘战舰间隔多少战舰的问题。我们可以利用前缀和的思想维护一个d[x]:x到f[x](x所属集合终结点)的距离。维护一个集合大小sz[x]:集合x的点数。每当我们要将a集合合并到b集合上时,很明显b集合上的d[x]值是不会发生改变的,影响的是a集合上的值,需要在a集合上每个点的d[x]+sz[b],也就是集合a的点到b集合终结点的距离。但注意其实我们在路径压缩时,会不断的访问父节点、父节点的父节点以至于找到集合最终结点,所以可以得到一
2021-04-25 22:43:15
179
原创 [Codeforces Round #717 (Div. 2)] D.Cut (倍增)
题目链接:D. Cut题意给一个长度为n的数组,有q次查询,每次查询给定一个区间[l,r],问该区间能至少划分成多少个连续子区间使得子区间里的数两两互质。题解我们首先可以预处理得到以每个点x作为右端点向左划分一个子区间时的左端点的下标f[x]。用dp[i][j]{dp[i][j]}dp[i][j]表示以j为区间右端点向左划分2^i个子区间后的左端点下标初始化:dp[0][x]=f[x]{dp[0][x]=f[x]}dp[0][x]=f[x]转移方程:dp[i][j]=dp[i−1][dp[i−
2021-04-24 22:16:45
219
原创 [2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
#include<bits/stdc++.h>typedef long long ll;#define mid (l+r>>1)#define min(a,b) (a<b?a:b)using namespace std;const int N = 2e5 + 10;ll sum[N * 100];int Lc[N * 100], Rc[N * 100], tot;void insert(int& rt, int l, int r, int val, int
2021-04-23 22:50:49
203
原创 [Codeforces Round #717 (Div. 2)] C. Baby Ehab Partitions Again (01背包+思维)
题目链接:C. Baby Ehab Partitions Again题解用dp判断一开始是否需要删除数字,如果需要,我们只需删除最低位为1的那个数即可。貌似许多人2e9的时间复杂度也能过,就离谱。代码int a[maxn],sum;int dp[maxm];int book[maxn],n;vector<int> p;bool f(){ memset(dp, 0, sizeof(dp)); p.clear(); sum=0; dp[0]=1; for(int i=1
2021-04-23 12:19:17
238
原创 [HDU - 1542] Atlantis (线段树+扫描线 模版题)
题目链接:Atlantis题意给一些可能有重合部分的矩形组合成不规则图形,求这个不规则形状的面积。题解每个矩形都有左右边界,这些边界(x=c)将整个不规则图形划分为一个个区间,我们只需求出区间内不规则图形部分所占用的高,答案就是∑{\sum}∑区间长度*区间高。在求区间内不规则图形部分所占用的长度时。我们可以将每个矩形左边长度+1,右边长度-1,将所有的矩形的纵坐标点保存离散化成整数,用线段树维护一个个相邻纵坐标区间,保存纵坐标区间内不规则图形占用的长度以及覆盖的次数。很显然tree[1].le
2021-04-22 15:44:44
210
原创 [AcWing] 3068. 扫描线 模版题
题目链接:3068. 扫描线题解枚举横坐标区间,每个横坐标区间内合并所有纵坐标区间。代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdli
2021-04-21 17:59:32
126
原创 [Codeforces Round #510 (Div. 2)] D. Petya and Array (归并/权值线段树/树状数组) 一题多解
题目链接:D. Petya and Array题解代码归并解法const int N=2e5+100;int n;LL sum[N];LL ans=0;LL t;void Solve(int l,int r) { if(l>=r)return; int mid=(l+r)>>1; Solve(l,mid); Solve(mid+1,r); LL ret=0; for(int i=l,j=mid+1;i<=mid;++i) { while(j<
2021-04-21 09:30:37
137
原创 [UVA - 11210] Chinese Mahjong 模拟
题目链接:UVA - 11210题解蓝书讲的很清楚,但是美中不足的是最后其实可以不用dfs判断,完全可以枚举,有的题可能会卡你dfs,比如2021 icpc的昆明~代码
2021-04-20 16:55:39
175
原创 [Codeforces Round #716 (Div. 2)] D. Cut and Stick 主席树
题目链接:D. Cut and Stick题意给你一个长度为n的序列,有q次查询,每次查询有一个区间范围[l,r],问如何划分a[l]~a[r],使得各个子序列每个数出现次数不超过⌈len2⌉{ \lceil \frac{len}{2} \rceil}⌈2len⌉,len为划分后的区间长度。注意子序列不一定连续。题解首先这道题我们需要知道任意一个区间内出现次数超过⌈len2⌉{ \lceil \frac{len}{2} \rceil}⌈2len⌉的x是谁。如果出现次数都没有超过说明没有必要划
2021-04-20 10:12:35
177
1
原创 [2020 ccpc 长春] F. Strange Memory (树上启发式合并)
题目链接:F. Strange Memory题意给定一个有n个结点以1为根的树,每个结点有个权值ai{a_i}ai,问存在多少u、v对满足au⊕av=alca{a_u \oplus a_v=a_{lca}}au⊕av=alca,统计所有u⊕v{u \oplus v}u⊕v和。题解首先由于结点权值不为0,所以不存在a[u]⊕a[v]==a[u]{a[u] \oplus a[v]==a[u]}a[u]⊕a[v]==a[u]的情况。因此满足条件的点对一定在lca结点下的两个不同子树上。我们可以通过
2021-04-19 16:48:22
260
原创 [2021 icpc昆明] K.Riichi!! 模拟
题目链接:K.Riichi!!题解为了做这道题还专门练习了刘汝佳蓝书的麻将题,结果蓝书dfs判断胡牌的方法用在昆明这道题时会超时,而且蓝书专门提到"1s1s1s1s1s"这种bug,昆明竟然不判就A了,特判一下还就WA了,真的坑。。。麻将题的关键在于判断胡牌的方法,目前做的麻将题胡牌都是四个刻字或顺子外带一将,没有考虑到清七对的胡法。我们只需枚举一将是哪一种牌,然后判断剩下的是否能组成刻字或者顺子即可。如果不胡牌那就取出一张放另外一张,然后判断胡牌即可,上文提到的“1s1s1s1s1s”这种bug,
2021-04-15 22:08:16
312
原创 [2021 icpc昆明] M.Stone Games 主席树
题目链接:M.Stone Games题解题目大意是求区间里任意数加和形成的集合中的mex值。mex值是集合中第一个未出现的整数。假设当前区间为al,al+1,..,ar{a_l,a_{l+1},..,a_r}al,al+1,..,ar,可以合成范围为[1,x] 。显然x=∑i=li=rai{\sum_{i=l}^{i=r} a_i}∑i=li=rai对于剩余未参与合成的数范围为[1,x+1]的一些数,总和为sum,若参与合成,则合成范围会扩大为[1,x+sum]。我们可以用主席树维护一
2021-04-14 23:09:55
319
原创 [ACwing] 256. 最大异或和 (可持久化数据结构)
题目链接:256. 最大异或和题解可持久化Trie树,评测机貌似不稳定,T了的代码再交一次就过了?代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<
2021-04-12 20:14:01
188
原创 [2018-2019 ACM-ICPC, Asia East Continent Finals] F. Interstellar … Fantasy (计算几何)
题目链接:F. Interstellar … Fantasy题解题目大意是在一个三维坐标内,给你两个点,两个点之间可能有一个球状的障碍物阻挡,你只能在球表面或者球外行走,问这两个点的最短距离。给的两个点不会出现在球内部。本题的关键是最短路径的最优策略是如何走,本题可以转化成二维求解,圆心及两点能将障碍球切成一个大圆面,其实就是求两点不穿过圆在平面上的最短距离。在这里插入图片描述...
2021-04-11 22:06:05
233
原创 [Codeforces Round #713 (Div. 3)] G. Short Task (预处理打表)
题目链接:G. Short Task题解用nlogn的办法可以筛出1e7内所有的因子和,然后保存第一次出现该因子和的数,如果存在则输出否则输出-1.代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include
2021-04-11 21:36:29
1500
9
原创 [2019 ICPC Asia-East Continent Final] M. Value 状压+搜索
题目链接:M. Value题解本题如果直接暴力肯定会T。但是如果将整个序列分组再搜索,那么时间复杂度就会大大减少。按 xk{x^k}xk (k≥1) 分为一组例如 2,3,5,6,7,10。。作为每一组的开头,组内的元素就是开头的k次幂。很显然每一组的大小最多不超过log21e9{log_2^{1e9}}log21e9,暴力搜索每组每个元素是否被选取即可。代码#include<iostream>#include<algorithm>#include<cst
2021-04-10 17:58:20
239
原创 [Codeforces Round #250 (Div. 1)] D. The Child and Sequence 线段树维护区间值以及单点更新
题目链接:D. The Child and Sequence题解本题的难点是取模。例如:x%i{x\%i}x%i如果i≤⌈x2⌉{i≤\lceil{\frac{x}{2}} \rceil}i≤⌈2x⌉,那么余数必定小于除数⌈x2⌉{\lceil{\frac{x}{2}} \rceil}⌈2x⌉如果x≥i>⌈x2⌉{x≥i> \lceil{\frac{x}{2}} \rceil}x≥i>⌈2x⌉,那么余数为x-i仍然小于⌈x2⌉{\lceil{\frac{x}{2}} \r
2021-04-10 12:11:06
123
原创 [CF600] E. Lomsat gelral ( 经典树上启发式合并 dus on tree )
题目链接:E. Lomsat gelral题解经典树上启发式合并的题目,按照正常暴力求时间复杂度为O(n2){O(n^2)}O(n2),很明显是有问题的。那么树上启发式合并是如何做的呢。先说一些前导知识重儿子/轻儿子求出每棵子树的大小,节点数最多的一个子树的根节点就是这个节点父节点的重儿子。轻儿子即是节点个数最少的子树的根节点。重边/轻边重边即是连接重儿子与其父亲的边。轻边即是连接轻儿子与其父亲的边。设轻儿子v、父亲节点f,由定义可推2*size(v)<size(f),易得从一
2021-04-07 21:46:59
280
原创 第 45 届ICPC亚洲区域赛(昆明) I. Mr. Main and Windmills (计算几何)
题目链接:I Mr. Main and Windmills题解题目有一句关键点,给的任意三个点不共线,所以我们可以将其它点与查询点连线交路线线段于各个点(没有交上的点排除在外),将交于路线线段按起始终点位置排序,找第k个即可,没有则输出-1。(题目来源于生活,想起坐高铁时看到电线杆的移动情况,本题自然而然的就好理解了)代码#include<iostream>#include<algorithm>#include<cstdio>#include<cst
2021-04-04 15:20:51
919
1
原创 [leetcode] 115. 不同的子序列(dp入门)
题目链接:115. 不同的子序列题解n=len(s),m=len(t)定义dp[i][j]:字符串(s[i]~s[n-1]) 的子字符串中与字符串t[j]~t[m-1]匹配的个数。初始化dp[i][m]:字符串t从0开始,所以t[m]为空,任意字符串的子字符串都能与空串匹配,即dp[i][m]=1dp[n][i]:同理,空串不与非空字符串t匹配,所以dp[n][i]=0状态转移s[i]==s[j]:dp[i][j]=dp[i+1][j+1]+dp[i+1][j]s[i]!=s[j]:d
2021-03-22 20:29:41
146
原创 [第 45 届ICPC 南京] F.Fireworks (期望+三分)
题目链接:F.Fireworks题解放出完美烟花的最短时间——就是在第k次放烟花时就能得到完美烟花,那么设时间期望为f(k)得出f(k)=k∗n+m1−(1−p)k,(k为正整数){f(k)=\frac{k*n+m}{1-(1-p)^k}},(k为正整数)f(k)=1−(1−p)kk∗n+m,(k为正整数)现在可以将问题转化为求函数最小值。通过求一次导发现函数不单调,再次求导得出函数为单峰函数,那么对于单峰函数求极值可以通过三分得到。代码注意这里三分循环条件不是r>l,而是r>l
2021-03-22 19:49:06
189
原创 [leetcode] 712. 两个字符串的最小ASCII删除和 (dp入门)
题目链接:712. 两个字符串的最小ASCII删除和题解定义:dp[i][j]:s1[i]到结尾与s2[j]到结尾的两个字符串匹配所需删除最小ASCII码的和{dp[i][j]:s1[i]到结尾与s2[j]到结尾的两个字符串匹配所需删除最小ASCII码的和}dp[i][j]:s1[i]到结尾与s2[j]到结尾的两个字符串匹配所需删除最小ASCII码的和初始化:如果s1[i]到结尾的字符串(即i=len(s1))为空,那么dp[n][j]=(s2[j]到结尾字符串的所有字符ASCII的和),dp[i][
2021-03-19 23:16:08
139
原创 Acwing 2154. 梦幻布丁(启发式合并)
题目链接: 2154. 梦幻布丁题解启发式合并入门,将颜色种类少的合并到多的那一类,pla统计每种颜色的各个位置。有时候会出现要将颜色个数多的合并到小的,所以要交换颜色,因此本题用col来统计每个颜色的真实颜色。代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>
2021-03-15 11:55:22
305
1
原创 2021年度训练联盟热身训练赛第一场 A.Weird Flecks, But OK (最小覆盖圆)
题目链接: A.Weird Flecks, But OK题解从XOY、YOZ、XOZ三个面,寻找最小圆覆盖,只要满足存在一个面的点被圆覆盖即可,答案就是每个面的最小圆的最小值。代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 5010using namespace std;int n;
2021-03-13 21:08:50
151
原创 Educational Codeforces Round 104 (Rated for Div. 2) 题解
Educational Codeforces Round 104 (Rated for Div. 2)A. Arenaint a[maxn];int main(){ ios; int t; cin >> t; while (t--) { int n; cin >> n; int minn=inf; for(int i=1;i<=n;i++) { cin >> a[i]; minn=min(minn,a[i]);} int ans=
2021-03-04 22:23:21
415
2
原创 Codeforces Round #704 (Div. 2) 题解
Codeforces Round #704 (Div. 2)A. Three swimmersint main(){ ios; int t; cin >> t; while (t--) { ll p,a,b,c; cin >> p >> a >> b >> c; ll t1=p/a+(p%a==0?0:1); ll t2=p/b+(p%b==0?0:1); ll t3=p/c+(p%c==0?0:1); t1
2021-03-04 21:58:23
251
1
原创 Codeforces Round #702 (Div. 3) 题解
Codeforces Round #702 (Div. 3)A. Dense Arrayint a[maxn];int main(){ ios; int t; cin >> t; while (t--) { int n; cin >> n; for(int i=1;i<=n;i++) cin >> a[i]; int pre=a[1]; int ans=0; for(int i=2;i<=n;i++) { in
2021-03-04 21:37:18
529
1
原创 Educational Codeforces Round 105 (Rated for Div. 2) 题解
Educational Codeforces Round 105 (Rated for Div. 2)A. ABC String枚举ABC分别为“( ”和 “ )”的情况,然后判断是否为合法字符串。map<char,int> book;string tt="()";string s; bool judge(string ss){ int num=0; for(int i=0;i<ss.length();i++) { if(ss[i]=
2021-03-04 21:28:47
420
1
原创 Codeforces Round #698 (Div. 2) 题解
Codeforces Round #698 (Div. 2)A. Nezzar and Colorful Balls找数字出现次数最多的个数map<int,int> book;int a[maxn];int main(){ int t; cin >> t; while (t--) { book.clear(); int n; cin >> n; for(int i=1;i<=n;i++) { cin >> a[
2021-02-16 12:01:57
170
1
原创 Codeforces Round #693 (Div. 3) 题解
Codeforces Round #693 (Div. 3)A. Cards for Friends按照题目递归模拟即可int f(int a,int b){ if(a%2 && b%2) return 1; if(a%2==0) return 2*f(a/2,b); else return 2*f(a,b/2);}int main(){ int t; cin >> t; while(t--) { int w,h,n; cin >>
2021-01-26 19:42:03
137
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人