自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 The 2023 ICPC Asia Nanjing Regional Contest (The 2nd Universal Cup. Stage 11: Nanjing)

容易发现f【i+1】>=f【i】,g【i】>=g【i+1】,有单调性,可以发现一定存在位置p,使得1到p min(f【i】,g【i】)取f【i】,p+1到n取g【i】,可以二分这个位置然后去判断f【i】和g【i】的大小就可以得出位置,然后原式变成f【1】+...f【p】+g【p+1】+...g【n】-sigma a【i】就是答案,这样是loglog的。就用sigma f【i】+sigma g【i】-n*max a【i】-sigma a【i】这个式子,难度在怎么维护f数组和g数组。

2024-09-12 15:51:36 473

原创 线段树优化建图模板

如果是区间x连向点y,就是区间x在入树划分出来的log个点连向y在出树的编号out_num【y】。如果是区间x连向区间y,就是new一个节点newnode,让区间x在入树划分的log个节点连向newnode,再让newnode连向区间y在出树划分的log个节点。入树是指从叶子节点连有向边连向根,出树是指从根连有向边连向叶子节点,他们的每条边权都是0.如果有一个节点newnode连向出树的一个节点,表示这个节点newnode可以连向出树该节点所管的所有节点;

2024-09-03 12:53:37 257

原创 博弈论总结

游戏有两个人参与,二者轮流做出决策,双方均知道游戏的完整信息;任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。

2024-08-24 21:42:18 1044

原创 Codeforces Round 967 (Div. 2) C题Guess The Tree

令1是根,我们可以一层一层的递推出去。容易知道询问a,b如果结果是c,那么c就是a,b路径上的中点。我们可以先让根1和其他n-1个点都询问一遍,如果返回值是1,那么这些点就是第二层,深度为2的点。我们发现一个c点会对应两层的深节点,比如一条链1 2 3 4,如果询问1 3和1 4返回都会是2,那么我们就让2和3 4分别连一条边,表示3和4是可能和2直接连边的。然后因为第二层我们已经推出来有哪些点了,再去遍历第二层与他们可能的点,然后就推出来第三层的点了。然后一直推下去,就结束了。

2024-08-23 19:26:40 249

原创 P3403 跳楼机 和 ARC084B Small Multiple 同余最短路

解决问题:1.给定n个整数,求这n个整数能拼出多少个其他整数(可以重复取)。2.给定n个整数,求这n个整数不能拼出的最大/最小整数。3.至少要拼几次才能拼出模k余p的数。类比差分约数,都是通过等式类比最短路,同余最短路状态转移通常是f(i+y)=f(i)+y。类似单源最短路:f(v)=f(u)+w(u,v)。建边就是add(i,(i+j)%x,j)。表示可以从i到i+j,但是i+j大于等于x的时候要取模,距离是j。对于x,一般取n个数里最小的数,剩余系最小。

2024-08-22 15:51:19 360

原创 The 2020 ICPC Asia Shenyang Regional Programming Contest F,D,I题

假如我们处理到i位置了,前面都已经是处理完合法的区间,现在第i+1位的数字比第i个数(因为前面都处理完了,那么第i个位置就是前i个位置的最大值),那么第i+1就要合并到第i个数所在的区间,但后面区间的最小值不一定就是在第i+1个位置,也可能在第j个位置,那么我们当前这个区间就得拓展到j位置,必须保证后面区间的最小值不比当前区间的最大值小才行。定理2证明:设存在a*t1=b ,a*t2=b,由于定理1,a与n互质,即t1=b,t2=b,又t1,t2属于【0,n-1】,所以t1=t2。内有且仅有唯一的解.

2024-08-20 00:54:29 1080

原创 两个dp题

D题:很容易贪心的想到alice一定是取所存不同数字里的最小值,bob就是想办法尽量多拿掉alice之后数字。这样问题就转化成有n种物品,每个物品有a【i】个,bob每次取空一个物品,或者不取,最后可以取得的最多物品数。这就可以看出来是背包问题,我们令dp【i】【j】表示前i个物品bob取j个物品的最小操作数。我们枚举每个物品,表示bob现在要清空这个物品。我们考虑bob什么情况下才可以在alice拿到第i个物品前拿完第i个物品。

2024-08-18 20:40:22 908

原创 EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) B,C题

