- 博客(48)
- 收藏
- 关注
原创 排队接水(贪心)
题目题目描述有n个人在一个水龙头前排队接水,假如每个人接水的时间为ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。(冒泡泡)输入第一行:n(n<=1000)第二行:第一个人到第n个人每人的接水时间t1,t2,…tn,每个数据之间有一个空格输出第一行:一种排队顺序,即1到n的一种排列;第二行:这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。样...
2020-04-18 22:27:11
986
原创 [NOI2015]软件包管理器
传送门分析因为安装一个软件包要把它前面的都安装,所以其实是在一棵树中,点x到根节点都要安装。同理,删除一个软件包就是删除x及其子树。这样,我们就可以用树剖来解决了。改变的数量就是上次的结点数与现在的结点数的差的绝对值。(有点绕)代码#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#de...
2020-04-18 19:53:54
327
原创 POJ2406 Power Strings(Hash)
传送门分析枚举子串的长度,然后判断是否后面的没一段都与子串相等。用字符串Hash判断是否相等。代码#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define full(a,b) memset(a,b,sizeof a)#define ll long long#define ui u...
2020-04-18 19:35:34
271
原创 图书管理(Hash)
题目题目描述图书管理是一件十分繁杂的工作,图书馆每天都会有许多新书缴入,为了更方便管理图书(以便于帮助想要结束的客人快速查找是否有他们所需要的书),我们需要设计一个图书朝着系统,该系统需要支持两种操作:1)add(s),表示新加入一本书名为s的图书;2)find(s),表示查询是否存在一本书名为s的图书;输入第一行包括一个正整数n(n≤30000),表示操作数。以下n行,每行所给出两...
2020-04-18 19:25:52
255
原创 [POI2010]KOR-Beads(Hash)
传送门分析找不同的子串->字符串Hash这里因为子串可以反转,所以前缀后缀Hash值。在找是否重复时不能直接用循环,会超时。有2种方法:set和Hash表。因为set是STL中的函数,所以我用的是Hash表来实现。这里要注意一点,在初始化Hash表时不用memset,只需要初始化上次用过的即可。(详见代码)输出k用vector统计。代码#include<bits/s...
2020-04-18 19:15:11
141
原创 Hash表
引入Hash表是在Hash字符串的思想上,传入几个参数通过一个函数求得Hash值。这样就可以把本来需要的大量空间压缩成小空间。通常步骤如下:1: 创建一个F函数,用来通过参数获得Hash值2: 建立Hash数组,相当于vis数组。3: 插入Hash值和询问某Hash值但是,Hash值虽然对数组大小进行了压缩,但是这样就会存在Hash冲突。也就是参数明明不相同,但Hash值却相同,这...
2020-04-15 17:59:16
93
原创 2020 USACO OPEN--Sliver
T1题目描述由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。为了限制疾病的传播,Farmer John 的 N 头奶牛(2≤N≤10^5)(2≤N≤105)决定践行“社交距离”,分散到农场的各处。农场的形状如一维数轴,上有 M 个互不相交的区间(1≤M≤10^5)(1≤M≤105),其中有可用来放牧的青草。奶牛们想要使她们位于不同...
2020-04-13 21:20:22
779
原创 二叉树输出(凹入表示法)
题目题目描述树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点 的长并等于它的左右子树的长度之和。一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始:每行输出若干个结点字符(相同字符的个数等于该结点长度),如果该结点有左子树就递归输出左子树;如果该结点有右子树就递...
2020-04-11 22:32:32
9479
原创 【bzoj 3555】[Ctsc2014]企鹅QQ
传送门分析求去掉一个字符多少字符串相等。和friends有点像,只是多个字符串在比较。我们可以枚举删除的点,把剩下的hash值用一个数组来存,把数组排个序,相同的hash值肯定排在一起,加上前面与他相等的即可。代码#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define full(a...
2020-04-10 22:13:30
112
原创 「BZOJ3916」friends(Hash)
题目题目描述有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S.输入第一行一个数N,表示U的长度.第二行一个字符串U,保证U由大写字母组成输出输出一行,若S不存在,输出"NOT POSSIBLE".若S不唯一,输出"NOT UNIQUE".否则输出S.样例输入7ABCXABC...
2020-04-09 22:02:19
254
原创 快读快输
引入在做题中,有时可能算法没问题,但是时间有超限了一点,这个时候有可能是读入太慢的原因,(其实是因为题目太毒瘤了!)那么这个时候我们就应该优化读入速度了。因此有了快读。快读在计算机中,字符读入比读入数字更快,所以我们可以通过读入字符再转换为数字来提升读入速度。代码int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||...
2020-04-08 22:33:26
934
原创 radar installation(贪心+公式)
题目题目描述假设陆地的海岸线是一条无限延长的直线,海岛是一个个的点,现需要在海岸线上安装雷达,使整个雷达系统能够覆盖到所有的海岛。雷达所能覆盖的区域是以雷达为圆心半径为d的圆,我们用指标坐标系来描述,海岸线就是x轴,现在给出每个海岛的坐标与雷达的半径d,请编写一个程序计算出最少需要多少个雷达才能够将所有海岛全部覆盖?输入输入将会有多组数据,每组数据第一行为n (1<=n<=10...
2020-04-08 22:06:49
354
原创 喷水装置(贪心+公式)
题目题目描述长 L 米,宽 W 米的草坪里装有 n 个浇灌喷头。每个喷头都装在草坪中心线上(离两边各 w/2 米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?输入输入包含若干组测试数据。第一行一个整数 T 表示数据组数;每组数据的第一行是整数n 、L 和 W;接下来的 N 行,每行包含两个整数...
2020-04-08 21:45:35
448
原创 「USACO2007JAN」Protecting the Flowers(贪心)
题目传送门分析贪心。假设有两头牛i,j,若先赶走i,则j的贡献为d[j]*t[i];若先赶走j,则i的贡献为d[i]*t[j].当d[i]*t[j]<d[j]*t[i]时,先赶走J最优。为了避免乘法结果太大,贪心公式应为:d[i]/t[i]<d[j]/t[j]。代码#include<bits/stdc++.h>using namespace std;...
2020-04-08 17:30:48
292
原创 大神排队--贪心
题目题目描述现在共有n个同学要排成一列,每个同学有两个属性:影响力ai和承受能力bi。给一个同学造成的心理创伤等于所有在他前面的影响力之和减去他的承受能力。请安排一下排队顺序,尽量使受到心理创伤最大的同学少受创伤。输入第一行是整数n,表示同学人数。第2~n+1,每行两个自然数,分别是该同学的影响力和承受能力输出输出1行1个整数,为你安排的顺序中受到心理创伤最大的同学受到的创伤。样...
2020-04-07 22:18:39
2187
原创 整数区间--贪心
题目题目描述请编写完成以下任务: 1、从文件中读取闭区间的个数及它们的描述; 2、找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素的个数。输入首行包括区间的数目n,1<=n<=10000接下来n行,每行包括两个整数a,b,两个数之间用一空格隔开,0<=a<=b<=10000,它们是某一区间的开始值...
2020-04-07 22:10:21
418
原创 活动选择--贪心
题目题目描述假设有一个需要使用某一资源的n个活动所组成的集合S,S={1,…,n}。该资源一次只能被一个活动所占用,每一个活动有一个开始时间bi和结束时间ei(bi<=ei)。若bi>=ej或bj>=ei,则称活动i和活动j兼容。你的任务是:选择由互相兼容的活动所组成的最大集合。输入共n+1行,其中第1行为n,第2行到第n+1行表示n个活动的开始时间和结束时间(中间用空格...
2020-04-07 22:05:12
702
原创 区间覆盖--贪心
题目题目描述数轴上有n个闭区间[ai,bi],选取尽量少的区间覆盖一条指定线段[s,t]。输入第一行n(n<1000000)之后n行,每行两个数分别为ai,bi最后一行为s t输出最少需要选择的区间个数,如果无解则输出”no solution!”样例输入31 32 43 52 2样例输出1分析经典的贪心题,把起点从小到大排序即可。(但有些坑)代码#in...
2020-04-07 20:14:53
338
原创 数组初始化
引入在很多时候,我们都会把数组初始化成指定值,方便后面计算。但是,数组初始化关系到程序运行速度和代码整洁度。下面介绍3种常见的数组初始化方式。1.for循环for循环一个是最简单易学的方式了,一个初学者都应该会。代码#include<bits/stdc++.h>using namespace std;#define N 105int arr[N];int main(...
2020-04-04 20:04:41
306
原创 二分
引入一个递增序列,求值为X的的下标。可以用一遍循环A(水)。升级,有Q次询问值为X的下标。那么这时一遍循环就会超时。注意,这是一个递增序列,∴我们可以采用二分的思想,每次查找都取中间值比大小,如果mid小了,答案就在【mid+1~R】,否则就在【L ~ mid-1】。总会有某一时刻mid=X,这时就找到答案了。时间复杂度O(qlogn)。例题题目描述给出有n个元素的由小到大的序列,请...
2020-03-21 20:48:26
1091
原创 快速幂
引入求N的M次方%Q。有次方,可能会需要高精度,但是结果又%Q,∴可以根据同余,边算乘方边取模。我们可以用分治解决。例题P1226 【模板】快速幂||取余运算分析快速幂裸题。代码#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define full(a,b) memset(a,b...
2020-03-21 17:32:22
89
原创 「NOIP2013」货车运输--kruskal+树上ST
传送门分析∵两座城市之间可能有多条道路,∴我们只需要保留一条最大的边即可,用kruskal实现。∵求最大载重是多少,∴用一个树上ST。如果货车不能到达目的地,即起点和终点不在同一棵树上,并查集判断即可。代码#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;#define INF 0x3f...
2020-03-21 17:17:11
126
原创 水题考试
T2问题 B: 物资支援清单时间限制: 1 Sec 内存限制: 128 MB提交: 263 解决: 61[提交][状态][讨论版]题目描述为支援湖北,社会各界不断向湖北资助了各类物资。为了明确各个物资支援情况,你需要将物资清单进行排序。每项物资数据有物资编号、物资单价、物资数量构成。先按照总价值从高到低排序,如果两项物资相同按照单价从高到低排序,如果单价和总价值都相同,规定物资编号...
2020-03-18 20:02:51
158
原创 生成树--kruskal
引入现在有一个联通图,有N个点,M条边,并且会有重边,求可以使任意两点都联通的边的最小/最大权值。其实这个问题就是求最小/最大生成树。下面以最小生成树为例,作一下分析。第一,其实我们可以用贪心的思想,要权值和最小,则每条边就要最小,所以我们可以先把边权排个序。第二,要任意两点都联通,有些边就不能不选,如果这条边的两个端点还未连接就必须要选了。但不是要边权最小吗?我们是先排了序,所以答案一...
2020-03-17 21:45:53
110
原创 并查集
引入一些问题中,会询问多个量的关系,并且量与量还有传递性,如果我们需要把两个量联系起来,就需要使用并查集了。并查集是靠维护树来实现的。我们知道,在树中,若X能到Y且Y能到Z,则X能到Z,也具有传递性。那么如果A与B有联系,就可以在AB之间建立一条边。在询问关系时就看AB两棵树的根节点相不相同即可。但是会一个问题,我们要频繁的查找根节点,例题...
2020-03-16 22:23:49
168
原创 线段树--扫描线
引入扫描线一般是用在求图形面积上,由于图形会重合,而数据范围又太大,这时就要用扫描线了。由于扫描线需要修改区间,所以要使用线段树–lazy标记还有一些小技巧。例题题目描述桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。输入有多组测试数据。每组测试数据输入第一行为一个数N,表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右...
2020-03-14 22:15:25
110
原创 线段树--合并区间
引入合并区间其实就是在线段树–lazy标记的基础上,每个点储存多个区间信息。在修改时就需要合并区间。例题P2894 [USACO08FEB]Hotel G分析住店和退房其实就是修改区间,但怎么查找连续为0的区间呢?这就需要合并区间了。我们可以用lm[k]表示从左数连续为0的长度,rm[k]表示从右数连续为0的区间长度,m[k]表示区间[l~r]的连续为0的长度。如下丑图:那么我们...
2020-03-14 20:53:47
253
原创 分层图
引入在有一些图论问题中,图是动态的,或是有多个阶段的,这时我们就需要把图分层。分层的方法有两种:dp和 增加图中的点。但加点空间要大一点,代码少一点。两者是可以互换的。例题1(dp实现)P4822 [BJWC2012]冻结分析像dp一样,先后求出用1,2,3…k次卡片的时间。只不过用spfa实现。代码#include<bits/stdc++.h>using name...
2020-03-14 18:21:24
169
原创 高精度
引入在数字运算中,有时候a*b连long long 都装不下,这个适合,就需要用到高精度了。例题1P2955 [USACO09OCT]Even? Odd? G分析判断一个数的奇偶,即判断能否被2整除,其实也就只需要判断末位数字是否为2的倍数。代码#include<bits/stdc++.h>using namespace std;int main(){ int n;...
2020-03-14 13:37:07
138
原创 tarjan--点双连通分量
引入点双连通分量和边双连通分量差不多,但是要处理割点(割点可能被多个点双连通分量包含),割点不应该属于任何一个点双连通分量,所以割点的编号为-1。实现方法:1 tarjan求割点2 dfs求点双连通分量例题「BZOJ2730」矿场搭建分析...
2020-03-04 19:03:34
206
原创 tarjan--边双连通分量
引入所谓边双联通分量,其实有点像割边+强联通分量,做法是:1求出桥2dfs一遍,并且不经过桥,这样刚好把图分成了几个边双联通分量。例题 [USACO06JAN]冗余路径Redundant Paths分析我们先用tarjan求出边双连通分量,那么每个边双连通分量中任意两点一定不止一条路(没有桥),那么如果两个点不在同一个边双连通分量里呢?这时我们就需要建边了,而在哪个边双连通分量里...
2020-03-01 20:17:48
1020
原创 tarjan--割边
引入割边是指,在无向图中,去掉某一边,图不联通,那么这条边就是割边(或叫作桥)。还是用tarjan实现。例题旅游航道题目描述旅游局开设了在S星团的旅游业务。旅游线路四通八达,它们保证了任意两个星球可以通过航道到达。但是最近太空飞船有些老旧,财政也出现了困难,旅游局长决定停用一些航道。如果停用的航道使得一些星球不能到达,那么这条航道不能停用。现在航道太多了,局长想找你帮忙找出不能停用的航...
2020-03-01 19:27:48
219
原创 tarjan---割点
引入割点是指在无向图中,割去一个点,图不联通。这种问题仍然用tarjan解决。例题「POJ1144」Network分析割点裸题代码#include<bits/stdc++.h>using namespace std;#define N 105#define INF 0x3f3f3f3f int dfn[N],low[N],num,root,spot[N];in...
2020-02-29 22:41:08
93
原创 tarjan---强连通分量
引入给出一个图,有可能会有环,所以我们得把一个环缩成一个点,这时就可以用tarjan缩点。例题「USACO2003FALL」Popular Cows题目描述每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢...
2020-02-29 22:14:35
124
原创 ST表
引入如果我们想求静态数组的最大或最小值,则可以采用ST表。ST表采用的思想是倍增思想和DP。用f[i][j]表示[i~i+2的j次方]中的最值。则f[i][j]=max(f[i][j-1],f[i+(1<<j)][j-1])。也就是中分取max。求【x~y】的最值:k=log2(y-x+1);max(f[x][k],f[y-(1<<k)+1][k]);其实就是...
2020-02-29 21:18:41
103
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人