数据结构
SSL_kyx
简~介
展开
-
【51nod】3122 小陶的疑惑2
题目 思路 利用差分思想 先将数组变为差分数列,即ci=ai−ai−1c_i=a_i-a_{i-1}ci=ai−ai−1,然后对于两个操作: 第xxx个数的值为c1c_1c1到cic_ici的和 将区间(x,y)加c,相当于在cxc_xcx加c,并在cy+1c_{y+1}cy+1减c。 再用树状数组优化求解。 代码 #include<iostream> #define ll long long using namespace std; const int M=200000; ll原创 2022-01-12 16:22:44 · 323 阅读 · 0 评论 -
【51nod】3121 小陶与杠铃片
题目 思路 求逆序对,边输入边操作,每输入一个数,他前面有多少个比他大的数,答案就加几。 用 aia_iai 表示数为 iii 的个数, 那么求 iii 的前面有多少数比它大, 就是求ai+1a_{i+1}ai+1到aMAXa_{MAX}aMAX的和,也就是求a1a_1a1到aMAXa_{MAX}aMAX的和 减去a1a_1a1到aia_iai的和 这就可以用树状数组维护,O(nlogn)O(nlogn)O(nlogn)。 代码 #include<iostream> using原创 2022-01-12 15:37:56 · 320 阅读 · 0 评论 -
队列使用方式 queue,deque
队列使用方式 普通队列queue基本操作: 1.定义 qeque < 类型(如int)> q 2.队尾 q.back() 3.队首 q.front() 4.弹出队首 q.pop() 5.将x从队尾插入 q.push(x) 6.判断队列是否为空,空则返回1 q.empty() 7.返回元素个数 q.size() 双端队列deque基本操作: 1.定义 deque < 类型(如int)> e 2.队尾 e.back() 3.队首 e.front() 4.弹出队尾 e.pop_ba原创 2021-03-06 09:49:47 · 199 阅读 · 0 评论 -
优先队列(堆)STL 模板
#include<queue> #include<iostream> using namespace std; priority_queue <int> q1; //默认大根堆 //小根堆: struct cmp { bool operator()(int &a,int &b) { return a>b; //'>'从小到大 从大到小改成 '<' } }; priority_queue <int,vector&l原创 2021-03-26 21:53:38 · 95 阅读 · 0 评论 -
【SSL_2521】数数 (单调队列)
题目 题解 跟 假期 一样,求前缀+单调队列 代码 #include<iostream> #include<deque> using namespace std; long long n,k,a,s[200001],ans=-2147483647; deque<int> e; int main() { cin>>n>>k; for(int i=1; i<=n; i++) { cin>>a; s[i]=s[i-1]+原创 2021-03-06 10:14:43 · 54 阅读 · 0 评论 -
【洛谷】P1886 滑动窗口 /【模板】单调队列
题目描述 有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1,3,-1,-3,5,3,6,7][1,3,−1,−3,5,3,6,7], and k = 3k=3。 输入格式 输入一共有两行,第一行有两个正整数 n,kn,k。 第二行 nn 个整数,表示序列 aa 输出格式 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 输入输出样例 输入 8 3 1原创 2021-03-11 15:47:36 · 219 阅读 · 0 评论 -
【SSL_2884】假期(单调队列)
假期 题目 经过几个月辛勤的工作,FJ决定让奶牛放假。假期可以在1…N天内任意选择一段(需要连续), 每一天都有一个享受指数W。但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不能得到足 够的休息;假期也不能超过Q天,否则奶牛会玩的腻烦。FJ想知道奶牛们能获得的最大享受指数。 Input 第一行:N,P,Q. 第二行:N个数字,中间用一个空格隔开,每个数都在longint范围内。 Output 一个整数,奶牛们能获得的最大享受指数。 Sample Input 5 2 4原创 2021-03-06 09:56:11 · 131 阅读 · 0 评论 -
YbtOJ——字典树【例题2】最大异或对
B. 【例题2】最大异或对 题目 思路 两个数不同位越靠前,异或结果越大, 将每个二进制数当做一个字符串从高位到低位存入trie, 然后对于每个数,在trie中寻找最优解。 代码 #include<bits/stdc++.h> using namespace std; const int mx=32; long long trie[10000001][2],lt=1,n,m,a[10000001],ans; void in(long long s) { int p=1; for(int i原创 2021-12-11 16:53:53 · 350 阅读 · 0 评论 -
YbtOJ——字典树【例题1】前缀统计
A. 【例题1】前缀统计 题目 思路 字典树的模板题。 代码 #include<bits/stdc++.h> using namespace std; long long trie[100001][300],lt=1,n,m,end[100001]; string s; char ch; void in(string s)//插入字符串 { long long n=s.size(),p=1; for(int i=0;i<n;++i) { int ch=s[i]-'a'; i原创 2021-12-04 11:16:55 · 215 阅读 · 0 评论 -
树状数组 “详” 解
简介 树状数组就是一种能在O(log n)内查询或修改的数据结构, 它的代码极其简洁,是水题党的好帮手 适合解决单点修改与区间查询。 其大概的结构是这样的: 其中AAA数组就是我们的树状数组,Ai=1A_i=1Ai=1~ iii之和,即前缀和。val代表数据的权值。 思路 每次将一个点进行修改时,就将它所对应的树状数组以及它的父节点更新: void update(int x,int y) { for(; x<=n; x+=x&-x) A[x]+=y; } 每次查询时, ...原创 2021-12-25 15:13:21 · 339 阅读 · 0 评论