- 博客(38)
- 收藏
- 关注
原创 Drunk Passenger 2021台湾icpc
假设有n个人(1)我们知道对于醉汉,如果他选择我们的位置的话,那就一定会使得我们的位置被占掉,而醉汉不能选择自己的位置;所以这种情况下位置被占据的概率是1/(n-1)。(2)然后另一种情况就是他会占据其他人的位置。我们可以推出的是,假设现在的排队情况是 [醉汉,1,2,3,,,,x,,,自己],此时醉汉占据了x的位置,那么从1号到x-1这个区间内的人都是会坐在原位,因为题目中有说,如果位置没有被占据就会归回原位,那也就说明了我们需要开始讨论的是从x到自己这个队列中的人。我们从小到大去推。我
2022-01-14 00:00:02
357
原创 Football Training Camp
点我试试看(1009: 湖南省第十三届大学生计算机程序设计竞赛(HNCPC2017))这道题用到了之前写题时用过的结论。证明:1.一个数组,对于数组中的数都有一个都有一个开心值,我们想要通过打乱顺序,使得每一个位置的值发生变化,就比如说:1 1 2 3变为 2 3 1 1 那我们就成功了。结论是:对于这个数组中出现最多的数的个数记为Max,总共有sum,个数,如果 Max <= sum/2,那我们总可以找出一种方法值...
2021-10-23 19:02:09
234
1
原创 Counting Sequences I
传送门有两种方法:方法一:首先证明一些东西1.对于一个n,构成这个序列中的数的最大值不会超过n:假设存在一个n+1(这个保证了乘积尽可能小),剩下的都是1(共有(n-1)个),那么要满足的方程应该是:(n+1) + (n-1) = (n+1)*1得出n=1那么说明n > 1时如果存在一个n+1那么至少存在一个大于1的数,否则两边不相等,那么我们假设就只有一个2剩下都是1,那么应该满足方程:(n+1) + 2 + (n-2) == (n+1)*22*n +1.
2021-10-22 22:57:49
234
原创 Stone game(dp)
这道题是01背包的变形,唉好久没写dp背包都已经忘记了。传送门dp[j]表示我们选出石墩重量为j的方案数。这道题要求满足条件所有石头总重sum,对于挑选的重量sum'满足,在这对里面随便挑选一个石头重量为x,都能满足 sum' - x <= sum - sum' 并且还满足 sum' >= sum - sum'那么我们可以用01背包的思想,我们枚举每一个sum'中最小的石头重量为x,那么对于一个sum到a[i]范围的sum'的重量为j, 那么我们就可以用 dp[j-a[i]...
2021-10-21 22:00:03
319
原创 zoto(2021“MINIEYE杯”中国大学生算法设计超级联赛(1))
这道题巧妙地运用到了分块和莫队两种算法的结合。对于1-n的每一个X都有一个w[i]来代表其高度,然后其实这道题就是在之前的普通莫队的基础上在你统计出来每一个只有多少个之后,再去数出在对定范围内的值有几种。对于每一个x轴上的移动,我们可以按莫队去计算,然后对于每一个查询,我们的答案可以用分块的思想去在sqrt(n)的时间内查询出来。其实这道题难得地方就在于思维转化,对于一个二维的查询,我们要把他降为一维,一个y其实就相当于是这个点的权重,想到这里这道题就迎刃而解了。时间复杂度等于莫队:Q*sq
2021-10-19 21:36:58
156
原创 P1197 [JSOI2008]星球大战(并查集)
好久没有写过并查集的题目了这道题首先根据题意模拟的话,就是删去一个点,然后把其相邻的边删去,数一下现在有几个连通块。但如果真要这样做的话复杂度太高,所以我们考虑反向一下,删边和点的话,我们就建边和建点。 这样我们就对每一条边排一个序,按照这条边相邻的两个点的最早删去时间反向去排。最不好理解的就是对于答案的得出,首先反向的话我们视每一个点都是一个连通块,但这时已经有k个点被删除了,所以用n-k,得出当前最多有多少个连通块,然后再用并查集把当前能连得点相连,能连就代表不是一个连通块,所以就把n--,减完
2021-10-19 12:27:51
143
原创 2021上海市省赛 K. Alice and Bob-2
为了此题,三天狂学SG,博弈饶我啊!!!首先说一下自己对于SG的理解.1.首先对于SG(C)=SG(A+B)=SG(A)^SG(B)这个定理知道就好了,具体怎么证我也不想知道这个的意思就是说对于一个游戏如果我们可以把它分成两个游戏,互相独立,那么我们想求当前这个游戏的SG值,就可以求出其子游戏的SG然后异或得到。就如同这道例题POJ 3537 Crosses and Crosses 在这道题里面我们对一个空格画×之后那么我们肯定不能再这个格左右相邻的两个格划×,因为这样对手直接就可以
2021-09-24 18:46:58
371
1
原创 2021上海省赛 H. 鸡哥的 AI 驾驶(二分答案)
只能说自己太菜了,真的完全想不到。如果说单纯的想找到这个相撞的组合是十分困难的。所以全局的考虑一下,如果有两个车相撞,那么说明这两个车的相对位置发生了改变。而我们要找的肯定他超过与之最近的不同型号的左或右的车,因为如果他要超车,那么肯定是先超过第一个然后在第二个,那么我们的任务就变成了找到某个时刻第一次有两个不同型号的车的相对位置发生了改变。那么我们就可以 二分答案 ,二分的标准即为时间。我们可以先把每个车在它之前的第一个与他型号不同的车的编号与在他之后的第一个编号不同的记录在L,R数组里...
2021-09-18 11:18:25
436
2
原创 2021上海市赛 B. 小 A 的卡牌游戏
这道题开始时觉得dp只能n^3的做法,只考虑贪心,但贪心也没选对方法,只能说这种贪心还是第一次见,涨芝士了。首先如果是只有两个数的话,那dp都不用了,直接贪心。这里先说一下只有两个数时,这里用到的贪心是,对于每一个pick,先把(b-a)差值更大的前b个选了,然后剩下a个都选a,我们只考虑选b的结果,对于一个pick,如果b>a那么我们选b是赚的,反之我们选b亏一些,所以选a就可以了。可以这样理解如果b-a>0那么我们尽可能选差值更大的,这样我们选b的收益更大,然后我们选b-
2021-09-17 22:03:05
430
1
原创 2021上海市赛-D Zztrans 的班级合照
首先要知道在对数排序之后,向两行里面放数的过程中,任何状态下第一行的个数不会小于第二行的个数。只要出现了下面的状态(第一行的个数少于第二行的个数),则之后怎么填都是违法的。所以就考虑是dp.dp[i][j]的含义是,填到第i个数时,第一行比第二行多j个的情况数。则将他们排好序之后,第一层循环时i,表示当前枚举到第i个数。第二层循环是j,即第一行比第二行多j的所有可能情况。第三层循环数k,表示将a[i]数给第一行k个,给第二行num-k个,那说明如果要转化成第一行比..
2021-09-17 20:20:12
247
原创 在安装ubuntu时的几个让人捉急的事项
1.要时刻注意你下载的时iso文件,别下了两个小时才知道时zip,等死吧!!(我是直接去官网上面下载的,个人觉得比镜像的慢不了多少)2.如果你的虚拟机进入到verifying the installing configuration就一直加载不好,(我有个同学等了一下午,太惨了),那说明你为虚拟机提供的内存太少了 :虚拟机——>设置——>内存——>设为2048就可以了3.VMware Workstation 与 Device/Credential Guard 不兼容..
2021-09-14 21:49:41
179
1
原创 Array Without Local Maximums
首先dp[i][j][k]表示当a[i]为j,与i-1关系为k时的可能情况:k=0表示a[i]<=a[i-1] k==1表示a[i]>a[i-1]则dp[i][j][0] 即为把所有大于j的数以及k == 0时的加和 最后再加上一个等于j的k == 1的情况dp[i[[j[[1] 即为把所有小于j的k == 0 或者 k == 1的数加和而对于a[i]已经确定了的数,则还按照上述方法,只是赋值时只付给j == a[i]的情况就可以了cf2000分的dp tql...
2021-09-14 11:20:13
114
原创 莫队(莫对QAQ)
其实我觉得莫队的思想和分块有一点想(在处理方法上),莫队的核心就在于用已知去在最少的开销下获取未知。先将整个序列分成块,然后进行排序,对于设定的L,R指针要想让他们每次走的步数最少,那么可以按左端点所在的区间按降序排列,然后相等时如果是奇数,就按右端点升序,否则就降序就相当于奇数时,右端点不断向右伸展,到偶时,右端点不断向左伸展,避免了来回的消耗。1.普通莫队(1)XOR and Favorite Number其实就是普通莫队的模板提#include <iostr..
2021-09-11 15:11:07
168
1
原创 分个块(我不排序)
分块的思想其实就是空间换时间,对于完整区间在查询时可简便查询,而对于不完整的区域,直接暴力查找即可。故查询时间最多就是2*(block)+(完整区间的数量);而总的时间只需要加上预处理的时间即可。所以做题时这个总的时间就需要再权衡一下,如果题目中查询次数较多可以考虑将区间大小适当的减小,否则就设成sqrt(n)。重点在于找到合适的存储方法。1.只涉及区间加法 传送门对于这个只有区间加法,对于完整的块,可以增设一个数组只用来存完整区间还需加的数,类似于线段树的lazy标记,所以...
2021-09-09 10:56:26
81
原创 AtCoder - arc072_a C - Sequence(思维题)
AtCoder - arc072_a C - Sequence对于最终成型的情况其各个前缀和有两种情况:要么奇数都是正数偶数都是负数,要么奇数都是负数偶数都是负数因此从前往后验证每一个前缀和对于现在这个前缀和如果不合法,就只能改变前面的数,或者当前这个数,而改变前面的数和改变当前这个数使其合法是等效的,其结果都是是当前这个前缀和合法,使后面的前缀和加上这些改变之后的数。而改变前面的数还有可能使前面的前缀和不合法,所以就只考虑改变当前这个数,于是利用贪心的思想,让其刚好成立,就是使其改变成-1或
2021-08-27 11:06:13
171
1
原创 B. Charmed by the Game(思维题tql)
B. Charmed by the Game其位分为发球和接球两种轮流的游戏设第一个人赢了a,第二个人赢了b次。x,y为两人可能的两种发球次数x=a+b>>1y=a+b-x以下为对于第一个人考虑的情况:也就是说第一个可能发x次球的情况下赢了a个球或发y次球的情况下赢了a个球。对于一种发球次数x,枚举第一个人在发球时赢得个数i,则第一个人的a,由发球时赢得i次,和接球时赢得a-i次构成。发球时赢得次数不超过发球次数x,接球时赢得次数不超过接球次数也就是其二个人发球次数y即
2021-08-26 15:15:45
366
原创 计算几何---
计算几何1.凸包1.凸包凸包可以想象成把一些散落在纸上的点用一个橡皮筋勒住,围成的多边形。andrew算法将散落的点按x,为第一,y为第二排序。先取正向取上面的点,然后再反向去下面的点围成的图形就是凸包。P3829 [SHOI2012]信用卡凸包#include <iostream>#include <algorithm>#include <cmath>using namespace std;#define x first#define y seco
2021-08-25 19:29:31
84
原创 美好高中时光
2021ccpc华为云挑战赛 B卷业务模型分析这道题用到了高中的知识:线性回归方程又回想起了当时算这种题的恐惧,数据又多,有时候还贼不好算。这里又遇到了。(熟悉的公式QAQ)所以知道了用这个这个公式,应该思路就很好想了,但依旧很恶心,写了2个小时。先根据线性回归方程求出 大致的 k,b。然后在误差范围内枚举,符合条件输出。(这里我把b的误差设为10的时候不行,得大一点,设成20才能过)#include <iostream>using namespace std;#defin
2021-08-23 18:31:29
92
原创 想到啥写啥
1.STL中有对于枚举全排列的函数但是用之前要对其先排序!!!!do{ for() if() goto ppp;///当这种情况不合适时跳到下一种情况 ppp:;}while(next_permutation(q,q+4));Evil Coordinate#include <iostream>#include <algorithm>#include <cstdio>#include <string>using namespace s
2021-08-23 15:27:44
136
原创 拓扑排序--
拓扑排序应用于有向图中,类似于逻辑图,然后根据已知条件排序。很形象的应用就是排队。正常思路就是将它们存入vector里面,找出一个入度为零的点,然后把他连得点入度减一,重复操作,如果最终 ans里面的值与n相同说明有解。如果不存在入度为0的点,说明有环。#include <iostream>#include <queue>#include <vector>#include <set>#include <cstdio>using n
2021-08-23 10:45:12
85
原创 Hafuman
Hafuman树多用于合并代价,以及模拟哈夫曼编码。构造哈夫曼树可以用优先队列和数组来实现。149. 荷马史诗时间复杂度O(nlogn)#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <vector>using namespace std;#define se second#define fi firsttype
2021-08-21 16:49:32
83
原创 Trie树
Trie树又可以称为字典树。顾名思义就是按照查字典的方法,存入与查询,时间复杂度都是O(1)级别.。Trie 可以用一个二维数组来存下当前节点的编号模板:int tr[maxn][30];void build(int x){ int p=0; for(int i = 30; i >= 0 ; i--){ if(!tr[p][u]) tr[p][u]=++t; p=tr[p][u]; }}int query(
2021-08-20 20:50:42
65
原创 Nim博弈
简单来讲 如果所有堆个数异或为0,后手胜 否则先手胜。将每一堆转化为二进制:只要将他们异或,然后找到相差的那个数,而那个数必然小于最大的那堆的个数,然后先手去掉那部分,就又为平衡的了。tql...
2021-08-19 09:40:28
53
原创 离散化----
对于范围很大,但实际用到的范围很小时,可以靠考虑离散化节省空间。数组:1.int tot=unique(a,a+n)-a;///unique返回的是把相邻重复的放到后面之后的前面的地址,-a之后是其不重复的大小,size()。2.vector<int>v;erase(unique(v,begin(),v.end()),v.end());///是重复的删除 erase(删除首地址,删除末地址)只能用于STL除了容器以外,还可以作用于stringstring ss="12345"
2021-08-18 15:51:16
75
原创 线段树 树状数组
线段树一般用与处理区间问题:#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=6e5+1;int tree[maxn],n,lazy[maxn];void pushdown(int p,int l,int r){ if(lazy[p]){ lazy[p<<1]=lazy[p];
2021-08-17 10:54:40
80
2
原创 数论-知识
欧拉函数:求不大于一个数的与其互质的数的个数1.如果只用求一个数的话int phi(int x){ int res=x; for(int i = 2; i <= x ; i++){ if(x%i == 0){ res=res/p*(p-1); while(x%i == 0) x/=i; } } if(x>1) res=res/x*(x-1);
2021-08-12 14:47:24
204
原创 LCA模板
void add(int u,int v,int w){ ed[cnt].w=w; ed[cnt].to=v; ed[cnt].Next=head[u]; head[u]=cnt++;}void DFS(int u){ pos[u]=++cnt; dpt[u]=dpt[fa[u][0]]+1; for(int i =head[u];~i;i=ed[i].Next){ int to=ed[i].to,w=ed[i].w;
2021-08-11 11:56:01
72
原创 最短路模板
SPFA(SLF+LLL)#include <iostream>#include <stdio.h>#include <string.h>#include <queue>using namespace std;const int N = 1e6+10,INF=0x3f3f3f3f;int head[N],n,m,dis[N],cnt,ans[N],vis[N];long long sum;struct node{ int to,Ne
2021-08-07 10:42:14
77
原创 最长上升子系列 最长下降升子序列 最长不上升子序列
#include <iostream>#include <algorithm>#include <limits.h>using namespace std;#define INF 0x3f3f3f3fint dp1[100],dp2[100],a[100],n,dp3[100]; dp1(上升) dp2(下降) dp3(不上升)int main(){ cin >> n ; for(int i= 0 ; i<n; i++){
2021-07-19 16:42:55
52
原创 python try语句
这种知识点真的太琐碎了,如果不去使用,很容易忘记,所以小菜鸡就把它写下来下次直接看QAQtry - excepttry: x = 1 print(1)except: print(2)try: x = y print(2)except: print(3)通过这两个比较可以知道,先执行try里面的语句,如果try语句没有问题,则不执行except,如果有问题,执行到有问题处停止,执行except的语句try-except(高级)try: x = y print(1)e
2021-07-01 22:35:03
202
原创 UVA-11624(同时进行版的BFS)
如果你还不知道火可能会有很多的话,快点回去吧,改一改说不定就是正确答案了(博主一直以为同时BFS不对而被迫去看了两次的答案才知道QAQ)这道题看到了肯定知道要用bfs,其实我的第一感觉也是想用两次BFS,但感觉那样有点太模板了,于是写了一个人与火同步的BFS大致思路:用一个struct 去存信息 (位置x,y) (id==1?人:火) (d:只表示人的已走步数(对于火没有意义))c1是标记人是否走过,c2是标记火是否到达对于每一秒,也就是这一秒中所有人该走的路以及火该走的路,先走人的再
2021-06-07 17:46:33
57
原创 线性筛法找素数
bool f[10000];void init(){ memset(f,true,sizeof(f)) f[0]=f[1]=false; for(int i = 2; i <= 100000; i++) if(f[i]) for(int j = i*2 ; j <= 100000; j+=i) f[j]=false;}
2021-06-05 11:20:16
51
原创 马拉车Manacher
马拉车算法我觉得还挺好理解的,只是不知道为什么我看其他博主对与len[i]所求的认为是以这个为中心的最远回文的字母到中心轴的距离。但最后却返回的是最大的len[i]-1。我对其进行了一些细微的修改,这里len[i]才是真正表示的以i为中心,会问最远的字母到其的距离,也就正好是回文字符串的真实长度。#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const i
2021-05-29 18:22:11
116
2
原创 二维数组进行sort排序
对于直接对二维数组排序的话应该是有几项就列几项。但这样太麻烦了。在这里给大家介绍一种方法(进行转化)int id[100],snow[100][100];#记得将这个二维数组设置为全局变量for(int i = 0 ; i < 3; i++){//这个就是把数据存储 for(int j = 0; j < 3; j++) { cin >> snow[i][j]; } id[i]=i;这个id存的是每一个二维数组的行数}sort(snow,snow+3,cmp)
2021-05-22 10:31:37
2360
原创 单调栈 HDU - 1506 POJ - 3250 POJ - 2796
单调栈单调栈的性质从字面意思上就是利用其单调性对元素进行入栈与出栈的操作的过程来达到所需的要求。因为其进行整个操作过程中只有出栈与入栈所以时间是O(n)。单调栈例题:<1> HDU - 1506:直方图是由在共同基线上排列的矩形序列组成的多边形。矩形具有相等的宽度,但可以具有不同的高度。请在直方图中计算最大矩形的面积,该直方图也是在公共基线上对齐的。#include <iostream>#include <string.h>#include <
2021-05-16 20:52:38
139
原创 AtCoder - abc141_e 题解
Given is a string S of length NFind the maximum length of a non-empty string that occurs twice or more in Sas contiguous substrings without overlapping.More formally, find the maximum positive integer lensuch that there exist integers l1 and l2 ( 1≤l1,
2021-04-30 22:33:07
307
2
原创 vector中如何查找元素的下标
用法总结: vector查找vector中元素的下标///第一种方法是用第一个元素地址减去查找元素地址vector<int> v;v.push_back(10);v.push_back(2);v.push_back(5);vector<int>::iterator it =find(v.begin(),v.end(),5);///it 在这里时返回了5(值)的指针,而不是其下标,即其地址printf("%d",*it);//可以输出5(值);vector&
2021-04-15 17:48:40
10961
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人