牛客多校二 Counting Triangles这道题题意是算有多少三边颜色完全相同的三角形,比赛中模拟三重循环得出答案,显然会超时正确的题解,既然要算有多少个三边颜色完全相同的三角形个数,那等同于三角形个数-有异色边的三角形个数,有异色边的三角形则是有俩个点的其中俩条边是异边,就是对于每个点算它有多少个异边相加/2,这个通过计数黑色的点的总数*白色的点的总数得到.#include<bits/stdc++.h>typedef long long ll;namespace GenHelper {
牛客多校四 c题晚了一分钟交就不再多写[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xguvvWyx-1648341277048)(https://uploadfiles.nowcoder.com/images/20210726/728856466_1627312025173/249D2BDBDFCE405071D53BC3C031F075 “图片标题”)]i题 Inverse Pair比赛的时候不会归并排序减小复杂度,补个归并排序的板子void merge_sort(int st
杭电多校一 Maximal submatrix这道题的题意就是求已知矩阵的最大单调不下降矩阵,比赛中只会用暴力的方法,tle了看了题解,说是转化为01矩阵,然后用悬线法求出,太菜了,表示没听过,网上学了一波,先将悬线向上拓展到最大,然后尽量向左右拓展,具体运用这道题的话就是,先得出每个点的深度(指从上而下目前得不下降长度),对于每一行的点,从左至右,求出该点在深度最大的情况下的左右宽度,相乘则得出最大矩阵个数.#include<bits/stdc++.h>using namespace std;
杭电多校二 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
杭电多校三 1007 Photoshop Layers比赛的时候想着模拟,tle了,想到m[i]为1则前面无论如何都变成当前的数,结果还是tle了,最后修修整整也没想到正解,正解其实就是因为从m[i]为1从后再将每个数相加和255比较,所以提前处理,将所有的数先加起来,到每求一个区间再相减,就不想每次都再算,大大降低复杂度,还有一个就是%X十六进制的这个,比赛的时候字符串转数字再转字符串太麻烦了,也是没想到这个,学到了.下次有十六进制数的时候考虑一下这个.#include<bits/stdc++.h>
杭电多校四 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
逆序对(树状数组实现) 树状数组求逆序对#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); }
树状数组板子 树状数组的俩个板子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
P7167 [eJOI 2020 Day1] Fountain(单调栈+倍增) P7167 [eJOI 2020 Day1] Fountain题目描述:对于一个喷泉,它有n层,每层有di的直径和ci的容量,对于m次查询,从index开始,总量有sum,问最后能流到哪一层,直径大的只能流向下一次直径比他大的或者水池.思路:先利用单调栈找到每一个圆盘能流向的下一个圆盘,通过倍增的想法存储当前圆盘流向的第二个圆盘,第四个,第八个…然后就能找到这一条流向的路,建一个二维数组保存倍增的区间和,然后对于每一次查询模拟即可#include<bits/stdc++.h>usin
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取余,如
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>
P1428 小鱼比可爱(树状数组) P1428 小鱼比可爱题目描述:给定一个序列的????,对于每条????打印前面有多少????比它丑思路:这道题本来是一道入门水题的,因为数据量小,数据量大的话可以用树状数组写对于输入的数据将它存在数组 中,因为存在0的情况,而树状数组下标从1开始,a[1],a[2],a[3]…代表前面0,1,2出现的次数,如果该点等于x的话,则之前[1,x-1]出现的次数为该题的答案.这个可以用树状数组的区间和函数在O(logn)时间上完成,然后更新该值出现的次数,这个时间复杂度也是O(logn)#inclu
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++
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+
P7333 [JRKSJ R1] JFCA(st表+单调栈+二分) P7333 [JRKSJ R1] JFCA这种区间找最近点我首先考虑使用单调栈/单调队列,因为ai与bi在不同的位置,想了一下感觉行不通,可以用st表存储ai的最大值,通过二分查找找到第一个大于所求的点下标,因为是一个环,我将数组复制三份(后面想想感觉原数组前面存储数组的后半部分,原数组后面再多存储数组的前半部分就行了吧),通过找到左边第一个和右边第一个符合条件的点,再比较一下,就可以得出该点的答案.#include<bits/stdc++.h>using namespace std;
leecode42. 接雨水(单调栈+前缀和) leecode42. 接雨水题目描述:给n个高度不同的柱子(可为0),求能积水的容量思路:如果俩个稍高的柱子中有一个比它们俩低的柱子,则能积水,积水的容量为最低的柱子高度-当前的柱子高度,观察样例,发现对于当前的点找到右边第一个比它高或者等于它的点,这个时候可以得出这一区间的容量,通过单调栈可以找到右边第一个比它高或者等于它的点,通过前缀和可以得出这一区间的高度和,然后进而得出这一区间的积水量.麻烦的是找到一个最高点后,后面没有比它小或者等于它的数,所以又从n为起点来一次,算它们之间区间的积水量cla
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.
java集合 java集合的概念:对象的容器,定义了对对象进行操作的常用方法.java集合不同于数组的是:数组的长度固定,而集合不固定,数组可以存储基本类型和引用类型,而集合只能存储引用类型.提到这个,就回忆一下基本类型和引用类型.集合想存储基本类型的时候可以进行装箱操作.基本类型:整数类型:long,int,short,byte浮点类型:float,double字符类型:char布尔类型:boolean引用类型:引用类型非常的多,大致包括:类,接口类,数组,枚举类型,注解类型,字符串型,总之非基本类型
P2422 良好的感觉(单调栈+前缀和) P2422 良好的感觉题目描述:对于给定的序列,找到区间和与区间最小值乘积最大的区间思路:对于一个点作为最小点的话,覆盖它的区间越大则所求值越大,解决方案就是枚举每一个点作为最小值点,扩大区间,使得区间和最大,可以通过单调栈找到该点的左边界和右边界,前缀和得出该区间的区间和.#include<bits/stdc++.h>using namespace std;#define int long longint a[100005],sums[100005],lefts[10000
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