基础算法学习笔记(状态空间)一、状态空间1、定义(什么是状态空间):一个实际问
接下来 N-1N−1 行每行包含两个正整数 x, yx,y,表示 xx 结点和 yy 结点之间有一条直接连接的边(数
problem给出一个连通无向图,判断它的最小生成树是否唯一如果唯一,输出生成树的大小,否则输出”Not Unique!”solution直接求非严格次小生成树如果次小生成树等于最小生成树则说明最小生成树不唯一,否则最小生成树一定是唯一的vector会TLE。。。codes#include<iostream> #include<algorithm> using namesp
problem已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和solution区间修改+区间查询。 维护两个LazyTagcodes#include<iostream> #include<algorithm> using namespace std; const int maxn = 1000
pr
problem给定一个长为n的序列,m次询问每次询问有3种操作 1、一段区间全部乘一个值 2、一段区间全部加一个值 3、询问一段区间和%Psolution不就一颗线段树么,看朕10分钟A掉。。。 30分钟过后:md我脑残了吧,连线段树都写不来了?还爆栈??? 1小时过后:我靠,WA什么鬼,样例是水做的么? 2小时过后:什么垃圾题,还不让下数据。我用线段树模板题调。 3小时过后:朕今天
problemD - People on a Line / Time Limit: 2 sec / Memory Limit: 256 MB Score : 400 points Problem Statement There are N people standing on the x -axis. Let the coordinate of Person i be x i . For ever
Algorithm名称:树上启发式合并, dsu on tree, 静态链分治用处:一般用来解决一类不带修改的子树查询问题核心思想为:利用重链剖分的性质优化子树贡献的计算。前置知识:启发式合并,最常见的就是并查集的按秩合并了,有带按秩合并的并查集中,对于两个大小不一样的集合,我们将小的集合合并到大的集合中,而不是将大的集合合并到小的集合中。让高度小的树成为高度较大的树的子树,这个优化可以称为启发式
ProblemAtlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33064 Accepted: 11454 DescriptionThere are several ancient Greek texts that contain descriptions of the fabled island Atlanti
problemsolution题目:有n个数,多次询问一个区间[L,R]中第k小的值是多少。 思路:查询[1,n]中的第k小值: 先对数据进行离散化,然后按值域建立线段树,线段树中维护某个值域中的元素个数, 在线段树的 每个结点上记录这一个值域中的元素个数 ,那么要寻找第k小值,从根结点开始处理,若左儿子中表示的元素个数大于等于k,那么我们递归的处理左儿子,寻找左儿子中第k小的数,若左儿子中
problemD1. Mocha and Diana (Easy Version) time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output This is the easy version of the problem. The only dif
problemD2. Mocha and Diana (Hard Version) time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output This is the hard version of the problem. The only di
题意:n只队伍参加两轮比赛,给出第一轮结束后每个队的分数,以及第2论第i名能获得的分数。求第i只队伍的最好名次和最差名次(允许同分名次并列)思路:对于最高排名,先给它最大的得分,再给剩下的n-1个队,去找能否让其得分<=sc,把所有的都找出来,答案就是补集。对于最低排名,先给它最小的得分,在去剩下的n-1个队里找,如果得分直接比它大,那没救了直接更新,如果得分比sc小,就去分数里从大到小找,
F Train Wreck题意:给出长为2n的括号序列,()分别表示放入站台和拿出,以及n辆火车的颜色。求构造一个放入序列,满足不存在同一时刻站台内的颜色序列相同思路:将栈操作视为树,要求转化为给每一个节点染色,使得从根到每一个节点的链所构 成的颜色序列两两不同。注意到两个都在第i 层的节点,如果它们的父亲不同,则从根 到它们父亲的链所构成的颜色序列不同,这使得从根到它们的链所构成的颜色序列一定
1003 Ink on paper题意:给出平面中的n个点,每个点每秒向外扩散0.5cm,求多少时间后所有点的点会连在一起,输出时间的平方。思路:其实是很简单的最小生成树板子,Kruskal或Prim都行大概O(nlogn),但是比赛的时候没想到。然后写了个二分答案,二分时间的平方,每次n^2枚举所有的点对建图,并查集维护联通性check时间是否可行,复杂度大概O(n^2logn),防止超时可以提
E Eyjafjalla题意:题意:给定一个以1为根的有根树,孩子的点权小于父亲的点权。 多次询问,每次询问包含x节点的权值范围为[l, r] 的极大连通块的大小。思路:病毒传播可以看作两个阶段,第一个阶段先上升到最高的一个节点p(p的温度大于r),第二阶段感染p的子树中所有温度大于l的城市。第一阶段可以通过倍增法求得p第二阶段相当于在p的子树中查询权值大于l的节点个数,根据每个节点的dfs序建立
1004 Counting Stars题意:给出一个长为n的序列(1e5),支持3种操作: 1:查询[l,r]的区间和 2:修改[l,r]中每个数,都减去lowbit(x) 3:修改[l,r]中每个数,都加上2^k, 2^k<=ai思路:对于操作2,减去lowbit(x)相当于去掉最后一位的1。可以发现,不断删1后,一个数最多删32次就会变为0,此后修改查询都是0。所以我们可以打个tag表示
H Hopping Rabbit题意:#include<bits/stdc++.h>using namespace std;const int maxn = 5e5+10;//扫描线:从左往右扫struct Scan{ int l, r, x;};vector<Scan>v[maxn]; //v[i]:第i列的线段(自带桶排序)void add(int x1, int x
1008 Maximal submatrix题意:给出一个n*m的矩阵,求一个面积最大的子矩阵满足子矩阵的每一列都是单调不递减的思路:转化为01矩阵 每个位置1代表该位是否比上面一位小,然后用单调栈求最大01矩阵 复杂度O(n^2)#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn
J Jewels题意:给出n个点的位置x,y,z以及速度v,从第t=0秒开始打捞,打捞点i的代价为x^2+y^2+(z+t*v)^2,求打捞所有点的最小代价。思路:所有的宝石肯定都在 0~n-1 这 n 个时刻被挖掉,那么问题就变成一个最小权匹配了,一边是时刻,一边是宝石,边权就是在这个时刻挖这个宝石所消耗的体力值。最小匹配权,可以用KM(即匈牙利算法),也可以跑费用流。但是神仙们直接乱搞,,反正
1006 Xor sum题意:给出一个长度为n的序列,求一个最短连续子序列满足异或和大于等于k。n<1e5。思路:参考CF665E,求序列a中有多少个异或和大于等于k的子序列,枚举所有的子序列,维护最小长度即可。首先因为区间异或和,且异或满足性质a^b^a==b,所以可以想到异或前缀和,s[l~r] = s[r]^s[l-1]。因为01字典树可以查找树中与x异或后最大的值,所以维护异或前缀和
1009 KD-Graph题意:给出一张n个点m条边的加权无向图和一个整数K,求一个数字D可以将图分为K组,组内任意两点存在路径且小于等于D,组外不存在小于等于D的路径。不存在D输出-1。思路:将边按权值从小到大排序,每一阶段取出同权值的所有边,将这些边的端点用并查集两两合并,若某一阶段的全部边合并完,并查集数量为k,则当前阶段合并边的权值就是答案,否则输出-1。#include<bits/
1002 Kanade Loves Maze Designing 35.26%(880/2496)题意:给出一棵n个点的树,每个点有权值ci,记A(i,j)表示点i和j之间路径上的不同权值个数,求f(i,x)=∑(j=1->n) A(i,j)*x^{j−1},x=19560929, mod1=1e9+7, mod2=1e9+9.思路:因为n<2e3,可以n^2做,所以直接dfs暴力把所
K King of Range题意:给出一个长为n的序列,m次操作,每次操作求对于一个指定的k,原序列存在多少个连续子序列,满足该区间内最大值减最小值严格大于k。思路:令 Ri 为 l=i 时,满足极差大于 k 的最小的 r,如果不存在则记 Ri = n+1。那么显然有 R1 ≤ R2 ≤ … ≤ Rn。首先可以用 Set 之类的 STL 工具来快速维护极差,所以可以在均摊 O(log n) 的时
F xay loves trees题意:给出两棵树,由这两棵树根据规则可以生成一个图,规则如下:如果u , v在第一棵树中满足其中一个点是另一个点祖先且最终所有所选的点都互相联通,在第二棵树中满足两个点都不是另外一个点的祖先,则u, v之间连一条边。求最后生成的图中最大的团。(团为子图中的完全图)思路:原题来源,Codeforces Round #722 (Div. 1) C. Trees of
problemsolution1 - ACvector可以AC。lower_bound找第一个大于等于x的,upper_bound找第一个大于x的。#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T; cin&g
problem链接:https://ac.nowcoder.com/acm/problem/15121 来源:牛客网Call to your teacher 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 从实验室出来后,你忽然发现你居然把自己的电脑落在了实验室里,但是实验室的老师已经把大门锁
problemB. Love Songtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutp
problemsolution发现除了起点和终点,剩下所有点周围的边都会被恰经过偶数次,所以这些点初始连向了偶数
1001 畅通工程续 HDOJ1874 裸Dijkstra畅通工程续Time Limit : 3000/1000ms (Java/Other) Memory Limit : 3
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号