![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_数据结构
文章平均质量分 51
ACM的数据结构题总结,另外包含:构造+二进制。
I_have_a_world
这个作者很懒,什么都没留下…
展开
-
codeforcs 1430E. String Reversal(字符串,数据结构)
题目链接:https://codeforces.ml/contest/1430/problem/E题意:给定一个数字n,和一个长度为n的字符串c。每次只能够相邻字符交换,问最少多少次能够将字符串变为原串的反串。codeforces->secrofedoc.题解:还有25分钟的时候看的这一题,题意很简单,于是就打算来想一想。如果各个字符不相等,那么容易得到为n*(n-1)/2。不一样的时候,先从1到n排,考虑排第i个数是贡献最小,且对后面影响最小,那么codeforces排第第2个字符时原创 2020-10-17 17:32:47 · 166 阅读 · 0 评论 -
luogu P2093 [国家集训队]JZPFAR (k-d tree难一点点的模板题)
人生中第一个洛谷黑题,献给了k-d tree。题目链接:https://www.luogu.com.cn/problem/P2093题意:最开始给定n个点(n<=1e5)。然后给定m个询问(m<=1e4),包含xi,yi,k。(每次询问输出距离(xi,yi)第k远的点。注意,如果距离相同,那么索引小的算距离大的)。题解:最近连k-d tree。专门找的这种类型的题目,再点开标签,只有k-d tree那么用它无疑了。之前学过的k-d tree的操作:build,query,rebu原创 2020-11-11 22:28:49 · 328 阅读 · 0 评论 -
codeforces 1428E. Carrots for Rabbits(贪心(非常优秀的贪心题),结构体重载运算符)
题目链接:https://codeforces.ml/contest/1428/problem/E题意:给定n个数,要求将这些数拆分为k个数,是这些数的平方和最小。题解:结构体,一开始想到的是每次分最大的数,平分。然鹅,1 3 10000.是分成3333 3333 3334显然更好。换一换贪心思路。每一个数多拆分一种就有特定的平方和减小值,如10分成3:3 3 4,分成4 份:2 2 3 3减小值为8.一个数分为k种,有特定的最小平方和(平分,见gv函数)。然后每一次只需要关注减小值最大的数原创 2020-10-18 21:57:31 · 848 阅读 · 0 评论 -
codeforces 1435C. Perform Easily(数据结构,贪心,区间,定一)
题目链接:https://codeforces.ml/contest/1435/problem/C题意:输入,a1~a6。然后n,接着b1~bn。问每个b1减去一个a之后的最小的(最大值-最小值)。题解:1.我在赛场上想的是二分,但是二分只能找到最大的最小值或是最小的最大值。就不能够找到最小的最小值这类的(最小的最小值不就是最小值吗???)2.也想过定一个,然鹅要枚举???铁定超时,就没往这里想了。唉,应该先想出一个暴力的,正确的思路,然后再优化!!!。最后看了题解,真的,很巧妙!!原创 2020-10-26 12:34:52 · 647 阅读 · 0 评论 -
codeforces 1435D. Shurikens(贪心,数据结构)
题目链接:https://codeforces.ml/contest/1435/problem/D题意:输入n,表示放入n次商品,价值分别为1,2,3,...,n(顺序不一定是这样)。而且还要买n次,每次买的价值也是1,2,3,...,n。(不过要先放上去再买,而且每次只能买放入橱柜的最便宜的东西)。+表示放一个- x表示买一个价值为x的商品。为给出的序列是否满足条件,如果是请先"YES"再输出放入的序列,否则只打印"NO"。示例:4++- 2+- 3+- 1- 4原创 2020-10-26 08:11:51 · 301 阅读 · 2 评论 -
重载运算符总结(其他重载可类比)
struct node{ ll x,y; node (ll a,ll b){x=a,y=b;} bool operator < (const node &a) const {if(x==a.x) return y<a.y;else return x<a.x;}//!设置小优先 node operator - (const node &a) const {return {x-a.x,y-a.y};}//?凸.原创 2020-11-07 17:04:26 · 187 阅读 · 0 评论 -
Luogu P5076 普通二叉树(利用vector实现二叉树的一些操作,vector不比set难用)
链接:https://www.luogu.com.cn/problem/P5076题意:给定n个操作(n<=1e4)。1.查询x的排名2.查询排名为x的数3.求x的前驱(若无则输出-2147483647)4.求x的后继(若无则输出2147483647)5.插入x所有数都在1e9以内。题解:无疑是考察二叉树的模板问题,我们这里用vector来操作(之后也可以这样子用),下标从0开始struct two { vector<ll> v; vector&l原创 2021-01-24 19:45:42 · 344 阅读 · 0 评论 -
codeforces1494E. A-Z Graph (MAP二维压缩)
题目:https://codeforces.com/contest/1494/problem/E题解:二分抄代码翻译:奇数时有i->j,j->i即可;偶数时有i->j,j->i且这两条路径的字母相同即可。(偶数时,知道这样肯定是正确的,但没有多想--tcl。1->2->3->4,4->3->2->1相等,那么肯定有2->3==3->2,所以这种情况包括了所有情况!!!)总结:map<pll,ll> mp;可以翻译 2021-03-05 10:26:37 · 179 阅读 · 1 评论 -
cf1163B2. Cat Party (Hard Edition)(简单总结一下map数据结构的简单方法)
题目链接:https://codeforces.ml/contest/1163/problem/B2题意:n和一个长度为n的a 数组(1<=n<=1e5,1<=ai<=1e5)。问最大的a数组前缀长度(要求满足去除一个数之后剩下的每个数的出现次数相同)。(nmd我读题都不认真emmm,读的不太懂就去划水了,尼玛今天才注意自己打cf8个月了,最高才1596,目前1389)。要好好准备一下打cf了,不要总做简单题,要面向xcpc编程。好好训练自己应对比赛的能力。题解:用一原创 2020-10-29 16:00:58 · 197 阅读 · 0 评论 -
cf 1474 C. Array Destruction(暴力,数据结构)
题目链接:https://codeforces.ml/contest/1474/problem/C题意:T组样例(T<=1000),每一组样例输入n(1<=n<=1000),然后输入一个长度为2*n的数组a,(1<=ai<=1e6)。然后问是否满足条件,如果满足先打印"YES",然后输入最先取出的两个数的和,再每一次取出两个数,满足和与上一次取出的两个数中的最大值相等,如果能一直取到一个数都不剩,则满足条件,否则打印"NO"。示例:input:::423原创 2021-01-20 13:03:12 · 350 阅读 · 0 评论 -
luogu P1966 火柴排队(线段树,逆序对,归并排序)
题目链接:https://www.luogu.com.cn/problem/P1966题意:给定两个长度都为n的数组a,b。(n<=1e5)。(每个数组的n个数均不一样)每次可以交换一个数组的相邻两个数,问最少交换多少次,可以使(ai-bi)^2之和最小。题解:1.使(ai-bi)^2之和最小,也就是2*ai*bi之和最大。不多证明:大数尽量乘大数,有点像王国XX。所一需要考虑的是将其中一个数组转化为一个全排列,然后求其最少需要多少次能将它排成递增的全排列。2.考虑离散化:原创 2020-11-15 17:31:51 · 132 阅读 · 0 评论 -
cf1516 D. Cut
传送门题意:给一个长度为n(1~1e5)的数组a,q(1~1e5)次查询,每次查询区间l,r最少可以分为多少个连续的子区间,满足每个子区间的所有数的乘积=这个区间的lcm(最小公倍数)。题解:倍增,f[i][j]表示从i开始划分,分了1<<j个区间,最后一个区间的下一个区间最左边的下标。注意复杂度。这里用到了一个优化——出现分一些块,满足这个块内的数两两互质(1与任何数互质)。所以查询f[i][0]的时候只需要从下一个块开始暴力,不需要从下一个数开始暴力。//不知道最后复杂.原创 2021-04-22 11:06:51 · 225 阅读 · 0 评论 -
2021牛客寒假算法基础集训营3 B内卷(优先队列+尺取法)。经典@@!
题目:https://ac.nowcoder.com/acm/contest/9983/B题解:枚举法--枚举最小值,然后其他每组选择与其差值最小的数即可。具体见兰子哥哥。翻译:最开始,魅族都选最小的只,就相当于以最小的数作为最小的数的最优解,然后不断增大最小值(下限),每次在更新一下ans=min(ans,mx-mi)即可。边界处理:j-1==0是或者cnt(取A的个数)==k+1时跳出循环。总结:能直接用pair就直接用。优先队列:默认大顶堆,less大,greater小(直接试也可翻译 2021-03-06 10:04:34 · 103 阅读 · 0 评论 -
P2827 [NOIP2016 提高组] 蚯蚓(数据结构+思维+技巧)
总结及收获电子竞技,荣誉至上。不只是单纯的想搞个奖的话,最好还是希望在队里能有贡献,换句话说就是凭自己的实力拿个奖。多刷题。和别人一起刷,会感觉轻松一些。题目传送门题意:题解:3.1 总结:队列b[xx]中的数都是递减的(先出队的一定大)。另外队列b[xx]中的数出来之后都要加上偏移量之后才是真正长度。代码:#include <bits/stdc++.h>#define dbg(x) cout << #x << "===" <<原创 2021-07-29 11:26:24 · 207 阅读 · 0 评论 -
codeforces 1525 C. Robot Collisions(构造+数据结构+贪心)
传送门题意:给定0,m分别为坐标的上下界,然后有n个机器人最开始再xi位置,如果ci为‘L'则最开始向左,否则'R'向右,速度都是1s1个unit。每次碰到0或者m之后下一步就反向。任意几个机器人同时相遇时发生爆炸(只考虑在整数处相遇)爆炸之后就不考虑这几个机器人了。求每个机器人爆炸的时间,如果永远不会爆炸就输出-1。1<=n<=3e5,2<=m<=1e8题解:抽丝破茧(当时状态不咋样,大概知道咋做,但感觉很复杂,反正是消耗,果然放弃挣扎)首先理解不会有超过两个的机器人原创 2021-05-17 17:12:40 · 531 阅读 · 0 评论 -
cf1532 D. Lost Tree(交互+构造+每次消去两个数)
传送门题意:有一个树,大小n(2<=n<=2000),最多[n/2]次询问,得到这棵树的所有边。每次询问给定一个整数x,然后得到所有点到该点的最短距离。题解:第一次消去点1(最开始顺便取个点然后分层),然后每次询问“叶子节点”,同时删去“无影响”(不能再连的点)的点,每次至少可以删去两个点,即叶子节点,与叶子节点相连的点(注意,如果与叶子节点相连的点的深度与查询的点x相等,那么也不能再连了)。(自己想一想吧)总结:这种构造问题,应该有严格的规律!!!代码:#include原创 2021-06-14 22:31:57 · 234 阅读 · 2 评论 -
牛客D 动态序列(数组全乘/加,前/后插入数,查询某个值,线段树)
题目:https://ac.nowcoder.com/acm/contest/13504/D题解:1)同时维护区间加法和乘法:乘--mul*=x,add*=x(这里,很好理解,就怕易忘);加--add+=x2)前/后插入,(ai*mul+add)%mod为一个数的最终值,插入一个数aj使满足(aj*mul+add)%mod=x。aj=(x-add+mod)%mod*inv(mul)%mod即可.很厉害!!!代码:#include<bits/stdc++.h>#defi原创 2021-03-29 21:38:10 · 83 阅读 · 0 评论 -
牛客-Incomplete Implementation
传送门题意:给定一个长度为n的全排列(4~1e5而且4|n),可以进行操作:每次可以选择n/2个下标进行排序。保证有方案最多操作不超过三次,可以使所有的数都排好。要求输出:sz(表示操作次数,不要求最少操作方案)。然后下面sz行分别是n/2个数,表示数组的下标。sz次操作之后整个数组排序完成。题解:第一次操作尽量将前面的排号,可以很容易证明至少能排好前面n/4个数;第二次操作尽量排后面,可以很容易证明至少能排号后面n/4个数;最后最多中间n/2个数没有排好,我们在上面每.原创 2021-04-04 21:06:01 · 107 阅读 · 0 评论 -
优先队列注意事项
1.最好永远不要用这种排序方式!!!!struct pii { int dis, i; pii() {} pii(int _dis, int _i) { dis = _dis, i = _i; }} a[maxn];struct cmp { bool operator()(int x, int y) { return a[x].dis > a[y].dis; //小顶堆 }};priority_queue<int, vect原创 2021-04-15 21:22:46 · 98 阅读 · 0 评论 -
【浙江农林大学蓝桥杯程序设计竞赛校选拔赛(同步赛)】E谁是天选之人(线段树,尺缩法)
题目1:https://ac.nowcoder.com/acm/contest/12479/E谁是天选之人我的代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=46936115题目2:https://ac.nowcoder.com/acm/contest/9984/G九峰与蛇形填数我的代码:https://ac.nowcoder.com/acm/contest/view-submission?submissio原创 2021-03-08 07:22:47 · 264 阅读 · 0 评论 -
2021-ICPC昆明站-J.Parallel Sort
传送门题意:给定一个n(1~1e5),然后长度为n的全排列a。每次可以交换任意组(一组两个数,亮亮交换)的数,但是所交换的所有数都不能重复。问最少可以交换多少次。题解:1)看到题很简单有个思路:找有几个环,然后每个环单独操作,最多次数为max(logx)(30->15->8->4->2->1),x为最大环大小。2)然后希哥给我说最多两次,说明哪里想错了(如果赛场上太骄傲于自己的想法,必然gg,xcpc的题目感觉都是需要考虑的挺多的,做错了不要一直找原bug.原创 2021-04-04 21:59:32 · 658 阅读 · 0 评论 -
cf 1457D. XOR-gun(异或运算,前缀和,暴力,二进制)
题目链接:https://codeforces.ml/contest/1457/problem/D题意:给定一个长度为n(2<=n<=1e5)的不减数组a(a[i]<=a[i+1])。1<=ai<=1e9。每次可以执行操作:选择两个相邻的数组去掉这个数,然后在原来位置加上这两个数的异或结果。问最少经过多少次能够使这个数组不满足不减数组。题解:分析1.二进制,如果任意三个连续的数最高位数相同,那么一定可以取依次异或(后面两个数)使这个数组不满足条件。ans=1;原创 2020-11-29 19:34:29 · 367 阅读 · 0 评论 -
2021牛客暑期多校训练营5-K.King of Range(尺取法&倍增&线段树)
收获&思考&感受又被这题搞崩 了,怎么就没想着换一种方法?能静下心来思考的话很容易发现线段树是不行的,复杂度太高(即使有我所谓的离线优化,也是可能达到O(1e7∗log(1e7))O(1e7*log(1e7))O(1e7∗log(1e7))的emmm。倍增也还是不够熟练,当作是练习吧。还好是自己一个人玩,不然怕会被队友骂死。16wa都没搞出来,我可真牛逼(主要是没换思路emm),开始使用的set,后面换成线段树(后来发现复杂度差不多emm)而且这一题后面用正确代码试了试,m的最大值原创 2021-08-01 10:32:08 · 113 阅读 · 0 评论 -
cf1557-D. Ezzat and Grid(离散化&线段树&pair复杂度&很多数据结构的基本操作)
传送门题意:n*1e9的01阵,m条线段(i,l,r)表示第i行[l,r]都为1,线段可能重复。一个漂亮矩阵定义为任意连续两行都至少有一列在这两行中都为1,求最少删去多少列,能使剩下的矩阵为漂亮矩阵。题解:不难想到,遍历每一行,每一行的上面一行应该是行数最多的漂亮矩阵的最后一行,然后线段树维护即可(具体的看代码)2.1 离散化:用unique而不用map。2.2 pair<int,int>:能用就用,不用自己搞个结构体(大佬都在用pair),另外{x,y}似乎可以等价于make_pa原创 2021-08-11 11:38:59 · 218 阅读 · 2 评论 -
ST表复习&总结(倍增)
目录前言参考博客感受?模板题目1.2021牛客暑期多校训练营5-K.King of Range(尺取法&倍增&线段树)xxx前言参考博客oi-wiki我的:最近公共祖先LCA总结ST表算法详解感受?既然学到ST表这里了,就多做些题目(学得更精通一些)再溜。模板来源于题目:2021牛客暑期多校训练营5-K.King of Range(尺取法&倍增&线段树)模板:int Log[N], Bit[N];int fmi[N][25], fmx[N]原创 2021-08-01 11:44:05 · 261 阅读 · 0 评论 -
数据结构总结
目录前言线段树前言碎碎念算法基本思想模板(基于区间和修改&区间和查询)模板题区间乘修改+单点查询区间加修改&维护区间最小值二维线段树&区间加&区间最小值&前缀和与差分线段树维护区间GCD&单点修改&区间查询前言acm快退了,把写过的模板总结整理一下。线段树前言碎碎念之前学了一些东西,笔记写的还挺认真,可惜放在了电脑桌面上(基本不可能翻的那种,而且很多还给删了)emm。慢慢总结回来吧,竟然错在了这里:pushdown里面没有更新tag原创 2021-11-12 10:56:37 · 769 阅读 · 0 评论 -
2021牛客暑期多校训练营8-D.OR(二进制)
传送门题意:题解:2.1 二进制的题目应该首先思考二进制方法去做代码:#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5;long long n, b[N], c[N];long long ans;int main() { cin >> n; for (int i = 2; i <= n; i++) cin >> b[i]; for原创 2021-08-09 19:15:28 · 135 阅读 · 0 评论 -
cf1555 E. Boring Segments(尺取&线段树&维护区间最小值)
总结&收获又手写了一遍线段树,熟悉了很多唉,不要怕。因为数据结构不是很熟悉,导致以为这个题会用到我不会的知识,然后就退缩了emm(其实用不到我以为要用的知识,但是我就是溜了emm)。题目传送门题意:给定n个线段,一个数m。每个线段有[l,r]和w,分别表示可以通行的区间以及价值。求能在[1,m]通行的线段组的w的最小极差值。题解:3.1 竟然忘了线段树能维护最小值emm3.2 [1,2]和[3,4]不能在[1,4]通行!所以不能维护原来的区间,区间应该做一些处理:r--(画一下原创 2021-07-31 10:41:23 · 213 阅读 · 0 评论 -
cf1557-C. Moamen and XOR(二进制,排列组合,pow)
传送门题意:给定n,k,求数组所有元素为非负数且<2^k,且满足条件的数组个数。题解:2.1 从高位到低位,分为平局和必胜,然后找规律。2.2 注意要分情况讨论emm,我大意的认为某一位都为1(更高位1的个数相等)的话一定胜利,要分奇偶讨论!2.3 pow(a,p,mod)和pow(a,p)为什么pow(2,200000)是错的???而pow(2,200000,mod)就是对的。不纠结,但是一定要注意!!!破案了,pow和内置函数冲突了,改成qpow(a,p)就没有一点点问题emm原创 2021-08-10 09:20:48 · 487 阅读 · 0 评论 -
日常训练(二进制,数位)——2021-06-06
1.(题解传送门)要变强,不空喊,ak题目,继续向前。:背包DP优化+bitset应用2.D. Powerful Ksenia:3.D. XOR-gun:4.C. Square Subsets:原创 2021-06-06 10:42:26 · 121 阅读 · 2 评论