容易发现a【i】<=a【i+1】的时候,一定最后结果是a【i+1】变成0的时候,a【i】=1,这时候答案就是+1.如果a【i】>a【i+1】的时候,花会在一开始就变低,最后状态仍然是>=a【i+1】的,最后结果是max(1,a【i】-sum)。我们选k个数+1操作,会产生k+1的花费,我们肯定贪心每次操作都选上所有需要+1的数,这样可以减少操作数。而每个数需要的+1数就等于a【i-1】-a【i】(加完要更新a【i】=a【i-1】),然后取个max的a【i-1】-a【i】就是操作数了。

2024-08-18 17:40:49 399

原创 F. Valuable Cards D. Smithing Skill

又因为每次铸造的base cost是a【i】,所以我们需要给每个a【i】-b【i】一个可选的前提条件,就是base cost大于等于a【i】时才可以选,我们可以在读入的时候每次更新f【a【i】】的值,f【a【i】】就表示从a【i】cost以上都可以使用这个最小值a【j】-b【j】。处理完每个cost的最优选择后,我们考虑dp。当cost大于1e6的时候,我们根据a【i】的范围可知cost一定可以使用f【1e6】的最优选择将cost降到1e6以下,然后直接输出之前算出来的dp值即可。

2024-08-17 15:36:14 378

原创 Codeforces Round 949 (Div. 2) C.D构造和E题

我们可以发现乘2+1如果出现在最后一位加的是1,出现在倒数第二位加的是2,也就是说,倒数第几次出现*2+1就会比全乘2的结果多出一次2的幂。比如1 -1 -1 -1 -1 -1 7. 容易想到1*2+1=3,3*2+1=7,那么剩下的三个位置我们可以先乘2再除以2,最后到r位置的时候仍然是7.也就是说对于一般情况下,我们可以先用前面的位置构造出r的值,然后再用多余的-1来循环乘除,就可以消掉多余的-1.同时容易发现,如果多余的-1是偶数(包括0),这样循环就有问题,所以合法情况的多余-1一定是奇数个。

2024-08-17 00:29:01 1040

原创 B. Turtle and an Infinite Sequence区间或和

我们令x为n%2^d, x就是11,如果n大于等于2^d(前提条件),且n可以减去x+1(也就是说让n变成1111,也就是从前面借位,让后面都是1,可以减去x+1表示左区间长度大于等于x+1),表示该为1可以从左区间获得,或者说该位的0就是左区间为1时进位得到的。区间或和有公式,如果求的是【l,r】区间或和,设x是l和r从高位到低位第一位二进制不同的位置,那么ans就是 l | ((1<<(x+1))-1) ,比如101111 和100111答案就是100111 | 1111。也可以去判断右区间。

2024-08-16 03:00:17 321

原创 D. Funny Game抽屉原理

我们反着想,将原来的第n-1次操作变为第一次选两个点,满足|a-b|可以整除n-1。因为可以整除n-1,所以|a-b|模n-1的余数应该是0,也就是说a模n-1的余数应该等于b模n-1的余数,这样就是合法点对。因为现在有n个点,然后n个点对n-1取模,根据抽屉原理,一定有两个数的余数相等,那么我们就取这两个数连接一条边,然后因为这两点已经连接一条边了,我们直接随便删一个点,那下一次操作就是n-1个点里找两个点模n-2的余数相等,根据抽屉原理,肯定存在。

2024-08-15 21:46:44 249

原创 cf题log的用法

所以幂次的话可以取log,第一题因为是乘上2的幂,底数2是固定的,也可以只用指数来表示2的幂。然后这两题就变得很简单了....给个第二题的代码(别人的)

2024-08-15 01:06:25 162

原创 线段树分治

利用线段树来划分区间。如果一条边只存在在【l,r】,那就用线段树区间修改,给这个区间都加上这条边,表示到这些时间点的时候这条边都存在。然后再加上可撤销并查集,等离开这个时间点的时候就删掉这个时间点上的边。如果在m条边里要删一条边,等价于从m个时间点选一个时间点,让该时间点不存在当前边,其他所有边都存在。

2024-08-09 14:41:50 267

原创 模拟退火的

体验乱调参数而看天意的奇特体验。

2024-08-09 01:42:58 153

原创 minimax维护前后缀概率和

【代码】minimax维护前后缀概率和。

2024-08-08 20:59:48 234

原创 middle区间最大中位数

对于那个不可行的每个点开一个线段树,我们是要记录比当前小或等于的数的位置为-1,比当前位置大的数的位置为1,也就是说我们需要先将序列排序,然后从小到大去插入信息,且插入的是他们的原数组下标,因为我们需要查找的是一个原数组区间里比当前值小的数个数。并且我们是从小到大插入的,也就是说到当前的数为止,前面将数置为-1的位置都是比当前数小的,也就是说是完全满足我们一开始的需求的,对于当前状态的线段树比自己小的数的位置都是-1,比自己大的数都是1.求左端点在【a,b】,右端点在【c,d】上的最大中位数序列。

