- 博客(26)
- 收藏
- 关注
原创 牛客多校二
Counting Triangles这道题题意是算有多少三边颜色完全相同的三角形,比赛中模拟三重循环得出答案,显然会超时正确的题解,既然要算有多少个三边颜色完全相同的三角形个数,那等同于三角形个数-有异色边的三角形个数,有异色边的三角形则是有俩个点的其中俩条边是异边,就是对于每个点算它有多少个异边相加/2,这个通过计数黑色的点的总数*白色的点的总数得到.#include<bits/stdc++.h>typedef long long ll;namespace GenHelper {
2022-03-27 08:36:00
154
原创 牛客多校四
c题晚了一分钟交就不再多写[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xguvvWyx-1648341277048)(https://uploadfiles.nowcoder.com/images/20210726/728856466_1627312025173/249D2BDBDFCE405071D53BC3C031F075 “图片标题”)]i题 Inverse Pair比赛的时候不会归并排序减小复杂度,补个归并排序的板子void merge_sort(int st
2022-03-27 08:34:50
353
原创 杭电多校一
Maximal submatrix这道题的题意就是求已知矩阵的最大单调不下降矩阵,比赛中只会用暴力的方法,tle了看了题解,说是转化为01矩阵,然后用悬线法求出,太菜了,表示没听过,网上学了一波,先将悬线向上拓展到最大,然后尽量向左右拓展,具体运用这道题的话就是,先得出每个点的深度(指从上而下目前得不下降长度),对于每一行的点,从左至右,求出该点在深度最大的情况下的左右宽度,相乘则得出最大矩阵个数.#include<bits/stdc++.h>using namespace std;
2022-03-27 08:34:00
166
原创 杭电多校二
1001 I love cube一道数学题吧,其实比赛的时候没太看懂题,n=3,实在数不出72个等边三角形,n=4有288个,n每加一,多出n^3*8个等边三角形,这道题的规律就是对于n个结点的正立方体,1~n-1个(n-i)*8相加#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 1e9+7;ll n;ll ans;int main(){ int t; c
2022-03-27 08:33:24
139
原创 杭电多校三
1007 Photoshop Layers比赛的时候想着模拟,tle了,想到m[i]为1则前面无论如何都变成当前的数,结果还是tle了,最后修修整整也没想到正解,正解其实就是因为从m[i]为1从后再将每个数相加和255比较,所以提前处理,将所有的数先加起来,到每求一个区间再相减,就不想每次都再算,大大降低复杂度,还有一个就是%X十六进制的这个,比赛的时候字符串转数字再转字符串太麻烦了,也是没想到这个,学到了.下次有十六进制数的时候考虑一下这个.#include<bits/stdc++.h>
2022-03-27 08:32:19
978
原创 杭电多校四
Calculus试了很多很多次,高数还是忘光了,没想到全部都是收敛的,知道这个就简单了#include<bits/stdc++.h>using namespace std;#define int long longstring split="+";string s[100];int pos,k;signed main() { int t; scanf("%lld",&t); while(t--) { string strs; cin>>strs
2022-03-27 08:30:55
56
原创 逆序对(树状数组实现)
树状数组求逆序对#include<bits/stdc++.h>using namespace std;#define int long longint n,m;int c[500005],a[500005]; vector<int> all;int lowbit(int x){ return x&(-x);}void updata(int i,int v){ while(i<=n){ c[i]+=v; i+=lowbit(i); }
2021-10-02 08:35:44
83
原创 树状数组板子
树状数组的俩个板子1.单点更新-区间查询#include<bits/stdc++.h>using namespace std;#define int long longint n,m;int c[500005],a[500005]; int lowbit(int x){ return x&(-x);}void updata(int i,int v){ while(i<=n){ c[i]+=v; i+=lowbit(i); }}int ge
2021-10-02 08:00:03
112
原创 P7167 [eJOI 2020 Day1] Fountain(单调栈+倍增)
P7167 [eJOI 2020 Day1] Fountain题目描述:对于一个喷泉,它有n层,每层有di的直径和ci的容量,对于m次查询,从index开始,总量有sum,问最后能流到哪一层,直径大的只能流向下一次直径比他大的或者水池.思路:先利用单调栈找到每一个圆盘能流向的下一个圆盘,通过倍增的想法存储当前圆盘流向的第二个圆盘,第四个,第八个…然后就能找到这一条流向的路,建一个二维数组保存倍增的区间和,然后对于每一次查询模拟即可#include<bits/stdc++.h>usin
2021-10-01 08:34:52
329
原创 Codeforces Round #745 (Div. 2)(A~B)
A. CQXYM Count Permutations题目描述:对于给定的一个n,长度为2n的序列,值包含[1,2n]中的每一个,对于i,a(i+1)>a(i)为符合条件的点,问形成不少于n个这样点的序列有多少种排列方案思路:严格来说不能算题解,因为我是猜的,a(i+1)>a(i)与a(i)<a(i+1)其实可能性是一样的,找到一个长度至少为n,然后看的note,觉得就是累乘的一半,给的样例也足够的大,方便测试方法的更行性,直接上手敲,不过得注意取余,假如105/2对100取余,如
2021-10-01 08:13:11
83
原创 Codeforces Round #744 (Div. 3)(A-E2)
首先,庆祝自己上了绿名A. Casimir’s String Solitaire题目描述:一个字符串包括A,B,C三种字符,有俩种操作可以选择1.删除一个A和一个B2.删除一个B和一个C问最后能不能将这个字符串清空思路:统计A,B,C的数量为a,b,c,b=a+c则YES,否则NO#include<bits/stdc++.h>using namespace std;#define int long longsigned main(){ int t; cin>
2021-10-01 07:48:02
221
原创 P1428 小鱼比可爱(树状数组)
P1428 小鱼比可爱题目描述:给定一个序列的????,对于每条????打印前面有多少????比它丑思路:这道题本来是一道入门水题的,因为数据量小,数据量大的话可以用树状数组写对于输入的数据将它存在数组 中,因为存在0的情况,而树状数组下标从1开始,a[1],a[2],a[3]…代表前面0,1,2出现的次数,如果该点等于x的话,则之前[1,x-1]出现的次数为该题的答案.这个可以用树状数组的区间和函数在O(logn)时间上完成,然后更新该值出现的次数,这个时间复杂度也是O(logn)#inclu
2021-09-30 16:04:22
199
原创 P2251 质量检测(ST表)
P2251 质量检测题目描述:对于n个零件,依次打印[1,m]-[n-m+1,n]的最小值思路:#include<bits/stdc++.h>using namespace std;#define int long longint f[100005][20];int a[100005];void init(int a[],int n){for(int i=1;i<=n;i++)f[i][0]=a[i]; for(int j=1;1<<j<=n;j++
2021-09-30 08:36:19
108
原创 P3865 【模板】ST 表
P3865 【模板】ST 表模板题,话不多说,之间贴代码#include<bits/stdc++.h>using namespace std;#define int long longint f[100005][20];int a[100005];void init(int a[],int n){ for(int i=1;i<=n;i++)f[i][0]=a[i]; for(int j=1;1<<j<=n;j++){ for(int i=1;i+
2021-09-30 08:11:49
59
原创 P7333 [JRKSJ R1] JFCA(st表+单调栈+二分)
P7333 [JRKSJ R1] JFCA这种区间找最近点我首先考虑使用单调栈/单调队列,因为ai与bi在不同的位置,想了一下感觉行不通,可以用st表存储ai的最大值,通过二分查找找到第一个大于所求的点下标,因为是一个环,我将数组复制三份(后面想想感觉原数组前面存储数组的后半部分,原数组后面再多存储数组的前半部分就行了吧),通过找到左边第一个和右边第一个符合条件的点,再比较一下,就可以得出该点的答案.#include<bits/stdc++.h>using namespace std;
2021-09-30 08:06:33
207
原创 leecode42. 接雨水(单调栈+前缀和)
leecode42. 接雨水题目描述:给n个高度不同的柱子(可为0),求能积水的容量思路:如果俩个稍高的柱子中有一个比它们俩低的柱子,则能积水,积水的容量为最低的柱子高度-当前的柱子高度,观察样例,发现对于当前的点找到右边第一个比它高或者等于它的点,这个时候可以得出这一区间的容量,通过单调栈可以找到右边第一个比它高或者等于它的点,通过前缀和可以得出这一区间的高度和,然后进而得出这一区间的积水量.麻烦的是找到一个最高点后,后面没有比它小或者等于它的数,所以又从n为起点来一次,算它们之间区间的积水量cla
2021-09-29 10:13:11
120
原创 leecode739. 每日温度(单调栈模板)
每日温度单调栈模板题,没啥说的,本来不想写,还是养成一题一题解的习惯吧class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures) { stack<int> sx; vector<int> ans(temperatures.size(),0); for(int i=0;i<temp.
2021-09-28 16:38:36
75
原创 java集合
java集合的概念:对象的容器,定义了对对象进行操作的常用方法.java集合不同于数组的是:数组的长度固定,而集合不固定,数组可以存储基本类型和引用类型,而集合只能存储引用类型.提到这个,就回忆一下基本类型和引用类型.集合想存储基本类型的时候可以进行装箱操作.基本类型:整数类型:long,int,short,byte浮点类型:float,double字符类型:char布尔类型:boolean引用类型:引用类型非常的多,大致包括:类,接口类,数组,枚举类型,注解类型,字符串型,总之非基本类型
2021-09-28 15:23:42
58
原创 P2422 良好的感觉(单调栈+前缀和)
P2422 良好的感觉题目描述:对于给定的序列,找到区间和与区间最小值乘积最大的区间思路:对于一个点作为最小点的话,覆盖它的区间越大则所求值越大,解决方案就是枚举每一个点作为最小值点,扩大区间,使得区间和最大,可以通过单调栈找到该点的左边界和右边界,前缀和得出该区间的区间和.#include<bits/stdc++.h>using namespace std;#define int long longint a[100005],sums[100005],lefts[10000
2021-09-28 13:06:51
204
原创 P1725 琪露诺(单调队列优化dp)
P1725 琪露诺题目描述:n+1个格子,从0开始,从当前位置可以跳到[i+l,i+r]位置,每个位置有冰冻指数,问达到n之后的位置可以得到最大的冰冻指数是多少思路:写过类似的题,考虑用dp,设j属于区间[i-r,i-l] dp[i]=max(a[i]+dp[j],dp[i]),但题目数据过大n*(r-l)有t的可能,然后发现这个递推式其实就是在[i-l,i-r]区间内找到一个最大的值,这个可以使用单调队列维护#include<bits/stdc++.h>using namespa
2021-09-28 11:29:07
214
原创 P1311 [NOIP2011 提高组] 选择客栈(贪心+二分)
P1311 [NOIP2011 提高组] 选择客栈题目描述:色调相同的俩个客栈,且俩个客栈之间咖啡馆的最低消费符合条件的选择客栈的方案数,思路:枚举每个点作为第二个客栈,对于第一个客栈的要求是色调相同且之间有符合条件的咖啡馆.我的想法是开一个数组存下每个色调的点的下标,只要该下标与枚举点的下标之间存在符合条件的咖啡馆即可,找到枚举点左边第一个符合条件的咖啡馆,然后统计符合条件的下标,就是与枚举点符合要求咖啡馆数量,通过二分查找能快速得出答案.这样总的时间复杂度就是O(n*logn)#includ
2021-09-28 09:01:25
289
原创 P6140 [USACO07NOV]Best Cow Line S(贪心模拟)
P6140 [USACO07NOV]Best Cow Line S从俩边取字符组成字典序最小的序列,一想就是贪心,比较俩边取更小的字符就好了,不过得注意的是碰到相等的情况得继续向比,找到不相等的为止,通过双指针可以完成这个操作,当时我是特判了left>=right,后面看题解发现可以不用特判.解决问题会有想暴力完成的想法,而不是去尝试将这些点合并起来,以后写题过程多注意.`#include<bits/stdc++.h>using namespace std;#define int
2021-09-28 07:24:16
95
原创 P6510 奶牛排队(单调栈+二分)
P6510 奶牛排队 该题要求找出符合条件的最多奶牛数,条件是A作为左端点最矮,B作为右端点最高,中间不能有与A,B相同身高的奶牛,枚举每个端点作为预备B端点,则A端点一定在左边比B端点高的奶牛的后面,也就是找到左边第一个比该点大的数,这个可以用单调栈完成,这个点暂时称为X点,接下来,找A端点,A的条件是在A-B之间没有比它矮的,也就是X-B之间最小的点,该点到B的距离为最长,难点来了,如何维护呢,看完别人的题解才知道,可以用俩个单调栈来维护,通过单调递减栈找到左边第一个大于B的点x,而如何找到x点
2021-09-27 15:25:06
635
原创 排序的总结
1. 插入排序插入排序只是交换相邻数组的值,是个稳定的排序方法,时间复杂度为O(n*2),输人数据的顺序能大幅影响它的复杂度,整个数列有序且与排序方向一致则复杂度最小.#include<bits/stdc++.h>using namespace std;#define int long longint* insertSort(int a[],int n){ for(int i=0;i<n;i++){ int j=i-1; while(j>=0){ if(a
2021-08-27 22:25:50
50
原创 链表的总结
链表总结通过刷一些链表的题,对于指针和结构体有了更深的理解一些基础题有:反转链表合并链表删除节点一些需要思考的如:环形链表(利用哈希表存储)找到链表环的入口(快慢指针,相等时,让一个指针从head出发,它将于low在入口相遇,利用数学知识证明)找到倒数第k个节点(双指针,俩个指针都从头开始,不同的是一个指针晚出发k次)俩个链表的第一个相同节点俩数相加反(给短的链表补充0,然后相加,记得进位就可以了)俩数相加正(先反转链表,再按逆序的写,再反转,看题解优解是
2021-08-17 10:11:01
76
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人