- 博客(162)
- 收藏
- 关注
原创 22/11/28
所以可以看出,f(x)与三进制数的关系就是三进制序列长度加上每一位的数值;对着打出来的表盯一个小时,发现了f(x)与x的三进制的关系;1,西安icpc E. Find Maximum。接下来就是在l,r区间内构造合法的最优解;sum就是第四列的数,
2022-11-28 20:11:01
285
1
原创 22/11/24
走到终点的最短路径,第一次走到的一定是最短的!因为是层向拓展,所以第一次走到的一定是最短的!先是自己和自己匹配,求出ne数组,然后和另一串匹配,进行求解;反对角线y-x都一样,但是数组下标不能为0,故统一加n;循环里三步:while,if,记录ne数组/挪串匹配;注意初始化的方法,和dp类似,注意含义;正对角线就是y+x,该线上y+x都一样。适用数据范围小的最短路,可以求负权边;3,trie树,最大异或和;对角线及反对角线的状态表示;6,dijkstra算法;7,floyed算法;
2022-11-25 16:21:40
522
原创 22/09/29
题意:给一个长度为 n的序列 a1,a2,…,an,对于每个位置 i,如果 ai%(i+1)!=0,就可以将 ai删掉。题意:题意 给定n,求长度为n的以'a','b'或'c'构成的字符串,使得其中不存在长为3的回文子串(如"abc","abca"均符合,但"aba"不符),并使'c'的个数尽可能少。思路:对于 位置i,只要该数存在一个a[i]%j!很明显发现用aaba做循环即可,不会出现长度为3的回文子串,也用不到c;对于每个ai,按此枚举即可,看似暴力其实枚举时会很快退出第二重循环;
2022-09-29 17:07:55
257
原创 22/09/27
题意:有n座城市,标号为1~n,定义标号为i,j的两座城市的距离为(i+j)%(n+1).求走完所有城市所需的最小花费(起点任意).题意:给n*m的矩阵,每个格子里是0或1,从1,1走到n,m,问走到终点且中间经过不少于p个0和q个1的方案数;思路:很明显发现走1—n—2—n-1—3—n-2是最优解,不过答案是偶数跟着上层的奇数的;一眼dp,状态转移很好写;f[i][j][k]表示走到i,j且经过k个1的方案数;用f[0][j][k]表示上一行,f[1][j][k]表示本行;(记住最后取模,否则tle!
2022-09-27 18:48:38
147
原创 22/8/3-杭电多校5
只有是两边都是全部牌都不一样,即第三条规则,那么yahaha是无法叫的,一定会被challenge;一开始找了一个虚拟节点,将所有来到该节点路径的边权设为p,所有从该节点的路径设为0;开个小根堆记录离开时间和所在窗口,每次只要到了时间,都给他离开掉;上一层都指向d1,边权为p,然后d1指向下一层,边权为0;下一层都指向d2,边权为p,然后d2指向上一层,边权为0;按理说同层之间还是可以相互到达,且路径为p,但是没wa;真正维护好同层之间关系的是每层用两个点,d1,d2;会输,其余情况都是赢;...
2022-08-03 16:28:03
85
原创 22/7/22!
但是区间修改的话,如果对修改区间的每个点都像单点修改那样找到每个叶子节点在修改,复杂度还是会爆炸,所以就要在上面的代表区间的节点进行修改,只有修改到了这一层,就是从上往下传递修改,对应的就是modify中,要找左右儿子时,往下传递修改(懒标记);修改子树,根据dfs序来,更新子树很简单,因为子树的dfs序一定是连续的,知道左端点是子树的根,有子树的大小sz,所以右端点就是id[u]+sz[u]-1;如此一来,对树上某一连续路径的操作就变成了区间修改,套线段树,树状数组,分块等都可以做了就;......
2022-07-22 23:09:27
92
原创 22/7/21
启发式合并就是在合并集合的时候,小的往大的合并,不要让大的合并到小的;这样就可以将复杂度由O(n^2)降为O(nlogn);1,acwing2154.梦幻布丁(启发式合并);2,祖孙询问(lca);3,acwing2568.树链剖分。维护颜色的段数改变颜色时,只会影响相邻的,x,y颜色;所以对集合遍历判断即可;思路存储对应颜色的下标序列,每次为操作1时,合并两个集合,用启发式合并;判断x之前左右是不是y,是,段数-1;...
2022-07-21 23:17:55
76
原创 22/7/18
1,acwing 346.泼水节;1,泼水节; 思路:因为要做完全图,所以在合并集合时,要把两个集合的所有点对都连一条边,所以在kruskal合并集合的时候统计加的权值即可;用到了统计集合点数;p[a]=b,siz[b]+=siz[a];...
2022-07-18 22:55:57
75
原创 22/7/16
因此,就可以把二维的问题转化为两次一维的问题,先横着求一边行的最值,在纵着对列求一遍最值;题意给一个数n,让你把1~n的正整数划分为两个不相交子集,使得两个子集的和的最大公因数>1;如果可以划分,输出Yes,并输出集合1的大小及元素,集合2的大小及元素;每个位置编号坐标(x,y)编号就是m*(x-1)+y,然后遍历两次矩阵,分别加上横向边,权值是2,纵向边权值是1;那我求一个3*3的正方形的最值的时候,其实也就是对列方向上这个存储最值的三个长度的矩形取个最值;输出n为i的时候的最大公因数;......
2022-07-16 16:32:01
173
原创 22/7/15
1,cf Productive Meeting;2,acwing 1134.最短路计数(模板题);3,acwing 1142.繁忙的都市(最小生成树);4,acwing 1143.联络员(kruskal);1,cf Productive Meeting题意:思路:看样例, 很容易想到一个做法是每次选最大值和次大值,答案增加一个次大值,然后接着选;所以维护最大值和次大值,由此想到大顶堆;这样一直取;但很不幸,wa了;错误的原因就在最大值和次大值的更替上,每次取出来最大值和次大值,不能直接增加一个次大值,只增加
2022-07-15 16:53:09
128
原创 单调队列专题
单调队列存储的是一段区间的单调递增或递减的子序列的(为什么是下标值后面会说);因此取区间最值只取队头即可做到;存储下标是为了方便将不属于本区间的队头去掉;利用q[hh]
2022-07-15 16:51:56
146
原创 22/7/14
进而想到ai变成n*ai需要加(n-1)倍的ai,由此选n-1个数使这n-1个数变成nai,在选一个数,也变成n的倍数;题意给俩数a,b,代表偶数个数和奇数个数,问是否存在一段连续的区间使得偶数和奇数个数对对应a,b;每次操作你将选择一个区间,假设区间长度为len,你将给这个区间的每个数加上len的。思路最后肯定构造成每个数都是n的倍数,使得最后一步都变成0;请你给出任意一个合法方案,可以证明这个问题一定有解。给你一个长度为n(n≤105)的序列,你要进行。,使得操作结束后序列所有数为0。...
2022-07-14 22:45:46
132
原创 22/7/12
1,cf Phoenix and Distribution(字典序);2,acwing 343. 观光之旅(floyed求最小环);4,visits(基环森林);1,Phoenix and Distribution题意:将给出的字符串分成若干个部分,每部分不重复、不需要连续或者按顺序。如字符串"abbac"可以被分成"acb"和"ab"。求长度为n的字符串s分成k个部分,k部分中字典序最大的最小字典序。看组样例; 就是为了将d往后靠;2,观光之旅; floyed求环;根据第二点性质;每次把i ...
2022-07-12 17:33:36
128
原创 22/7/11
1,cf AND Sorting(思维);2,acwing 1125.牛的旅行(floyed);3,滑动窗口(线段树版);4,acwing 343排序(传递闭包);5,乘积最大(dfs);1,AND Sorting题意:给你0~n-1的排列p(不是有序的!!),操作是pi&pj=X,可以交换pi和pj,操作后使得p有序,问X最大?思路:pi!=i的位置肯定都要交换,所以要&一下,很明显所以不等i的位置&起来就是答案;2,牛的旅行;思路:暴力枚举每个可能的点对,求出答案;floyed求出任意两点的最短距
2022-07-11 15:57:01
99
原创 22/7/10
1,cf Divine Array;2,acwing 1134.最短路计数;3,acwing 383. 观光;1,Divine Array题意:有一个长度为n的数组,数组的元素都在1~n的之间,数组有个变化过程,就是每一次变化,每个位置上的值变为对应位置的数在数组的出现次数; 在初始数组中,我们有两个 2,三个 1,只有一个 4,只有一个 3,所以在第一步之后,每个元素都等于它在初始数组中出现的次数:所有 2 都变为2、全1变3,4变1,3变1。现给出q个询问,问第i个位置第k次变化后的值是什么;思路:首先
2022-07-10 16:45:33
268
原创 22/7/9
1,cf Dice Tower;2,acwing 1137. 选择最佳线路(多起点多终点最短路);1,cf Dice Tower题意:你有无限个骰子,给你1个数,问能否用骰子来拼出来该数(表面点数之和,骰子只能往上堆,看作一个长方体的话,就是4个侧面的点数和以及顶面的点数,);思路:很简单的数学,骰子对应关系:1-6,2-5,3-4,所以每个骰子仅侧面就贡献14,加上顶面1~6;特判n...
2022-07-09 23:21:47
166
原创 22/7/8
1,acwing 341.最优贸易;2,cf Almost Equal;1,最优贸易;思路:采取dp的思想,枚举分界点,求1到分界点的最小买入价格和分界点到n的最大卖出价格; 注意dijkstra和spfa的区别:dijkstra算法里,一旦该点确定最小值后,就不会在更新该点了,但是本题中当前最小值不一定是最终最小值,所以用spfa;求最大值就是建反边,再来一遍spfa;2, Almost Equal;题意:给你数字n,要求创造一个环包含1~2n,且 在环内每取n个数的和,这些和之间的差不能超过1,
2022-07-08 23:08:53
123
原创 22/7/7
1,cf Nicholas and Permutation;2,cf Circle Coloring1,Nicholas and Permutation题意:给你一次交换数组两个元素的机会,输出最大元素和最小元素的距离的绝对值;思路:直接4个答案取max;2,Circle Coloring题意:有a,b,c,三个序列;你需要创造一个序列p,使得pi属于(ai,bi,ci)并且,pi的相邻元素互不相等,包括pn-1 pn p1(看作环);思路:直接选,注意不重复就行;...
2022-07-07 23:26:30
279
原创 22/7/6
1,cf Knapsack题意:给你n和w,再给出n个wi,使得你所选点wi的和在w/2上取整,和w之间;⌈W/2⌉≤C≤W存在方案,输出选的个数和索引,否则输出-1;思路:之间排序,从小到大开始选;但是坑点,并不是碰到>=mid就结束了,需要特判使得sum>w的那个wi,如果wimid且>w,所以此时,只选wi就是一种方案;还有奇怪的bug。。,该代码可以过;但是下面的就不可以;return直接结束函数有问题貌似,待研究;还有...
2022-07-06 23:40:30
77
原创 22/7/5
1,校门外的树;2,Milk Visits G(待补);3,cf Prefix Sum Primes1,校门外的树提醒自己:由差分数组还原本数组时,一定不要忘了a[0]+=cf[0]!!!,2,Milk Visits G;思路:类似lca,每次去往最近公共祖先去靠,但是是逐个靠过去,所以能知道途径每个节点的信息;但是给tle一个数据; 3,Prefix Sum Primes题意:给你长度为n的1 2序列,你需要重新排列1 2 序列,使得从1开始的前缀和得到的素数最多;思路: 很容易想到的是,偶数
2022-07-05 22:26:08
112
原创 22/7/4
1,cf Paranoid String;2,acwing 342.道路与航线;1,cf Paranoid String题意:有一串01序列s,当si 和si+1不同时,si 和si+1会删去左边,留下右边,即01变成1,10变成0,问s有多少字串可以经过该操作变成长度1;字串是连续的,子序列是不连续的;思路:首先s的长度是一个答案,都只取si即可;然后注意到能删除的话,看字串的最后两位si 和si-1,如果相同的话,那么该字串必定只能贡献答案是1,就是si,不同的话,可以贡献i-1个答案;2,道路与
2022-07-04 22:25:09
53
原创 22/7/2
1,Convoluted Intervals1,Convoluted Intervals题意:思路:区间数很多,但是端点值都在0~5000,所以可以用桶来存;因为i和j的取值都在(0~m)所以双重遍历构建差分数组 就是考虑i+j对区间的值的增加的贡献度,左端点就是加,右端点就是减(因为贡献的是一段区间,所以到右端点时就停止贡献);然后还原0~m*2的区间;......
2022-07-04 08:02:38
87
原创 22/7/1
1,acwing 904 虫洞;2,acwing 1140.最短网络;1,虫洞;简单的判断负环,注意根据题目建图,理解实际问题中的图; 2,最短网络; 最小生成树模板题;
2022-07-02 09:32:24
74
原创 22/6/30
1,acwing 164.可达性统计;2, Decorating the Pastures;3, Perimeter1,可达性统计; 思路:设f[x]表示x能到达的点的个数,那么f[x]=(x)||f(y1)||f(y2)||.... (’||‘就是或运算,y1,y2是存在有向边的(x,y1)...);因此,要求f[x]就要知道后面的f[y1],f[y2]..所以就要按拓扑排序的逆序来做;在表示x能否到i,可以用状态压缩,但是数据很长不是32位,就用到了bitset;也就是将状态压缩不局限int来表示
2022-06-30 22:53:03
129
原创 22/6/29
1,cf Solve The Maze;2,acwing 1191.家谱树;3,acwing 1192.奖金;1,cf solve the maze题意:给出n*m 的矩阵,'.'代表空地,'#'代表墙,'B'代表坏人,'G'代表好人,你现在可以在任意空地上加墙,来使得好人可以到的第(n,m)块地,坏人无法到达;如果可以这样,输出yes,否则输出no;思路:直接给坏人围墙,然后从(n,m)bfs,如果能遍历到所有好人,就是yes;注意特判:没有好人就是yes;好人和坏人挨着,no;终点是墙,no;细节:注意
2022-06-29 22:57:04
120
原创 22/6/27
1,acwing 920 最优乘车;2,acwing 903.昂贵的聘礼;1,最优乘车; 思路:同条线路的所有站点之间的距离为1,所以给每条线路的站点之间互连距离为1的路径,求1好点到s的最短距离,再减去1即是最少换乘次数;这道题有个注意的地方是它每行给出的线路车站数是不确定的,所以采用行读取,用到了stringstream;简单写下用法:行的输入用getline,(如果在你要读入的数据之前还有输入,那就要吃个回车,用了快读不能用getchar,用cin.get();),将行的数据放到stringstre
2022-06-28 22:40:21
110
原创 22/6/28
1,acwing1135.新年好 ;2,acwing 340. 通信线路;1,新年好;思路:先预处理以1,a,b,c,d,e为起点到所有点的单源最短路;dfs所有拜访顺序,共(5!)种拜访顺序,找出最短的一种;注意memset(dist,0x3f N*4)和memset(dist ,0x3f sizeof N*4)是有区别的,所以宏定义最好能区分这俩; 2,通信线路;题意:找出1~n号的路径中,第k+1大的路径权值最小;所以不一定就是在最短路里找了;一种解法是二分,为什么可以二分呢,二分找的是一个分界
2022-06-28 22:38:35
82
原创 22/6/27
1,acwing 920 最优乘车;2,acwing 903.昂贵的聘礼;3,cf Restricted RPS1,最优乘车; 思路:同条线路的所有站点之间的距离为1,所以给每条线路的站点之间互连距离为1的路径,求1好点到s的最短距离,再减去1即是最少换乘次数;这道题有个注意的地方是它每行给出的线路车站数是不确定的,所以采用行读取,用到了stringstream;简单写下用法:行的输入用getline,(如果在你要读入的数据之前还有输入,那就要吃个回车,用了快读不能用getchar,用cin.get();
2022-06-27 22:15:08
650
原创 22/6/26
1,cf Omkar and Heavenly Tree;2,acwing 1127 香甜的黄油;3,acwing 1126 最小花费;1,Omkar and Heavenly Tree题意:给你n个节点和m个限制,建一棵符合条件的树;m
2022-06-26 19:15:02
164
原创 22/6/24~6/25
1,cf Palindromic Numbers;2,牛牛看云;3,中位数切分;4,cf Another Problem About Dividing Numbers;5,九小时九个人九扇门;1,cf Palindromic Numbers题意:给你一个长度为n的正整数,一定存在另一个长度也为n的数,使得他俩的和为回文数;求出另一个数;思路:看正整数开头的数字,在1~8就可以用长度为n的999....来当回文数,再减去给出的数字,就可得到长度为n的另一个数,如果开头数字是9,那么我选择的是长度为n+1的11
2022-06-25 18:02:54
221
2
原创 22/6/11
1,cf Putting Bricks in the Wall1,对于这种数据的输入,一定要长点心!!如果要双层循环输入的话,必须是逐个空格隔开的数据!对于该数据而言,只能逐行输入!!;题意:小明要从(1,1)走到(n,n),一开始他可以选择0或者1,之后在上下左右四个方向走与他所选的数字相同的格子;你是坏蛋,要阻止他走到终点,你最多有两次操作:将单元格的数字翻转,1变0,0变1;总是存在解决方案的,输出操作次数和翻转格子的坐标;思路:起点终点“互质”即可:包围他俩的格子组成:1100或者0011的序列即可
2022-06-13 08:11:36
90
原创 22/6/5
二叉树模板复习;根据先序创建二叉树,并输出中序后序遍历;自己不用指针来写的一个版本,非常好记加好写;样例:ABD##EG###C#F##输出:
2022-06-05 22:42:19
145
1
原创 22/6/4
1,cf Shell Game;2,cf valued keys;3,知先序中序求后序,知后序中序求先序;1,shell game;题意:给了3个倒扣的碗,其中有一个碗扣着球,碗的交换顺序有规律:奇数操作只能将左边的碗与中间的碗交换,偶数操作只能将右边的碗与中间交换,给出操作次数和最终球在哪个碗,问最开始球在哪个碗;思路:首先把操作顺序写出来,不难发现6次一循环;所以处理出来6次操作的状态,直接输出即可;(注意第1步操作对应第1个状态,第6步操作对应第0个状态);#pragma GCC o
2022-06-04 23:42:19
88
原创 22/6/2
无向图的双连通分量:eg1:acwing 395.冗余路径(e-dcc);eg2:acwing 1183.电力(v-dcc);eg3:acwing 396.矿场搭建;无向图的双连通分量:一些概念:桥(也叫割边):割点: ①:边连通分量(e-dcc):极大的不含有桥的连通块被称为边双连通分量。图中的两个边双连通分量之间一定有桥每个桥至少属于两个边双连通分量②:点连通分量(v-dcc):极大的不包含割点的连通块被称为点双连通分量。每个割点至少属于两个点双连通分量。图中的两个点双连通分量之间一定有割点e
2022-06-02 14:11:55
75
原创 22/6/1
无向图的双连通分量:eg1:acwing 395.冗余路径(e-dcc);eg2:acwing 1183.电力(v-dcc);无向图的双连通分量:一些概念:桥(也叫割边):割点: ①:边连通分量(e-dcc):极大的不含有桥的连通块被称为边双连通分量。图中的两个边双连通分量之间一定有桥每个桥至少属于两个边双连通分量②:点连通分量(v-dcc):极大的不包含割点的连通块被称为点双连通分量。每个割点至少属于两个点双连通分量。图中的两个点双连通分量之间一定有割点e-dcc算法实现:和求有向图的强连通分量
2022-06-01 20:56:31
170
原创 22/5/31
1,有向图的强连通分量:eg1:acwing 367.学校网络;求有向图的强连通分量,用到了tarjan算法;复习一下:对dfs遍历的树,引入4条边的概念:1,树枝边(x,y)x是y的父节点,x到y的边称为树枝边2,前向边(x,y)x是y的祖先节点,x到y的边称为前向边。(树枝边是特殊的前向边);3,后向边(y,x)x是y的祖先节点,y到x的边称为后向边。4,横叉边(x,y)在对有向图进行dfs遍历时,x是已经搜过的图的分支(不是前向边),现在在搜的点是y,y到x的有向边是横叉边。
2022-05-31 22:14:09
112
原创 22/5/30
1,acwing 102.最佳牛围栏;2,有向图的强连通分量:eg1:acwing 1174.受欢迎的牛1,最佳牛围栏;二分答案;答案就从0~max(ai)里二分找,(答案一定在这个区间);如何在0~n区间里找到符合答案的k的划分呢,采用双指针和前缀和预处理;i=0,j=f,i和j同时右移,用minv来存储i~j-f的最小值,因为sj-最小值最容易找到解;#pragma GCC optimize(2)#include<bits/stdc++.h>#define
2022-05-30 21:52:21
64
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人