![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
题解
基础
Henry_WYH
兴趣使然
展开
-
2019-2020 ICPC Asia Hong Kong Regional Contest
比较典型的数位DP,一开始像用和和平方和来凑出要求的式子。记录一个已构造数字和与当前情况下题目中那个式子关于m的模数,即。110 001之类的类型并不改变0和1数量之间的关系,只有000和111改变。所以找到所有能删掉的0或者1,然后看是否能将二者数量删的一样多。给定一棵树,双方轮流玩游戏,每次可以移除一棵完全二叉树子树。表示构造到i为已构造数字和模m为j,当前构造的题干式子模m为k的方案数。对于i位置,对所有比a[i]大的置为1,否则置为0.进制相关,就是他是用10-k~10来代替对应的进制。原创 2022-10-12 22:10:54 · 840 阅读 · 0 评论 -
Codeforces Round #767 (Div. 2) A~E
Codeforces Round #767 (Div. 2) A~EA Download More RAM大意是你一开始有 m G内存,每次你可以使用不超过你内存的RAM来升级你的内存,第i个扩充内存b[i].思路:直接贪心即可,每次都选最小的来升级。void solve(){ n=read();m=read(); rep(i,1,n) a[i].x=read(),a[i].y=i; rep(i,1,n) b[i]=read(); sort(a+1,a+1+n); for(int i=原创 2022-01-24 22:38:15 · 401 阅读 · 0 评论 -
炸鸡块君与FIFA22
https://ac.nowcoder.com/acm/contest/23106/B处理多个区间询问而且没有修改操作,RMQ直接用上。定义st[k][i][j]表示价值为k的从i到i+2^j-1这一段区间内的价值变化。由递推公式st[k][i][j]=st[k][i][j-1]+st[(k+st[k][i][j-1])%3][i][j-1]得到,然后得到答案的方式就是RMQ的二进制拼凑const int N = 200210;int st[3][N][21]; //st[k][i][j]表示初原创 2022-01-24 22:43:01 · 202 阅读 · 0 评论 -
Codeforces Round #764 (Div. 3) F. Interacdive Problem
F题已经给了范围了,因此直接二分就行了,但是本题二分的值一直会变,因此只需要记录一个累加值,然后每次二分n-x,最后得到最终答案加上累加值就行了int n,last=0,sum=0;int ans[11];int read(){ int n; cin >> n; return n;}void print(int x,int k){ if(k) cout << "+ " << x << endl; else cout << "原创 2022-01-11 01:05:04 · 351 阅读 · 0 评论 -
Educational Codeforces Round 118 (Rated for Div. 2) E - Crazy Robot
非常好些的BFS,注意一点是通过已知可以的点来扩展到未知但是可以的点const int mod = 998244353,N=1e6+5;int n,m;int row,col,sx,sy;vector<char> g[N];map<pii,bool> vis;int mov[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};queue<pii> Q;bool check(pii poi){ int x = poi.x, y = poi原创 2021-12-02 18:23:05 · 270 阅读 · 0 评论 -
easy&hard D. Divan and Kostomuksha
https://codeforces.com/contest/1614/problem/D1https://codeforces.com/contest/1614/problem/D2const int M = 20000000,N = 20010000, tot = M;LL gcd(LL a,LL b){return b ? gcd(b,a%b) : a;}LL n, m, x,prime[N/5],idx=0;bool numlist[N];void Eular(){ for(in原创 2021-11-30 20:22:50 · 301 阅读 · 0 评论 -
Codeforces 757 C. Divan and bitwise operations 解题报告
这道题当时在比赛的时候瞎搞搞出来了,后面复盘的时候发现其实思维更高的一个层次可以省下很多代码量。首先声明,全子集异或和这个结论我事先是不知道的。然后我就想着要把这个序列给构造出来。常规思路:按位思考对于每一个l,r,k,我开一个数字组cnt[i][j]表示第i个数二进制位j位置上是0还是1.然后对于每一个l,r的或为k,如果k的第j位有1则利用差分的思想cnt[l][j]+=1,cnt[r+1][j]-=1;如果k的第j位没有1,则说明无论如何这里都不能有1,因此为了防止差分之后前缀和的+的效果.原创 2021-11-26 23:16:43 · 594 阅读 · 0 评论 -
根据给定key和val值构建Treap
根据给定key和value求Treap的方法:先按照key排序int top = 0;rep(i,1,n){ while(top && tr[s[top]].b < tr[i].b){ l[tr[i].id] = tr[s[top]].id; top --; } if(top) r[tr[s[top]].id] = tr[i].id; s[++top] = i;}武汉理工大学校赛https://a原创 2021-11-21 18:17:09 · 183 阅读 · 0 评论 -
ABC 228 D - Linear Probing并查集
为了快速获得x位置之后第一个为-1的数,考虑使用并查集,连通当前点和下一个点的最前面点#define int long longconst int tot = 1<<20;int ans[tot+10];int n, m, q, t, x;int fa[tot+10];void init(){ rep(i,0,tot) fa[i] = i,ans[i] = -1;}int find(int x){ return x == fa[x] ? fa[x] : fa[x] = .原创 2021-11-20 22:50:00 · 384 阅读 · 0 评论 -
POJ Maximum sum
输入1101 -1 2 2 3 -3 4 -4 5 -5输出13这是一道最大子段和的变形,状态方程设计的非常巧妙,我们先仿照最大子段和f[i]表示以i结尾的最大字段和F[i]表示i位置及以前(可以不包括i)的最大子段和g[i] 表示以i开头的最大字段和 G{i]表示i位置及以后(可以不包括i)的最大子段和有状态转移:f[i]=a[i]+max(0,f[i−1])f[i] = a[i] + max(0,f[i-1])f[i]=a[i]+max(0,f[i−1])F[i]=m.原创 2021-11-18 19:06:21 · 194 阅读 · 0 评论 -
P1640[SCOI] 连续攻击游戏
https://www.luogu.com.cn/problem/P1640两种做法:【1】我们可以发现老套路,这种一个物体连接两个结点的一般是物体做边连接两个点来构成一张图。然后我们从1开始选择,每选择一个就删去一条边。记住如果当前图上有环的话,可以多选一条边。至于怎么维护这个关系,带权并查集就很简单细节看代码 DSU()函数【2】数据10000,KM二分图的最大匹配可以尝试做一做。第i件物品连接u和v数字,然后从1开始做最大匹配,直到第一次不能匹配位置,有点像关押罪犯那道题。记住KM一开原创 2021-11-11 17:38:41 · 2848 阅读 · 0 评论 -
男人八题 硬币 Coins
第一眼看这道题,直接上单调队列优化,但是超时了!O(nm)的算法,只是因为常数太大了…//超时算法,单调队列优化#include<bits/stdc++.h>using namespace std;const int M = 100010;typedef long long LL;#define rep(i,ll,rr) for(int i=ll;i<=rr;++i)LL n,m,a[110],ss[110],d[M],idx=0;LL f[M],g[M],q[M];.原创 2021-11-11 00:12:52 · 227 阅读 · 0 评论 -
ABC 226 Contest E - Just one 解题报告
两种做法,dsu并查集或者dfs深搜关键是找环,细节看注释#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;//================================#define debug(a) cout << #a": " << a << endl;#defi原创 2021-11-08 00:22:09 · 184 阅读 · 0 评论 -
Minimal Ratio Tree 最小比率生成树
Minimal Ratio Tree 最小比率生成树嗯,一道08年北京区域赛的题目,还是非常有意思的(这里的最小比率生成树和lyd书上的最小比率生成树题目稍微有点不同)下面简单说一下思路:由于数据范围比较小,因此我们可以枚举所有可能的节点组成(可以直接写一个深搜或者二进制枚举,都行的)然后都求一遍最小生成树与节点之和比一下即可。由于这里是通过一个结点开始向外扩展,因此推荐使用prim算法,我还特意改了一下板子…double eps = 1e-9;int n,m,node[N],g[N][N]原创 2021-11-06 17:52:19 · 235 阅读 · 0 评论 -
NC 神奇盘子
链接:https://ac.nowcoder.com/acm/contest/22353/U题目描述 有一个神奇的盘子,形状为圆形。盘子上面爬着一个大象(视作一个点)。由于现实的扭曲,当大象在盘子某个直径的一端的时候,可以瞬间传送至直径的另一端。现在大象想去盘子上另外一点,问他最少需要移动多少距离。传送不计距离。输入描述:第一行一个整数r(1 <= r <= 1000)代表盘子的半径。接下来两行两个整点分别代表大象所在的位置和大象目标的位置坐标。保证两个点都在圆内(可能在边界上),圆原创 2021-11-01 22:06:49 · 179 阅读 · 0 评论 -
UNICORN Programming Contest 2021(AtCoder Beginner Contest 225) D - Play Train
类似于并查集一个ne数组一个pre数组,不能按秩合并或者路径压缩#include<unordered_set>#include<unordered_map>#include<functional>#include<algorithm>#include<string.h>#include<iostream>#include<iterator>#include<cstring>#include<原创 2021-10-31 00:50:40 · 190 阅读 · 0 评论 -
Abracadabra 子串匹配 、 分治
https://codeforces.com/contest/161/problem/C#include<unordered_set>#include<unordered_map>#include<functional>#include<algorithm>#include<string.h>#include<iostream>#include<iterator>#include<cstring>原创 2021-10-26 18:53:06 · 117 阅读 · 0 评论 -
D - Restricted Permutation
今天状态不好,D都差点没有出,发一下,警示一下https://atcoder.jp/contests/abc223/tasks/abc223_d拓扑序+字典序限制要想到小根堆替换队列#include<unordered_set>#include<unordered_map>#include<functional>#include<algorithm>#include<string.h>#include<iostream>原创 2021-10-17 22:08:19 · 137 阅读 · 0 评论 -
NC 蓝魔法师
链接:https://ac.nowcoder.com/acm/problem/20811来源:牛客网题目描述“你,你认错人了。我真的,真的不是食人魔。”–蓝魔法师给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一条边在一个方案中被删除,而在另一个方案中未被删除,答案对998244353取模输入描述:第一行两个整数n,k, 表示点数和限制2 <= n <= 2000, 1 <= k <= 2000接下来n-1行,每行包括两个原创 2021-10-05 12:29:04 · 80 阅读 · 0 评论 -
AtCoder Beginner Contest 221 E - LEQ
算是学到了树状数组一种新的打开方式比赛的时候还在想怎么支持查找某个数,然后可以直接求幂和对于某个算出他和前面所有小于他的数的距离为k,然后快速求出2^k之和;显然是用树状数组:每次插入的时候并不是在对应位置+1,而是加一个逆元的i次幂,然后每次查询都将求得的结果乘上当前位置的2的幂即可∑2j−i−1=∑2j−1/2i\sum 2^{j-i-1}=\sum 2^{j-1}/2^{i}∑2j−i−1=∑2j−1/2i#include<unordered_set>#include<.原创 2021-10-02 23:42:25 · 148 阅读 · 0 评论 -
cf744 div3 G Minimal Coverage
大意是有之前拜访的直线的端点当作起始点摆放,要求最小的覆盖并集长度状态标识:f[i][k]表示前i个直线能摆放的,当前距离最左边曾到过的端点为参照系的距离为k ,的所有方案总的覆盖并集长度的最小值有状态转移方程://2000是所能保证的最差情况的最优解,鉴于ai<=1000;此状态表示如果向右摆放所能得到的总长度最小值if(k+a[i]<=2000) f[i][k+a[i]]=min(f[i][k+a[i]],max(f[i-1][k],k+a[i]));//表示向左摆放,如果.原创 2021-10-02 16:48:55 · 132 阅读 · 0 评论 -
DP中的实际意义: NC17621 管道取珠 NC210732 灯谜
这道题直接要求ai^2,但是我们呢不可能把所有ai都求出来然后求和,因此我们需要换个角度切入这里的ai^2 是有实际意义的:ai ^2表示两个一摸一样的装置一起取珠子,取得的结果完全一样的方案数。因此我们可以设出状态标识:f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示第一个装置上面取到第i个,下面取到第j个,第二个装置上面取到第k个,下面取到第l个的方案数当一上,一下分别等于二上二下的时候对应四种状态转移方程但是由于数据范围,开思维远超内存,因此我们可以压缩掉一..原创 2021-10-02 09:58:55 · 109 阅读 · 0 评论 -
Codeforces Round #744 div3 E-2 Array Optimization by Deque
https://codeforces.com/contest/1579/problem/E2终于补完题辣。。。这道题当时脑抽了一下,没搞出来。首先,还是双端队列插头插尾的问题,但是要求的是逆序对最小。这里也有一个小结论,就是我们按照贪心的思路插,每次选择逆序对较小的插法:插前or插后先对整体离散化,然后用树状数组维护每个位置出现的个数,插前插后取最小的即可:int tr[N],n,m,T;vector<int> a,b;int lowbit(int x){ return x&原创 2021-10-01 15:37:16 · 78 阅读 · 0 评论 -
Codeforces #745 div2 C. Portal
补完这道C题感觉收益匪浅啊…也学习到了优化n^4前缀和的技巧,感觉和之先做过的多维背包DP很类似:首先把行,列,和整个的前缀和预处理出来然后封装函数calc计算固定上界和下界时,某一列中符合要求的数量,如列y:然后写一个计算如图形状中,需要反转的数量的计算函数get;变成像一个汉堡一样,上界下界全是1,中间全是0的如图形状需要反转的次数然后我们就可以开始分析了;我们列出当确定上界up,下界dw,右界i的时候,(这些靠枚举),如何求得符合要求的传送门?借助我们之先封装好的两个函数,有:g.原创 2021-10-01 10:58:19 · 172 阅读 · 0 评论 -
Codeforces Round #735 (Div. 2) 1554D - Diane构造题
是一道考察思维的构造题为了不让任何子串出现偶数次,所以要避对称,因此比较好想的结构就是破坏对称结构的:如果n是偶数,则答案是a...(n/2个a)...aba...(n/2−1个a)...aa...(n/2个a)...aba...(n/2-1个a)...aa...(n/2个a)...aba...(n/2−1个a)...a如果n是奇数,则答案是a...(n/2个a)...abca...(n/2−2个a)...aa...(n/2个a)...abca...(n/2-2个a)...aa...(n.原创 2021-09-13 14:24:04 · 89 阅读 · 0 评论 -
Educational Codeforces Round 113 - C. Jury Meeting
只要保证最大的数后面有至少一个比他小1的数即可如果最大数比次大数大的超过1就是0,最大数有多个就是直接n的阶乘对于”保证最大的数后面有至少一个比他小1的数“可以这样算:我反向考虑,总情况减去比最大数小1的所有数都在最大数之前即可#include<unordered_set>#include<unordered_map>#include<algorithm>#include<string.h>#include<iostream>#.原创 2021-09-09 00:36:54 · 198 阅读 · 0 评论 -
Full Tank?
链接:https://ac.nowcoder.com/acm/problem/51026After going through the receipts from your car trip through Europe this summer, you realised that the gas prices varied between the cities you visited. Maybe you could have saved some money if you were a bit mo原创 2021-09-07 19:00:31 · 273 阅读 · 0 评论 -
Codeforces Round #742 - Div2 - C. Carrying Conundrum
样例:INPUT:5100128202110000OUTPUT:9474499这道题由于偶数位和奇数位独立,所以这个数奇偶位分拆之后进行操作即可假设奇数位组成的数是x,偶数位为y,则答案是(x+1)(y+1)-2;对于x或者y是0的情况特判一下即可#include<bits/stdc++.h>using namespace std;#define int long long int T;string n;//==================.原创 2021-09-06 01:32:48 · 194 阅读 · 1 评论 -
2021百度之星Astar 1006毒瘤数据结构
Astar 1006毒瘤数据结构只需要每次加入的时候维护一下最前面从1开始连续的1的个数即可,用时:9min#include<iostream>#include<algorithm>#include<cstring>#include<string.h>#include<cstdio>#define MAXN 5000010using namespace std; int a[MAXN];int n;int op,pos;原创 2021-07-31 17:18:10 · 334 阅读 · 2 评论 -
7.31百度之星初赛一1008模拟猎人杀
7.31百度之星初赛一1008模拟猎人杀#include<bits/stdc++.h>>#define MAXN 55using namespace std; int T,n;int p_num,w_num,wolf_id;int die[MAXN]; //每个人是否存huoint lst[MAXN][MAXN]; //每个人的名单inline void write(){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j原创 2021-07-31 16:49:03 · 137 阅读 · 0 评论 -
洛谷P1114 “非常男女”前缀和+双指针
# 前缀和+双指针这道题第一眼看,大概就知道可能和前缀和有关~前缀和可以清楚的表示男女之间连续的数量差的关系。**也正是因为要用前缀和,我们将女生的值定为-1,男生的值为1;然后我们使用结构体来存储每次输入的信息,结构体中一个值表示男女数,一个表示排序前的位置。然后对男女数量使用前缀和。这样寻找符合要求的区间的时候直接拍个序,再搜一下就好了。struct Place{ int num,pos;};有两种情况表示是符合要求的[l,r]区间。第一种:当l位置的前缀和的值和原创 2021-07-05 20:15:17 · 289 阅读 · 0 评论 -
C - Compressed Bracket Sequence
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std; typedef long long ll; inline int read() { int res=0,f=1;char ch; while(ch=getchar(),ch<'0'||ch>'9') if(ch=='-') f=-1; while(原创 2021-08-30 10:48:30 · 268 阅读 · 0 评论 -
牛客 矩阵 二维hash
今天做了一道二维字符串hash题,第一次做二维hash,水一篇题解题目的做法就是对正方形先进行列哈希然后再二分正方形的边长,直到二分出正方形的最大边长在检查函数中,每次需要处理出hs2[i,j]表示以j结尾的长度为x的列hash值,即将正方形的竖边hash然后再使用hs3[]存储每一行的hash值,再压缩成每一个正方形右下端点对应正方形的hash值,即square_hs[]。最后依次比对square_hs[]中的所有值。可以先排序,这样只要找到一组即返回true;#include<bits原创 2021-08-25 15:24:15 · 120 阅读 · 0 评论 -
牛客练习赛87 B
今天被一道题的题目意思坑了,以为是主席树,然后调了一年,特此发博客避坑链接:https://ac.nowcoder.com/acm/contest/11177/B来源:牛客网题目描述牛牛学会了可持久化线段树,于是他开始向牛妹炫耀。牛妹很不屑,那你能解决下面这道{k}k小数查询的问题吗:给出长度为n的序列a1,a2,...,an,有给出长度为n的序列{a_1,a_2,...,a_n},有给出长度为n的序列a1,a2,...,an,有多少对不同的整数对(l,r)(l≤r)满足r−l+1≥k多原创 2021-08-20 23:40:05 · 124 阅读 · 0 评论