2024-08-07 02:13:22 437

原创 更为厉害 主席树 线段树合并

对于第一种情况是一样的,对于第二种情况我们要利用dfs序的性质,我们容易知道一颗子树的dfs序是连续的,如果我们在dfs序上建立主席树,我们只要对这连续区间求和,就是整颗子树的信息之和了,如果a的dfn序是dfn【a】,那么a为根的子树序列就是dfn【a】到dfn【a】+siz【a】-1.我们对区间dfn【a】到dfn【a】+siz【a】-1主席树求和即可。第一种情况:b的dep就是min(k,dep【a】-1),表示dep【a】前面的k个祖先都可以选。分两种情况,b是a的祖先,b是a的儿子。

2024-08-06 22:04:56 405

原创 线段树合并板子

就是双指针一起遍历两个线段树,然后指定一个合并到另一个上,不开新点的话会覆盖原线段树的信息。

2024-08-06 20:50:32 183

原创 hh的项链区间不同数的个数

可以用线段树离线,也可以用主席树在线,都是利用只记录最后一次出现的信息,之前出现的信息都删掉。

2024-08-06 18:42:02 239

原创 启发式合并加树形dp

也就是说其实我们只要把式子的最后一项去掉,即w【x】+w【u1】+(f【u1】【0】-g【u1】)+(f【u2】【0】-g【u2】)....+(f【uk】【0】-g【uk】)就是这个路径新添加的贡献,也就是说新贡献就是w【x】+w【u1】+(f【u1】【0】-g【u1】)+(f【u2】【0】-g【u2】)....+(f【uk】【0】-g【uk】)+sum。

2024-08-06 01:40:38 607

原创 树套树模板

【代码】树套树模板。

2024-08-03 19:31:11 160

原创 splay平衡树模板

【代码】splay平衡树模板。

2024-08-02 17:41:17 120

原创 fhq平衡树模板

就是将一棵树按照v来分,一颗小于等于v,一颗大于v,合并的时候因为左子树一定小于右子树,然后按照key的随机数大小来决定谁是根即可。

2024-08-02 02:04:14 199

原创 可持续字典树

x的最高位是1,也就是说对于旧版本来说最高位会新添加一个1,所以对于1,这是应该新开一个点的,然后又对于最高位的0,x没有贡献,也就是说新的最高位的0的个数是等于旧版本的,那么就让它指向旧版本。由于持久化是采用前缀和的思想,所以我们可以同时记录一个siz数组来记录每个版本的每个信息个数,如果新版本增加了信息,那么siz+1,这样在求区间是否有或者有几个的时候可以直接siz相减就是信息了。所以新版本一定是新添加的信息,也就是个数会加一的那些位置,对于没有添加的信息就只能和旧版本一样了。

2024-07-30 00:39:58 234

原创 图计算和Bajtocja

我们先回忆一下字符串哈希。平时的十进制其实就是字符串哈希,对于123456789,都是用hash[i]=hash[i-1]*10+i算出来的。如果我们不用递推式,其实就是个每位一个权值10^i,那么对于该位的值就是10^i+i。其实字符串哈希就是将字符串看成一个base位进制的数,每位到base了才能进一位,每位的值都是base^i+该位的值。那么如果我们要改变其中一位,比如把123456789的第三位改成7,也就是变成127456789,其实就是把123456789-3*10^3+7*10^3。

2024-07-29 01:31:08 785

原创 Codeforces Round 962 (Div. 3)

对于第一种情况,我们直接暴力遍历一个数即可。第二种情况我们可以分两种情况考虑:1.不一样的数小于一样的数,2.不一样的数大于一样的数,我们直接暴力遍历这两种情况即可。对于k我们可以二分查找下标容易求,然后对于后面那求和部分我们很容易发现是一个后缀和,而后缀和又可以看成总和减去前缀和,所以我们去维护每个sub的前缀和,这样我们就可以log的时间求出以 l 为左端点的贡献了。直接暴力求每个字母的前缀和,对于区间l,r的最小操作就是区间不同数的一半,因为可以把一个数变成另一个不一样的数,一下抵消两个。

2024-07-27 02:21:04 367

原创 扫描线模板

董晓的板子,算len的时候r要+1,进去修改的时候r要-1.

2024-07-26 20:16:36 231

原创 动态开点线段树

