自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ACwing听课笔记

3个关键:1、状态表示 2、状态转移(集合划分)3、枚举所有状态

2020-12-23 22:40:41 98

原创 CF发病操作集锦

1、692 B fair number给定一个正整数n∈[1,1e18],如果n能够整除n的每一位,则称n为fair number发病操作:想当然的认为暴力不可做实际上:lcm(1,2,3,…,9) = 2520,最多只需要把低四位加到2520的倍数即可,暴力可做2、692 C. Peaceful Rooks给定一个n * n矩阵,m个点(m < n),点与点之间不能在同一行同一列,问多少次操作能将这m个点移到对角线上想到的:①:x != y --> ans++②:点与点之间若

2020-12-23 14:01:25 100

原创 Redis跳表C++代码分析:,插入,删除

跳表的定义:如上图结构zskiplistNode所示,每个节点有一个对应的层级每个层级又会指向该层的后继,span是该节点和对应后继的距离,这个层级是随机赋予的,从概率上来说,上一层节点数是下一层节点数的1/p个,这就使得跳表能够形成近似于平衡p叉搜索树的结构。插入:函数zslInsert:zskiplistNode *update[ZSKIPLIST_MAXLEVEL],是被插入节点的前驱节点的记录;unsigned long rank[ZSKIPLIST_MAXLEVEL],是被插入节点的前

2022-04-07 16:01:23 1504

原创 树的直径专题

https://www.luogu.com.cn/problem/CF734E

2021-12-01 10:43:27 101

原创 LCA专题训练

CF1328E Tree Queries 题目链接对节点高度进行排序,检查前后两个节点,如果高度相同,他们应该拥有相同的爸爸,如果高度不同,高的那个爬一步,然后低的那个爬到和高的一样的高度,看是否是同一个点。#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,

2021-11-30 22:32:33 533

原创 Codeforces Round #757 (Div. 2) E. Divan and a Cottage

首先可以观察到一个性质:对与两个不同的起始温度t1和t2(t1 < t2),不管怎么变化温度,最终变化得到的温度T1和T2有T1 <= T2,容易想到维护一个关于起始温度的线段树,进行区间更新和单点查询。考虑到起始温度范围较大,故使用动态开点的方式进行处理:#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC targ

2021-11-29 19:44:30 316 1

原创 Codeforces 113C - Double Happiness欧拉筛 + 费马二定理

使用bitset筛,可以承受3e8 + 5每个合数都被其最小素数因子筛掉,故时间复杂度为O(n)费马二定理:所有素数可以表示为4k + 1,4k + 3(2除外),表示为4k + 1的数可以被表示为a^2 + b ^2#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3

2021-11-09 20:12:29 76

原创 Codeforces 191C C. Fools and Roads [倍增求lca +树上差分]

