自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

原创 go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket

这是一个微服务影院票务系统,基于go-zero框架实现。

2023-02-09 21:22:50 851

原创 go语言实现的一个基于go-zero框架的微服务网盘系统butane-netdisk

基于go-zero框架的cloud-disk微服务网盘系统

2023-01-29 10:30:01 981

原创 二维线段树、二维树状数组模板

123

2022-07-25 10:37:21 306

原创 无向图的点化边操作

无向图的点化边操作:g[a].push_back({b,val[b]}),g[b].push_back({a,val[a]})这样建立两条双向边。例题

2022-01-21 17:52:06 196

转载 三分法模板

三分法模板:整数:int l = 1,r = 100;while(l < r) { int lmid = l + (r - l) / 3; int rmid = r - (r - l) / 3; lans = f(lmid),rans = f(rmid); // 求凹函数的极小值 if(lans <= rans) r = rmid - 1; else l = lmid + 1; // 求凸函数的极大值 if(lasn >

2021-11-13 22:49:58 222 1

转载 压九位高精模板

压九位高精模板typedef long long ll;struct Wint:vector<ll>{ const static ll BIT=1e9; Wint(ll n=0) {push_back(n);check();} Wint& operator=(const char* num) { int Len=strlen(num)-1; clear(); for(int i=Len;i>=0;i-=9)

2021-11-04 19:35:14 122

转载 线段树区间赋值+区间和查询

如题,代码如下:#include<bits/stdc++.h>using namespace std;const int maxn=1e5+50;struct node{ int l,r,sum,lazy;}tree[maxn<<2];void build(int p,int l,int r){ tree[p].l=l; tree[p].r=r; if(l==r){ tree[p].sum=1,tree[p].la

2021-11-03 23:02:08 710

原创 求n条线段形成的可能的交点数的问题

原题链接任意三点不交于一点,求n(<=700)条线段形成的可能的交点数。分析:与该题的不同之处在于是输出所有可能的交点数,直接打表会超时,而dp的时间复杂度是n^4,也会超时。由打表可知,不存在的交点数最多到31500,故打表与dp只需考虑到31500即可,之后的一定满足,直接输出即可。再结合bitset进行优化:将for(int j=0;j<=m;j++) for(int k=1;k<=n-i;k++) dp[i+k][j+k*i]|=dp[i][j];转换成for(int

2021-08-23 22:22:05 554

原创 关于维护双端序列中位数的问题

原题链接维护一个双端序列结构满足q(<=1e7)个操作,每个操作可能是:1、向右增加i(保证出现的i唯一);2、向左增加i;3、删除i元素;4、输出位置中位数(a⌈(i+1)/2⌉)。分析:类似用对顶堆维护权重中位数,我们可以用对顶双端序列维护位置中间数。构造双端序列lq、rq,使得rq的长度始终比lq的长度大1或者相等。这样中位数就始终是rq的首元素。对于删除操作,也可以用类似对顶堆的惰性操作,可以标记del[i]=1,等到了查询操作或者更新lq、rq相对长度这些需要判断i的存在性的情况且

2021-08-23 17:08:13 126

原创 求每个人可能的最好排名和最糟排名的问题

原题链接n(<=5e3)个人有n个初始分数a_i,现在给出一个新分数序列b_i,每人分配一个分数,求每个人可能的最好排名和最糟排名。分析:对a_i,b_i排序。先考虑最好排名情况:对第i个人,若此时符合排名p,则在有序的序列里后n-p(若i在这其中,则要加1)个人的总分数小于或等于a_i+b[n]的值,故对b数组去掉前p个人的分数,再与后n-p个a_i组合得到的即是符合该排名p的情况;若不符,则说明p应该更大。易知a_i越小,p一定越大,具有单调性,故可以用双指针法优化。最坏排名同理。i

2021-08-23 15:15:38 104

原创 求形成栈中的物品颜色排列在之前从未出现过的出入栈顺序对应的物品的问题

原题链接n(<=1e5)个物品,每个物品具有各自的颜色(可能相同),给出一串表示出入栈顺序的字符串,求出入栈顺序对应物品是什么,要求每次入栈形成栈中的物品颜色排列在之前从未出现过。分析:可以将问题转化成建立一棵树,使每个节点的下一层的所有子节点的颜色都不相同。入栈即是向下延伸一个节点,出栈则是回到上一个节点。根据贪心,每次插入节点,应该优先插入当前颜色出现次数最多的、在其他子节点未出现过的颜色,故用堆维护颜色出现次数,然后不断更新即可。char str[maxv];int cnt[maxv

2021-08-23 10:06:06 70

原创 关于一条线段最多能“碰”到多少个格子的问题

原题链接一张表格里,给出每个格子长度d与宽度w,求一条长度为圆周率的线段最多能“碰”到多少个格子。分析:若线段长度够长,易知最优方法是:1、要么经过min(d,w)长度且碰到2格;2、要么经过sqrt(d * d+w * w)长度且碰到3格。例外的情况就是最优方法是2,而剩下的长度十分接近只剩2次第1种情况或者只剩1次第1种情况;最优方法是1,而剩下的长度十分接近只剩2次第2种情况或者只剩1次第2种情况,故最先求出这四种答案,最终比较即可。double w,d;int main(){ i

2021-08-21 17:39:10 143

原创 未解算法题目合集

1、n-1个评委给A、B的成绩分别为数组a,b,求解a_n(<=h)、b_n(<=h)使得数组a和严格大于数组b和,且使a_n-b_n尽可能小。不知为什么答案给出的解法似乎是“非严格递减的”。原题链接ll a[maxn],b[maxn],h;int _,n,s,t;int main(){ scanf("%d",&_); while (_--){ scanf("%d%d%d%lld",&n,&s,&t,&h); n-

2021-08-19 22:48:15 124

原创 求蔓延病毒最多可以感染的城市数的问题

原题链接n(<=1e5)个城市与n-1条边与q(<=1e5)个询问,每个城市有各自温度,距城市1越远温度越低,每次询问从x城市开始,蔓延一个生存温度在[l,r]区间的病毒,问最多感染多少个城市。分析:以城市建树。对于每个询问,从城市x开始倍增向上到温度小于等于r的最高城市nowX,答案就是:nowX的子节点数目-nowX子节点中温度小于l的数目。求nowX子节点中温度小于l的数目,可以转换成求在nowX子节点中l的排名-1。所以用树套树(或主席树或划分树)维护原树即可求得[dfn[no

2021-08-18 22:28:57 84

原创 求有多少种长度为n的序列a满足加法与或运算条件的问题

原题链接问有多少种长度为n(<=1e5)的序列a,满足b[i]=a[i-1] or a[i],c[i]=a[i-1]+a[i]。分析:利用或运算与加法运算的联系:a|b=(a+b)-(a&b),得到序列d,使得d[i]=a[i-1] and a[i]。之后结合数组b与d,递推分析每个位的数字可能,即可得到答案。int b[maxv],c[maxv],d[maxv],tag[maxv][2];int main(){ int n,t,a,flag=1,temp; int

2021-08-16 17:42:22 236

原创 求所有的数字构成的不重复的数字的和的问题

原题链接现在有a[i]个i(0<i<10),求使用其中所有的数字构成的不重复的数字的和是多少。分析:由多重集的排列数为sum!/(a[1]!..a[9]!)。而“平均排列”的贡献为11…11(sum个1) * (1 * a[1]+…+9 * a[9]) /sum。故答案即为两者乘积。LL Qpow(LL a,LL b){ LL ans=1; for(;b;b>>=1){ if(b&1) ans=ans*a%mod; a=

2021-08-08 22:30:29 144

原创 关于将序列分成m(<=1e5)段中位数为b[i]的序列的问题

原题链接判断能否将长度为n(<=1e5)的序列a,分成m(<=1e5)段中位数为b[i]的序列。分析:先以b[i]为界线,将序列a分割成众多序列,选择其中长度最长的序列。若该序列的长度小于等于其他序列长度之和,那么易知可以以该序列作为中间序列,构造m段答案序列。若该序列的长度大于其他序列长度之和,则判断该序列分配给其他序列的数后剩余的数的数目,是否小于等于符合中位数小于该序列中的数的序列数目,若是则可以构造m段答案序列。struct Line{ int sum,id,now;

2021-08-08 18:00:02 92

原创 关于一个数组里的数赋值一个大数的情况分析的问题

原题链接关于数组中的数的一个情况:一个数组里的数,若赋值一个大数就会占更大的空间且消耗更多时间,若是0等小数则占更小空间且消耗更少时间。因此开一个空间很大的数组,若大部分数未赋值,则可能内存也不会超限可能不会超时。相反,若许多数赋值为较大的数字,则可能内存可能超限甚至在时间方面也可能超时。例如在下面求约数的代码里,若将在if语句里的“&&cnt[i*j]”去掉,则会超时,若将vector数组改成普通数组,则对应会内存超限。for(int i=1;i<=maxVal;i++){

2021-08-08 15:32:57 171

原创 求一些区间使得这些区间的交集是该m区间的并集的问题

原题链接给出m(<=1e3)个区间,区间可以是从l至n再到1至r(l>r),求一些区间使得这些区间的交集是该m区间的并集。分析:经分析将m个区间排序,易知答案即是:第一个区间的l与最后一个区间的r形成的区间、第二个区间的l与第一个区间的r形成的区间、第三个区间的l与第而个区间的r形成的区间。。。。。。的交集。struct Node{ int l,r; bool operator <(const Node &a){ return l<a

2021-08-08 14:42:31 92

原创 求一个点使可以任意跳跃而不会跳到陷阱里的问题

原题链接在无穷大的地图里,一只兔子以d跳跃距离可以上下左右到处跳,有n(<=1e5)个矩形的陷阱,求是否存在一个点(x,y)使得兔子从(x+0.5,y+0.5)开始跳跃,可以任意跳跃而不会跳到陷阱里。分析:取以(0,0)为左下角,(d,d)为右上角的矩形,再将其他陷阱矩形以空隔为d"平移"到该矩形内,问题就转化成能否在完成所有平移后的矩形里找到一个未被陷阱覆盖的大小为1*1的正方形,答案即是该正方形的左下角。我们可以以类似扫描线一样的写法,以0到d-1的长度建立线段树,当前高度小于d,则说明存

2021-08-08 14:15:18 75

原创 求把 x 位置修改为1的序列操作后序列的情况

原题链接长度为n(<=5e6)的序列,有n次操作,每次操作:1 x 表示把 x 位置修改为 1。2 x 表示查询,如果将 x 位置修改为 1,求最大的 i 满足序列位置1到i−1上的值均为 1。这里不实际上做出这一次修改。分析:算法复杂应为O(n),考虑类似尺取法的算法,l、r维护最左边第一个0与最左边第二个0,即可轻松得到答案。bool vis[maxv];int main(){ int n,l1=1,l2=2,x,order; n=read(); for(in

2021-08-08 13:37:00 84

原创 求最少不执行多少个操作可以将坏电脑转移到各个位置上去的问题

原题链接n(<=1e5)台电脑与m(<=1e5)个按顺序的操作以及一个在k位置的坏电脑,每次操作交换两个电脑的位置,问最少不执行多少个操作可以将坏电脑转移到各个位置上去。分析:dp[i][j]表示前i个操作后,坏的电脑在j的最小代价。对于第i次交换的u,v,则有dp[i][u]=min(dp[i-1][u]+1,dp[i-1][v]),dp[i][v]=min(dp[i-1][v]+1,dp[i-1][u])。用滚动数组舍去第一维即可。int dp[maxv];int main()

2021-08-07 20:01:20 57

原创 关于捕捞所有宝物的最小消耗体力量的问题

原题链接在岸上捕捞n(<=300)个宝物,一秒捕一个,捕捞消耗的体力为宝物的此时坐标(xi,yi,zi+t*vi)的平方,t为当前时间,求捕捞所有宝物的最小消耗体力量。分析:易知为二分图的带权最小匹配问题,事实上只要带有“选择”的意味的题目,都可以考虑使用二分图算法试解。这题的难点主要在卡时间,网上的很多板子都卡了,这里给出一份跑得飞快的二分图的带权最小匹配的板子,当然也可以改装为带权最大匹配解法。LL x[maxv],y[maxv],z[maxv],v[maxv],minZ,la[maxv

2021-08-07 17:58:01 61

原创 关于求明白所有盒子颜色的最小花费期望的问题

原题链接n(<=1e5)个装有一个黑或白球的盒子,球的颜色概览随机,一次花费c元的提示可以知道剩下的盒子里有多少个黑球。打开第i个盒子花费w[i]元。求明白所有盒子颜色的最小花费期望。分析:答案可能是直接打开所有盒子,即w数组的所有和。另外,可以再最开始时就花费一个提示,若发现有n个黑球或0个黑球,则游戏结束。否则继续,即每次有1-2*(1/2)^(n-i+1)的概率需要继续往下花费w[i]打开第i个盒子(按价格排完序),其中2 * (1/2)^(n-i+1)是i-n的盒子全是黑球或白球的概率

2021-08-06 22:47:48 53

原创 求消灭所有怪兽的最少消耗晶石数目的问题

原题链接两个整数n(<=100000),m(<=1000),表示有n个怪兽,m种技能。a[i](<=1000),b[i](<=10),分别表示怪兽的生命值和防御力。k[i](<=100000)和p[i](<=1000),分别表示技能的消耗晶石数目和技能的伤害值。求消灭所有怪兽的最少消耗晶石数目。分析:很明显的完全背包问题,难点在背包维度的建立:若对每只怪兽都单独做一次背包dp,则时间复杂度达1e5(n) * 1e3(m) * 1e3(a[i]),所以考虑其他维度

2021-08-06 16:20:33 210

原创 求一个二维凸包使围成该凸包的点最少的问题

原题链接求一个二维凸包使围成该凸包的点最少。n<=500。分析:先将连成的有向向量可以将其他点挡在内侧的两个点,建立一条有向边。最终利用floyd求最小环即可。struct Node{ double x,y;}a[maxv],b[maxv];double mul(Node &a,Node &b,Node &c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}double dis(Node &a

2021-08-06 15:16:21 55

原创 求01背包的方案具体选择的问题

原题链接01背包dp,要输出方案具体选择。(不超过预算、不重样等分最高的情况下,选择序号加和最小,加和相等时字典序最小的组合。)分析:括号里的要求,用正常的01背包即可默认实现。vis[i][j]=1表示在背包已装的j量物品中有第i个物品。在实现dp过程同时更新vis数组。最终令now为总预算,逆序循环i从n到1,当vis[i][now]==1时,令now-=cost[i],第i物品即被选择。vector<int> all;int dp[maxv],cost[maxv],scor

2021-08-06 13:30:30 196

原创 求连续子序列平均最大权值的问题

原题链接求长度为n、m(<=1e5)的a,b两组数组一段长度不小于x、y的连续子序列平均最大权值。分析:要求一个数组a长度不小于len的连续子序列平均最大权值。二分答案x,令b[i]=a[i]-x,sum数组为数组b的的前缀和,则要求a数组的连续子序列平均最大权重,即使b数组的连续子序列最大权重和>=0,即是使sum[i]-sum[j]的最大值>=0(j+len<=i)。对于这题,还启发我们可以用前缀和数组求连续子序列的最大权重和。int a[maxv],b[maxv];

2021-08-03 21:01:18 624

原创 求给定权重范围,求树的可能存在种数的问题

原题链接给出n个点的一棵树,每个点的权值范围,以及n-1条边和这条边的两个节点的权值异或值。求这棵树的可能存在种数。分析:由异或性质:A ^ B=C,则A ^ B ^ B=A=C ^ B。以1为根节点,若val[1]=0,则可以直接dfs求出其他节点的值val[i]。若val[1]=a,易知val’[i]=val[i]^a。因此,求这棵树的可能存在种数,即是求a的可能种数。要使l[i]<=val’[i]<=r[i],即l[i]<=val[i]^a<=r[i],故a的种数即

2021-08-03 20:31:58 87

原创 求将n*m个点染黑的最小花费值的问题

原题链接给出n * m(n,m<=5000)个点,起初每个点都是白色的,可以通过花费该点的权重来给该点染黑。对于一个含4个点的小正方形,若三个点是黑色的,则可以花费0值来给第四个点染色。求最终将全部点染黑的最小花费值。分析:若某行已染黑,则只需随意向下染一格即可将整条下行均染黑。(列同理)因此经过分析,易知要染n*m个点,实际只需染n+m个点。在一个小正方形中,染了三个任意点,等价于将该两行的行号、该两列的列号这四个数并入一个集合,此时第四个点随之被染黑。故对于每个点,存储行号,列号,权重

2021-08-01 18:00:43 58

原创 求规定范围内整除式的数目解的问题

原题链接求xy+1|xx+yy(1<=x<=y<=n)的数目。分析:求规定范围n内整除式的数目解的问题,可以当做一份模板。令xx+yy=k(xy+1),故:yy-kxy+xx-k=0。对于一个x,则:y1+y2=kx。故若(x,y)是一个解,那么(x,kx-y)也是一个解。故答案为:(x,y),(y,ky-x),(ky-x,k(k*y-x)-y)。。。。。。一直递推即可。经计算易知,右方一直大于左方。经打表知,(x,x^3) 、 (x^3 , x^5-x)都是一份特解,

2021-08-01 13:11:11 98

原创 求填完图后所填的数值总和的最小值的问题

原题链接规定n * n(<=2 * 10^3)的图,给出每行每列必须存在的最大值,现在要让你填m(<=8 * 10^5)个点,求填完后所填的数值总和的最小值。分析:要使值更小,就要让不需要填最大值的点填0。枚举行列共出现过的值,对于一个值,若某行与某列的“必须存在的最大值”都是该值,那么若在该行该列的交叉点填下该值,则可以同时满足该行与该列,即“省下一个点不用填”,故可让该行与该列连接一条边,最终最大匹配值就是可以“省下”的点数,而在该值情况下求出来的:“将该值作为最大值的行数+将该值

2021-08-01 11:31:37 67

原创 关于最短连续异或子序列的问题

原题链接给出一个序列,长度为n(<=1e5),求异或和不小于k的最短连续子序列,输出左右端点坐标。分析:设前缀异或和数组a,转化为求a数组中最近的两个数,使该两个数异或值不小于k。利用字典树存储二进制数的思想:对于当前的元素a_i,我们先搜索得到序号为1-(i-1)的a数组元素中能与其形成异或值不小于k的最大坐标maxLeft,然后再将a_i存储在字典树里。难点是快速找到maxLeft的方法。对于字典树中的一个节点p,使用lef数组,lef[p]表示经历过p节点的最大a元素坐标。这样在不断

2021-07-29 19:53:57 302

原创 求栈弹出弹入后的最终次序的问题

原题链接每次操作输入a,b,表示将a栈中数全部弹出弹入到b栈中。求最终各栈的数字情况。分析:用head数组记录各栈的栈顶元素,tail数组记录栈底元素。对于每次操作,将head[a]与head[b]连接一条双向边,再更新head[b]为tail[a]即可。最终可以通过dfs(tail[i]),以此查询每个数字与其相连的数字情况,从而得到答案。int head[maxv],tail[maxv];vector<int> g[maxv],ans;bool vis[maxv];void d

2021-07-29 14:37:59 70

原创 关于求两个球相交部分体积计算

原题链接题解转载于此已知A、B、C、D、P1、P2的坐标与k1、k2的值,且|AP1|>=k1*|BP1|,|CP2|>=k2*|DP2|,要求两个几何体的相交体积。分析:以A、B、P1为例,即(x-x0)^ 2+(y-y0)^ 2+(z-z0)^ 2>=k1^ 2*[(x-x1)^ 2+(y-y1)^ 2+(z-z1)^2],即(k1* k1-1) * (x * x+y * y+z * z)-(2 * k1 * k1 * x1-2 * x0) * x-(2 * k1 * k1

2021-07-27 16:19:34 1206

原创 关于在bfs里记录路径的方法

关于在bfs里记录路径的方法初始化tail=1,head=0,路径数组ans的首元素:ans[0]={0,0,0,0,-1}。(pre值是-1)代码如下:while(q.size()){ int top=q.front();q.pop(); head++; ... if(!vis[x]){ vis[x]=1,q.push(x); //记录路径的值 ans[tail].pre=head-1,ans[tail].x1=i,ans[tail].y

2021-07-27 15:21:33 750

原创 求能不断乘2吸收相邻数使序列长度变为1的数的数目的问题

原题链接题意:在一个长度为n的序列a中,若一个数比相邻的另一个数大,则可以删除此相邻数,然后本身变成2倍。问能不断如此操作且最终序列长度变成1的数的数目。n<5e5,ai<1e9。分析:发现数每次变化都变成2倍,而序列最大数小于1e9,即小于2^32,故一个数只需不断变化小于32次,即可大于序列最大数,宣告此数符合条件。所以暴力模拟即可,每次模拟时间复杂度O(10)而已。LL a[maxv];int main() { int n;vector<int> an

2021-07-21 15:16:49 64

原创 关于两个椭圆的面积并的问题

原题链接求两个椭圆的面积并。分析:使用蒙特卡洛算法(撒点法)。选定一个矩形框柱两个椭圆,在这个矩形内均匀撒点,设一共撒了 K个点,有 F个点落在了椭圆内,矩形的面积即为 S,那我们可以近似的认为两个椭圆的并的面积为 F/K*S。撒点法是计算几何面积、体积的一大利器。这种思想类似与模拟退火,但是是均匀撒点,而后者是随机撒点。int main(){ int t; double a,b,c,d,ans; scanf("%d",&t); while(t--){

2021-07-21 14:57:39 970

原创 关于吃完所有甜甜圈的最小移动步数的问题

原题链接第一叠有n1个,第二叠有n2个(n1+n2<1e5),要解决的问题如下:每个甜甜圈都有一个唯一的甜度值s_i,甜度值两两不同;每次艾洛可以把任意一叠位于顶端的一个甜甜圈移动到另一叠顶端,若该甜甜圈是当前所有甜甜圈中最甜的(甜度值最大),那么艾洛不会移动甜甜圈,而是直接吃掉;请你求出艾洛吃完所有甜甜圈的最小移动步数。分析:1e5,考虑堆或排序。首先对于每个甜甜圈,我们需要保存甜度值和原次序(1至n1+n2)。将两堆甜甜圈一起按甜度排序后,就能确定当前要吃掉哪个甜甜圈,这样在移动过程

2021-07-21 14:36:54 170

原创 关于区间中存在多少个连续子区间满足不同的数的个数不小于K的问题

原题链接游戏一共有m轮,Alice手里有一个长度为n的序列a_i 和常数K,每轮取出一个连续区间 [L_i,R_i],问这个区间中存在多少个连续子区间满足区间中不同的数的个数不小于K。1≤n,m,K≤10 ^5。分析:f[i]表示i作为左端点时向右扩展到f[i],此时这个区间刚好有k个不同的数字。对于一个区间L,R,可以求出pos,使f[pos-1]小于等于R,且f[pos]大于R。则答案就是f数组可以用双指针法(尺取法)O(n)求得。pos可以用二分法求得。答案可以用前缀和求得。对于

2021-07-21 13:39:01 534 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除