随笔分类 - 【Algo】数据结构
数据结构相关问题
摘要:题目描述 "D. Mishka and Interesting sum" 的意思就是给出一个数组,以及若干询问,每次询问某个区间[L, R]之间所有出现过偶数次的数字的异或和。 这个东西乍看很像是经典问题,一列数字中所有数字出现偶数次,除了一个数字只出现一次,找出那个只出现过一次的数字。然而这个问题
阅读全文
摘要:题目链接:https://leetcode.com/problems/top-k-frequent-elements/ 最近在专门学java 8的特性,这题我主要是用来练一下写java 8的,题目的算法可以写个基于堆的nlog(k),这个没什么好多说的了。 不保证我的java 8程序是最简洁的,我很
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/675/D 题目大意是将一个没有相同数字的数列中的数字依次插入到二叉搜索树中,问除了第一个数字以外,其他数字的父亲节点是哪个数字。 求每个数字之前最小的比它大的数字以及最大的比它小的数字。然后看那两个数字哪个
阅读全文
摘要:题目链接:https://csacademy.com/contest/arhiva/#task/swap_pairing/ 大意是给2*n个包含n种数字,每种数字出现恰好2次的数列,每一步操作可以交换相邻的两个数字,问最少需要操作多少次,可以使得所有的同种数字都相邻。 我的做法是考虑不同的数对的数字
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段。 方法是对所有线段的端点值离散化,按照左端点从大到小排序,顺着这个顺序处理所有线段,那么满足在它内部的线段一定是之前已经扫到
阅读全文
摘要:4月4日,应学弟要求去了次学校给小同学们讲了一堂课,其实讲的挺内容挺杂的,但是目的是引出LCA算法。 现在整理一下当天讲课的主要内容: 开始并没有直接引出LCA问题,而是讲了RMQ(Range Minimum/Maximum Query)问题。 RMQ指的是对于给定的一个数组,每一次询问一个区间[L
阅读全文
摘要:题目链接:http://codeforces.com/contest/650/problem/D 大意是给一个数组,若干询问,每一次把一个数字改为另一个数字,问当前数组最长上升子序列,询问之间是独立的。 注意到:假设初始数组的LIS长度为len。如果某一个位置的数字属于所有LIS,那么即便这个位置的
阅读全文
摘要:题目链接:http://codeforces.com/contest/474/problem/F 一个数组,每一次询问一个区间中有多少个数字可以整除其他所有区间内的数字。 能够整除其他所有数字的数一定是这些数字的gcd,所以可以用一个线段树来查询区间gcd。 接着需要统计区间内这个数字的出现个数,在
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/558/E 给一个字符串,每次对一个区间内的子串进行升序或者降序的排列,问最后字符串什么样子。 对于字符串排序,计数排序是比一般的排序要快的,但是仍然不能解决本问题。 建立26个线段树,用于统计某个字符在某个
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/633/G 大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的质数。 第一种操作非常熟悉了,把每个节点dfs过程中的pre和post做出来,对序列做线段树。维护取
阅读全文
摘要:大意是有n段路,每一段路有个值a,通过每一端路需要1s,如果通过这一段路时刻t为a的倍数,则需要等待1s再走,也就是需要2s通过。 比较头疼的就是相邻两个数之间会因为数字不同制约,一开始想a的范围是2-6,处理这几个数字互相之间的关系,还是想岔了。 正解应当是开60个线段树,因为2-6的LCM是60
阅读全文
摘要:无意看到的LeetCode新题,不算太简单,大意是给一个数组,询问多少区间和在某个[L,R]之内。首先做出前缀和,将问题转为数组中多少A[j]-A[i] (j>i)在范围内。 有一种基于归并排序的做法,在每次归并完左右两个子区间后,当前区间两部分分别都已经排序完毕,基于有序这一点,扫描后半段区间,对
阅读全文
摘要:DescriptionN个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a >1)); sum[rt>1); add[rt=r){ add[rt]+=c; sum[rt]+=(l-r+1)*c; return; } int m=(l+r)>>1; PushDown(rt,r-l+1); if (Lm) update(L,R,c,m+1,r,rt>1; PushDown(rt,r-l+1); solve(l,m,rt<<1); solve(m+1,r,r...
阅读全文

浙公网安备 33010602011771号