C++
sophilex
kidlut
展开
-
后缀最小值:求数组后i个数的最小值
描述: 给定一个数组a[],已知长度为n,找出其中的两个数ai和aj(i<j),使得ai-aj最大; 本题是一道明显的贪心,可以通过两层循环遍历数组,对于每一个ai,找到其后的元素中的最小值,求得一个值,然后对所有这样的值求最小值即可。 那么求ai之后的最小元素,可用后缀最小值来求。 for(int i=n;i>=1;++i){ minn[i]=min(minn[i+1],ai) } 即可。 ...原创 2021-10-11 19:20:20 · 406 阅读 · 0 评论 -
奇思妙想构造题 ARC145 D - Non Arithmetic Progression Set
不妨想一想,一个合法数a的两倍在三进制表示下肯定只有0/2,那么如果它是等差数列的中间项的话,就意味着另外两个合法数b,c的所有三进制下含1的位置都是重合的,这样才能刚好凑出2,并且这些2的位置也要与2*a的位置重合,稍加思索,不难发现,在这样的前提下,我们还发现,对序列的所有元素同时加上/减去相同的值,对序列的“无等差数列”性质并没有影响(废话,那么要让sum变成m,我们只要保证abs(sum-m)%n=0即可,这样就可以把差值均分到每一个元素的头上。三个合法数能够组成等差数列,当且仅当a=b=c。...原创 2022-07-31 12:29:16 · 303 阅读 · 0 评论 -
板子 lca
模板题 tarjan做法: #include<bits/stdc++.h> using namespace std; #define ll long long const ll N=500010; struct ty{ ll t,next; }edge[N<<1]; ll cnt1=0; ll head[N]; ll n,m,s; ll a,b; template<typename Type>inline void read(Type &xx) {原创 2022-04-16 09:44:23 · 251 阅读 · 0 评论 -
dfs序板子+树状数组板子题 求和
求和 大意: 单点修改,子树查询; 思路: dfs,将树掰成线性的; 然后无脑树状数组即可 水水更健康~ #include<bits/stdc++.h> using namespace std; #define ll long long #define lowbit(x) x&(-x) const ll N=1e6+10; ll n,m,k; ll a,b,c; ll tr[N]; ll mas[N];//初始权值 struct ty { ll t,next; }e...原创 2022-03-31 21:46:06 · 369 阅读 · 0 评论 -
莫队/树状数组+离线 :HH的项链 及莫队例题
项链 大意: 一段数组,每次查询一个区间,询问区间内的数字种类数。 思路: 这道题其实做法比较多 莫队/主席树(当然我还不会。。。)/树状数组都可以。 先讲一下树状数组的做法: 采用离线+树状数组求前缀和 因为询问比较多,在线做的话用树状数组属实是扛不住,所以离线,然后按r从小到大排序。 那么对于每一次从查询【l,r】,以及我们当前查到的w: 如果w对应的数k之前是没有出现过的,那么直接将这一点w的权值记为1即可,后面树状数组维护前缀和即可。但k如果之前在w'位置出现过,..原创 2022-03-26 12:24:59 · 434 阅读 · 2 评论 -
程序设计实训
#include<bits/stdc++.h> #include "conio.h" //如果用工程,把此处.c改成.h #include <stdio.h> #define EnterKey 0x0d #define UpCursor 38 #define LeftCursor 37 #define RightCursor 39 #define DownCursor 40 #define AltXKey 18 #define Es...原创 2022-03-20 22:18:37 · 147 阅读 · 0 评论 -
求N元上升子序列(挖坑)
三元上升子序列 还没搞懂,先贴着,以后填。。。 大意: 给定一个数组,求N元上升子序列的数量 思路:(来自洛谷大佬) DP + 树状数组优化 设f[i][j]f[i][j]为以a[j]a[j]为结尾的长度为ii的上升子序列的个数 得到转移方程: 然后用树状数组维护。。。 维护啥呢,下次再说 :) ...原创 2022-03-15 19:25:38 · 330 阅读 · 0 评论 -
换个角度思考(离线查询+树状数组)
题目链接 大意: 思路: 数组大小范围为1e5,查询次数范围1e5,每次在线枚举查找是扛不住的。 所以我们可以选择离线。 因为这里不会有修改操作,所以我们可以将离线下来的询问按询问值来排序。 同时将原数组按照大小排序。 那么遍历询问数组时,因为查询键值是从小到大的,我们当前找到的满足条件的数字,也就是小于当前查询值的数字,之后也是有可能满足条件的(事实上只要它在对应的要求区间里,它就会一直满足条件)。 那么就可以用一个树状数组来统计前缀和,也就是在某一区间内满足条件的数字的总数。因为这个原创 2022-03-15 18:35:36 · 280 阅读 · 0 评论 -
线段树+位运算 红球进黑洞
红球进黑洞 大意: 与线段树模板题唯一的区别就是这里的修改操作变成了对区间每一个元素与给定值进行异或操作。 思路: 对于异或操作,我们一般都会考虑按位进行运算。 所以这里可以考虑建一个二维数组来维护线段树,一维是每一个二进制位,另一维就是区间长度。 那么每次求区间和时,只要把每一个二进制位对应的区间和求出来并乘上对应的二的幂次,最后累加即可。 并且因为这里是异或操作,对于每一个二进制位我们只用考虑0/1,所以change操作也会更加好写一点(其实只是省了每次的常数而已,但也是方便 :=) 另外原创 2022-03-15 11:45:08 · 428 阅读 · 0 评论 -
并查集+背包dp(经商)
链接:登录—专业IT笔试面试备考平台_牛客网 题目描述: 首先呢,小d对人脉关系的获取就是一个并查集,因为并查集的原则就是:朋友的朋友就是我的朋友,亲戚的亲戚就是我的亲戚,所以这个是完美符合并查集的特点的,所以第一步就是将所有能被小d通过渠道交往的人划归到一个子树下,然后不难发现,剩下的就只是一个简单的背包dp了,打模板就好了。 上代码: #include<bits/stdc++.h> using namespace std; #define ll long long ll..原创 2021-11-05 16:20:11 · 132 阅读 · 0 评论 -
单调栈:区区区间间间(寻找任意区间的最大值和最小值)
题目描述: 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 示例1 输入 3 3 4 2 3 5 1 8 4 3 9 20 2 8 15 1 10 5 19 19 3 5 6 6 2 8 2 12 16 3 8 17 输出 5 57 2712 说明 对于一组测试数据的解释: 区间[1, 2]的贡献为:4 - 2 = 2 区间[1, 3]的贡献为:4 - 2 = 2 区间[2, 3]的贡献为:3 - 2 = 1 2 + 1 + 2 = 5. 备注: T.原创 2021-11-01 10:36:53 · 1208 阅读 · 0 评论