对于树的线路问题可以用树剖来划分成一段一段的连续区间,但由于只记录这些区间某个信仰的权值,并且只有单点修改,所以我们考虑给每个信仰都开一个线段树,也就是开1e5个线段树(类似主席树的写法,开个root数组来记录每个线段树的根,然后结构体来存那些点和他们的信息,左右儿子),用每个线段树来维护各个信仰的区间和与区间最大值。

2024-07-25 01:42:28 297

原创 Codeforces Round 221 (Div. 1) D和hdu的C题 树上启发式合并

小总结:hdu的题是点对,这和树上路径相似,也和点分治思想一样,都是考虑三种情况不经过根,一端是根,跨根,第一种情况又可以归到子树的二三情况,所以一般都是只需要考虑后面两种情况。在dfs的时候,第一个for循环就是处理轻儿子子树的答案,由于是轻儿子,最后都会被keep=0的条件把内容清除,也就是res置零和线段树删点,所以在处理完轻儿子后,所有东西都是空的,等于还没进入dfs一样。

2024-07-24 03:20:42 415

原创 树上启发加点分治思想

对于一条链可以组成回文串,意味着最多只有一个奇数字母,比起我们记录路径各个字母的个数和,我们可以发现回文串实际上不在意真正的个数,只在意个数的奇偶。对于树上的链异或和,我们都可以用前缀异或和的思想,将x->y的异或和看成v[x]^v[fa[lca]]^v[y]^v[fa[lca]],v表示该点到根的异或和,可以发现就等于两个位置的异或和。我们要处理y和前面x个子树的跨根贡献的话,我们不能先将y子树的值处理了,因为这可能导致结果是y和y子树里不经过根的链,

2024-07-22 00:49:07 292

原创 树上启发式合并

理解和注意点都写在代码注释了.....

2024-07-21 20:01:56 217

原创 差分约数的

我们令有k的一边表示起始点,y+k就是起始点的距离加上起始点到终点的边权,那么xdis【y】+w)就更新dis【x】,使得x=y+k,也就是起点的距离加上边权要小于终点的距离,松弛条件就是if(dis【x】=y+k。

2024-07-12 20:55:19 280

原创 树的边覆盖与树的点覆盖

对于一条边要将其覆盖需要选这条边的父亲节点或者儿子节点其中一个即可,对于一个点的覆盖,同样可以选父亲节点或者儿子节点,但同时可以选自己这个节点。如果是0,那么可以从儿子节点的0,1,2状态转移(转移来源要有2的话,表示当前节点一定要选,因为当前节点就是儿子节点的父亲节点)。如果是2的话,从0,1转移,因为当前节点没有被选,也就是儿子节点的父亲节点没有被选,不能从2(父亲节点被选)转移。用0表示当前节点被选,1表示任意儿子节点被选且当前节点不被选,2表示父亲节点被选且当前节点不被选。

2024-07-10 16:13:14 253

原创 二叉苹果树

对于x为根的子树最大值可以从左右儿子选,只需要遍历左右儿子保留的数量即可。但由于题目要求与根节点(1)相连,也就是说如果选了左儿子,左儿子与根x的边就要连。由于给的是边权,先把边权转化成子节点的点权。

2024-07-10 15:51:24 166

原创 找树的重心和树的直径

重心就是把这个点删掉后剩下的子树大小最小,siz数组表示以x为根的子树总的大小,maxsiz数组表示以x为根的每个子树的最大的大小,sum表示整个树的大小,那么sum-siz就是除了x为根所有子树外的那颗子树的大小。两次dfs里的dis最大值就是直径的两端。

2024-07-10 15:35:56 191

原创 点分治模板

分治思想:一直找子树的重心,使每次遍历的子树深度尽量的小。

2024-07-09 19:38:50 123

原创 集合与最大公因数

对于这题我们要让四个数两两最大公约数为k,也就是说这四个数除了约数k以外没有其他公约数了,也就是如果我们把k都除掉,剩下四个数应该是两两互质的。所以我们只要取三个连续的奇数然后再取相邻的一个偶数,就可以找出四个互质的数了,最后都乘以k就是答案。3.连续两个偶数必定有公因子,如2,4。2.连续三个奇数互质,如1,3,5。1.相邻两个数互质,如5,6。

2024-07-09 19:13:35 267

原创 华华给月月出题

(a*b)^c = (a^c)*(b^c),我们将合数素数幂分解,然后我们只要处理每个素数的幂,就可以处理出所以合数的幂。

2024-07-09 00:01:58 226

原创 拓展中国剩余定理

【代码】拓展中国剩余定理。

2024-07-08 22:37:19 169

空空如也

空空如也

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

TA关注的人

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