求lca步骤:1、dfs求每个节点的父亲和深度2、dp3、求lcavoid init_dep(int u,int pre){ dp[u][0] = pre; for(int i = head[u];i != -1;i = e[i].nxt){ int v = e[i].v; if(v == pre)continue; dep[v] = dep[u] + 1; init_dep(v,u); } }void init_dp(){ for(int i = 1;i <= 2

2021-11-07 16:19:08 164

原创 CF212E IT Restaurants

考虑删除每一个点之后,对所有相连的支干大小进行背包#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x) cout<<#x<<" is "&lt

2021-11-06 12:41:55 93

原创 cf round 751 D.Frog Traveller(bfs剪枝和线段树优化建图做法)

#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x) cout<<#x<<" is "<<x<<endl#define

2021-10-27 16:44:21 99

原创 [线段树优化建图|dijkstra]Codeforces Round #406 (Div. 2) D. Legacy

总体思想是,使用线段树思想,用点和区间进行连边,只有当一个区间已经是最小值时才更新该区间内所有的点;具体思路参照这里:洛谷代码实现:#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#defin

2021-10-27 11:15:22 76

原创 Codeforces Educational Round #66 (Rated for div.2) E. Minimal Segment Cover

最小区间覆盖,当只有一次询问时就是一个贪心问题,按左区间排序,每次选择左端点在已经覆盖的点 + 1中,右端点能覆盖的最远的点;当有m个询问时,考虑使用倍增的方式求解(类似于二分查找):dp[i][j]表示从位置i起,选择2j个区间能到达的最远位置如果在i这个位置取2j个能到>=r的地方,我们当然希望能找到一个小于等于2j个区间使得能够覆盖到r点,所以选取区间不断逼近r但不超过r,最后一次要检查一步能不能从当前l到r,故输出ans + 1#include<bits/stdc++.h>

2021-10-23 17:10:28 50

原创 codeforces round#748 div3 F. Red-Black Number

n,a,b <= 40 考虑4维dpdp[i][j][k][l]状态表示,数字取到第i位,红色取了l个且组成的数字%a == j,黑色去了(n-l)个且组成数字%b == k,这样一个方案是否可行转移就是对当前数字分别取红色和黑色:取红色的话:dp[i + 1][(j * 10 + x[i])%a][k][l + 1]方案将变得可行取黑色的话:dp[i + 1][j][(k * 10 + x[i])][l]方案将变得可行最后看dp[n][0][0][?]方案是否可行,选择差距最小的进行输出即

2021-10-15 18:05:04 104

原创 Codeforces Round #745 (Div. 2) E. Train Maintenance

Codeforces Round #745 (Div. 2) E. Train Maintenance补一下这道题,本来以为线段树魔改,结果好像不是,还是自己太菜了,代码主要参考官方solution,然而他的tutorial写的我不太能接受,看完代码还是选择用我自己的方式来解释一遍~题目大意:有n辆车,m天,每辆车干x天休息y天,每天可以选择一种操作:操作1:将第k辆车挑出来,开始工作操作2:第k辆车退休每天都询问当天有多少辆车在休息。考虑最朴素的做法,对每个休息区间进行更新,使用差分数组进行维

2021-10-01 22:25:27 329

原创 codeforces Educational Codeforces Round 55 (Rated for Div. 2) G. Petya and Graph

最大流最小割问题,首先学习最大流Dinic算法,注释中解释了dinic应该注意的点,其实本质上就是通过不断求增广路径来达到增加流量的目的,dinic主要思想就是先bfs分层,后dfs求增广路,复杂度为O(V^2E),代码用来过luogu例题P3376如下:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int Edge_cnt = 10000 + 5;//由于要存正向和反向,边数量开成两倍 c

2021-09-26 19:42:53 68

原创 [2021-9-23]补题记录

Educational Codeforces Round 54 (Rated for Div. 2)E. Vasya and a Tree题目大意:给定一棵以1为根节点的树,每个节点值为0,给定若干修改,x,d,v,为x节点及其dist(x,y)<=d的子节点y,值加上v,最后输出各节点的值;解法:离线修改,使用树状数组在树上对深度进行差分,记得回溯时修改回来,避免这条子路径对另一条子路径产生影响。#include<bits/stdc++.h>#define pb push_bac

2021-09-23 16:23:47 79

原创 [2021-9-8补题]codeforces round 704E,693F

#include<bits/stdc++.h>using namespace std;typedef long long ll;#define mp make_pair#define se second#define fi first#define pb push_back#define debug(x) cout << #x << " is " << x << endl vector<vector<int> &.

2021-09-18 15:04:52 67

原创 [补题]Technocup 2021 Elimination Round 3 and Round #692 D grim zoo

题目大意:字符串由0,1,?三种字符组成,每个子序列01产生x价值,每个子序列10产生y价值,?要替换成1或者0,问产生最小价值为多少?关键:当0和1的数量确定的时候,cnt(00)和cnt(11)是固定的, 而cnt(01) + cnt(10) = total_cnt - cnt(00) - cnt(11)此时也是固定的,因此,当x > y 时希望10数量越多越好,01数量越少越好,对于固定的01数量,1越放前面越好,因此,不妨先令所有问号为0,计算此时总的价值,然后从前往后置问号为1每一步取一

2021-09-17 11:12:37 1808

原创 [算法竞赛入门经典]数论刷题专栏

例题10-2 不爽的裁判(Disgruntled Judge, NWERC 2008, UVa12169)有个裁判出的题太难,总是没人做,所以他很不爽。有一次他终于忍不住了,心 想:“反正我的题没人做,我干嘛要费那么多心思出题?不如就输入一个随机数,输出一个 随机数吧。”于是他找了3个整数x1、a和b,然后按照递推公式xi=(axi-1+b) mod 10001计算出了一个长 度为2T的数列,其中T是测试数据的组数。然后,他把T和x1, x3,…, x2T-1写到输入文件中,x2, x4,…, x2T写

2020-12-30 11:38:55 101

原创 Codeforces Educational Round 100 A~E解题报告

A、#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x) cout<<#x<<" is "<<x<<endl#def

2020-12-18 22:21:00 199 1

原创 Codeforces round 690 解题报告

A、前后前后输出一下#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x) cout<<#x<<" is "<<x<<e

2020-12-16 20:53:24 73

原创 树上差分注意点

1.点上记录值为相对于子节点的差分,子树差分和为根的和2.求LCA有多种算法,选择其中一种倍增算法#include<bits/stdc++.h>#define pb push_backconst int N = 1e6 + 5;using namespace std;typedef long long ll;#define debug(x) cout<<#x<<" is "<<x<<endl#define eprintf(...)

2020-12-14 22:31:47 46

原创 Codeforces Round #689 (Div. 2, based on Zed Code Competition)解题报告

a.#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x) cout<<#x<<" is "<<x<<endl#def

2020-12-12 01:14:57 434

原创 codeforces round 686解题报告

a.输出一个数组它的a[i] != i,有两种思路,逆序输出然后交换中间位置,另一种是直接输出i = i%n + 1#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x

2020-11-30 15:47:00 124

原创 Codeforces Round #685 (Div. 2) 赛后题解

这场昨晚没打,早上补的,错过了一场上分场a.1,2,3特殊处理,其他奇数和偶数下降次数分别为2,3#include<bits/stdc++.h>#pragma comment(linker, "/stack:200000000")#pragma GCC optimize("Ofast")#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#define debug(x) cout&l

2020-11-22 14:04:48 137

原创 Codeforces Round #683 (Div. 2, by Meet IT) A~E题解

这场开心也不开心:开心:上蓝了不开心:明明可以把E写出来的QAQ,主要前面在梦游,最后十几分钟相处方案已经来不及了A.傻逼题不解释,把每个数都加到(1 + n) * n /2 就行#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#define fi first#define se second#define pb push_back#define m

2020-11-16 11:00:46 373

原创 Q-learning训练过程

训练下面的伪代码说明了我们如何训练,来得到一个尽量完美的Q表格。初始化 Q = {};while Q 未收敛: 初始化小鸟的位置S,开始新一轮游戏 while S != 死亡状态: 使用策略π,获得动作a=π(S) 使用动作a进行游戏,获得小鸟的新位置S',与奖励R(S,a) Q[S,A] ← (1-α)*Q[S,A] + α*(R(S,a) + γ* max Q[S',a]) // 更新Q S ← S'其中有些值得

2020-11-14 13:13:42 671

原创 P1171 售货员的难题 货郎担问题 | Uva10817 校长的烦恼

#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl using namespace std;const int N = 25;const int INF = 0x3f3f3f3f;int dist[N][N];int dp[N][1<<21];int main(){ int n; cin>>n; for(int i = 0;i

2020-11-10 11:39:55 154

原创 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) D - Extreme Subtraction

思路:对每个点尽量从左边减,算从右边最少的减的次数,如果这个次数超过a[i]则非法 #include<bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se second #define p_q priority_queue #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).re

2020-11-03 17:35:56 234

原创 Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)A~D

A#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#define fi first#define se second#define pb push_back#define mp make_pair#define DBG 0const int N = 1e5 + 5;typedef long long ll;const int INF = 0x3f3

2020-11-02 11:00:29 1988 7

原创 [树形DP | Uva 1218]Perfect Service

dp[i][0]表示以i为根的且i被选为服务器的最小服务器数dp[i][1]表示以i为根且i不被选为服务器,而i父亲为服务器的最小服务器数dp[i][2]表示以i为根且i不被选为服务器,而i父亲也不被选为服务器的最小服务器数dp[i][0] = Sum(max(dp[j][0],dp[j][1]) + 1dp[i][1] = Sum(dp[j][2])dp[i][2] = min(dp[i][1] - dp[j][2] + dp[j][0])#include<bits/stdc++.h&g

2020-11-01 00:46:25 86

原创 Uva1220 12186树形DP

uva 12186:学会用c = (k * T + 100 - 1) / 100 向上取整了,解释一下:如果k * T 能够整除100则 + 99/100不影响结果,同时如果(k * T % 100 != 0) 肯定∈[1,99]加上 99 则∈[100,198] 他们/100 都等于1,就产生了进一的效果。#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#

2020-10-31 12:25:42 106

原创 [DP]UVa 10003 Cutting Sticks

记忆化搜索#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#define fi first#define se second#define pb push_back#define mp make_pair#define DBG 0//const int N = 1e5 + 5;typedef long long ll;const int INF =

2020-10-30 15:33:13 79

原创 Uva1625 -Color Length(DP)

#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#define fi first#define se second#define pb push_back#define mp make_pair#define DBG 0const int N = 5000 + 5;typedef long long ll;const int INF = 0x3f3f

2020-10-29 19:50:45 70

原创 记忆化搜索求DAG最长路

经典问题:嵌套矩形问题#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#define fi first#define se second#define pb push_back#define mp make_pair#define DBG 0const int N = 1000 + 5;typedef long long ll;const int

2020-10-26 21:26:59 113

原创 [最短路]Codeforces round677div3 G. Reducing Delivery Cost

使用dijkstra算法可以在n^2logm 时间复杂度内计算出任意两点之间的最短路径,这题关键在于枚举每条边(a,b)使其免费,每个路径的start到end的最小值,因为使一条边免费最短路可能发生变化,其应该为:#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define fi first#define se secondtypedef long long ll; using namespace s

2020-10-21 22:07:33 155 1

原创 codeforces round 627 div3 [树上dp]F. Maximum White Subtree

#include<iostream>#include<vector>#define pb push_back using namespace std;const int N = 2e5 + 5;vector<int> g[N];int dp[N],a[N];const int INF = 0x3f3f3f3f;int dfs(int u,int pre){ int ans = (a[u] == 1)?1 : -1; for(unsigned in.

2020-10-15 10:31:02 72

原创 Codeforcs educational round 96 [逆序对]E. String Reversal

交换相邻位置首先想到的是逆序对!回想冒泡排序,交换次数 = 逆序对 的个数原字符串的位置可以看作一个有序序列,如a a a z a1 2 3 4 5反转之后的序列为:a z a a a对每个位置应该选择原串更靠前的位置,这样对逆序对的贡献最小故应该为:1 4 2 3 5将问题转化为求逆序对的个数!#include<iostream>#include<vector>#define pb push_backtypedef long long ll; using

2020-10-13 13:48:19 110

原创 educational round 96 D.String Deletion

把所有区间长度都筛选出来,对1~k个区间如果区间长度为1,找最近的一个区间长度>1的区间删点,如果不存在说明后续都是长度为1的区间直接ans += (k - i +1) /2否则 ans++,对应区间长度减一,使用set解这个问题#include<bits/stdc++.h>#define debug(x) cout<<#x<<" is "<<x<<endl#define fi first#define se second#de

2020-10-12 18:30:11 95

原创 Codeforces Round #673 (Div. 2)[字典树]E.xor inverse

code:#include<iostream>using namespace std;const int N = 3e5 + 5;typedef long long ll;int trie[N * 30][2];int count = 0;ll sz[N * 30]={0};ll dp[35][2]={0};void insert(int x){ int root = 0; for(int i = 30;i >= 0;i--){ int j =(x>&g.

2020-10-11 11:33:21 86

空空如也

空空如也

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

TA关注的人

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