数据结构
到不了的远方-
I wanna be number one
展开
-
Just h-index(主席树)
Just h-index题意:给n个数,q次询问,每次询问给出一个区间[l,r],要你求出最大的h,使得在[l,r]这个区间内满足,有h个数的值大于等于h。思路:二分加主席树。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;int a[maxn],b[maxn];int rt[maxn...原创 2019-07-08 17:42:30 · 346 阅读 · 0 评论 -
牛客小白月赛16(未完待续)
小阳买水果二分#include<bits/stdc++.h>using namespace std;typedef long long ll;int a[2000005];ll sum[2000005];int main(){ ios::sync_with_stdio(false); int n; scanf("%d",&n); sum[0]=0;...原创 2019-07-14 17:22:53 · 126 阅读 · 0 评论 -
Rectangles(线段树,扫描线)
Rectangles题意:给出n个矩形,求奇数个矩形覆盖的面积并。思路:扫描线。扫描线思路:扫描线中(假设我们顺着x轴平行的线进行扫描),我们把一个矩形分为上下两条线,其中下线的值为1,上线的值为−1。在我们扫描每一条线之后,我们会对当前这条扫描线所映射的区间(即区间[x1,x2])进行区间更新(区间更新1或−1)。而每次扫描后,如果线段树维护的某个的映射区间的标记值大于1,则说明当前...原创 2019-07-05 15:07:32 · 404 阅读 · 0 评论 -
只有一端开口的瓶子
只有一端开口的瓶子题意:求出通过最少的栈使得序列有序,规定只能从按输入顺序加入栈里面,只能取出栈顶元素加入序列末尾。思路:其实最多只需要两个栈,最后判断是需要一个栈还是两个栈即可,当使用一个栈的时候,栈顶元素一定要和你需要的数字对应,比如说,先要把1放到需要的有序序列末尾,那么栈顶一定要是1,最后判断栈是否为空,为空的话只需要一个栈就能满足,否则需要两个栈。#include<b...原创 2019-07-11 09:54:40 · 363 阅读 · 0 评论 -
Frequent values(RMQ)
Frequent values题意:给出一段非递减序列,问区间里出现最多的值的次数。思路:可以把相同元素组合起来用二元组表示。cnt[i]代表第i段连续的长度num[i]表示第i个位置的数在那一段lef[i],righ[i]分别表示第i段的左右端点位置所求的最大值就是从L到L所在的段的结束处的元素个数:righ[L]-L+1从R到R所在的段的开始处的元素个数:...原创 2019-07-15 16:05:57 · 366 阅读 · 0 评论 -
筱玛爱线段树(线段树)
筱玛爱线段树题意:1 lr [l,r]区间里的数加1。 2 l r [l,r]第l个操作到第r个操作重复执行一次。思路:线段树加差分,区间修改,单值查询。线段树版本:#include<bits/stdc++.h>using namespace std;int tr[400005];int op[100005],l[100005],r[100005];in...原创 2019-07-06 09:05:44 · 288 阅读 · 0 评论 -
Remember the Word(Trie)
Remember the Word给出由s个不同单词组成的字典和长字符串,把这个字符串分解成若干个单词的连接,有多少种方法。递推加trie#include<bits/stdc++.h>using namespace std;const int maxn=4005;const int maxnode=maxn*100+5;const int mod=200...原创 2019-07-15 18:29:11 · 253 阅读 · 0 评论 -
K-th Number(主席树模板)
K-th Number题意:求区间第k小的数。思路:主席树模板题。#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e5+5;int a[maxn],b[maxn]...原创 2019-07-07 15:35:22 · 406 阅读 · 0 评论 -
监视任务(线段树)
监视任务题意:对于区间[li,ri],规定该区间的监视点数必须大于等于ki,求整个区间的最少监视点数。思路: 贪心+线段树,按区间的右端点排序,每次在不满足的区间尽量往右边填。#include<bits/stdc++.h>using namespace std;const int maxn=5e5+5;int tr[maxn<<2],vis[ma...原创 2019-07-12 14:52:30 · 176 阅读 · 0 评论 -
Ping pong
Ping pong题意:有n个乒乓球爱好者,每个人有不同的实力值,每场比赛规定裁判住在选手中间,并且实力值也在两名选手中间,问一共能组织多少场比赛。思路:考虑第i个人当裁判的情形,假设ai前面有ci个比ai小那么就有i-1-ci比ai大,同理ai后面也一样。最后就转换成求ci.可以用树状数组维护。#include<bits/stdc++.h>using nam...原创 2019-07-12 15:58:25 · 150 阅读 · 0 评论 -
Keen On Everything But Triangle
Keen On Everything But Triangle题意:给定区间,从区间里取3个数问能组成的最大三角形周长。思路:主席树模板题,每次求区间剩下的最大,次大,第3大。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef...原创 2019-07-24 20:09:15 · 683 阅读 · 0 评论 -
Find the answer(线段树)
Find the answer代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+5;ll sum[N<<2];int a[N],b[N],v[N*4],ans[N];void up(int o,int l,int r,int k){ i...原创 2019-07-30 09:52:01 · 424 阅读 · 0 评论 -
sequence
sequence题意:求一段区间里面a数组的最小值乘b数组的区间和,求的该值的最大值。思路:单调栈维护ai左右延伸区间,线段树维护b数组前缀和数组的最大最小值。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=3e6+5;ll sum[maxn],m...原创 2019-07-28 17:14:21 · 715 阅读 · 0 评论 -
并查集
Wireless Network#include<cstdio>#include<cmath>using namespace std;struct node{ int x,y,ok,fa;}a[1005];int d;int find(int x){ if(x!=a[x].fa) a[x].fa=find(a[x].fa); return a[x...原创 2019-08-06 16:51:43 · 100 阅读 · 0 评论 -
All-one Matrices
All-one Matrices题意:求出所有没被其他子矩阵包括的所有全1矩阵。思路:对于每个格子(i,j),记录它能向上延升的距离。同时还要记录它能向左延申的位置,那么对于一个全1矩阵,(i-up+1,pos)->(i,j)就符合要求,我们从底往上枚举即可,用单调栈维护。#include<bits/stdc++.h>using namespace st...原创 2019-08-11 10:40:20 · 659 阅读 · 0 评论 -
The Bakery(DP+线段树)
The Bakery题意:将一些数分成k段,每段的价值是里面不同数的个数,求能分得的最大值。思路:设dp方程 dp[i][j] 表示前 j个数分成 i段的最大值。转移方程 dp[i][j]=dp[i-1][x]+val[x]。1<=x<=j 。那么我们用线段树维护1到 j 的最大价值。对于每一个位置,找到前面最后一个与它数字相同的的位置,把这之间线段树的值都加上1。...原创 2019-08-15 10:27:36 · 213 阅读 · 0 评论 -
Matrix(树状数组)
Matrix题意:给定n*n的矩阵,每次选定一个矩形区域取反,询问[x,y]的值是多少。思路:树状数组维护,具体看下面的图,容斥原理,图片来源https://blog.csdn.net/libin56842/article/details/46620445#include<cstdio>#include<cstring>int c[1005][1005...原创 2019-07-04 11:42:16 · 339 阅读 · 0 评论 -
Tunnel Warfare(线段树)
Tunnel Warfare题意:D t摧毁村庄t,R 重建最后一个摧毁的村庄, Q t查询与t村庄连接的村庄个数。思路:线段树维护连续子区间,将未被破坏的村庄看成1,破坏的看成0,线段树维护3个信息,前缀最长1序列,后缀最长1序列,最长1序列。#include<bits/stdc++.h>using namespace std;struct node{ int l...原创 2019-07-04 10:43:45 · 374 阅读 · 0 评论 -
Lost Cows(线段树)
Lost Cows 题意:给出n头牛前面有多少头比他编号少的数目,求出原来的牛的编号,思路:从后面开始遍历,碰到的a表示此牛在剩余的牛中排名a+1.线段树维护区间里面未标记的牛的数量,找到满足条件的区间即可。找到后同时更新一下。#include<cstdio>int sum[32005];int a[8005],ql,qr,b[8000];void build(in...原创 2019-06-28 15:24:44 · 1529 阅读 · 1 评论 -
区间交(线段树)
区间交题意:选择k个区间使得区间交里面的和最大。思路:先把区间按l从小到大排序,找到至少有k条线段覆盖到的最右边的位置。用线段树维护,最后更新答案即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;struct node{ int l,r;}a[100005];ll b[1000...原创 2019-07-03 10:39:21 · 711 阅读 · 0 评论 -
I Can Guess the Data Structure!
I Can Guess the Data Structure! 白书上p186的猜猜数据结构。#include<bits/stdc++.h>using namespace std;int main(){ int n; while(~scanf("%d",&n)){ stack<int>s; queue<int>q; prio...原创 2019-07-03 11:17:54 · 277 阅读 · 0 评论 -
Easy Problem from Rujia Liu?
Easy Problem from Rujia Liu?题意:给出n个整数的数组,求出从左到右第k个v的下标。思路:利用map存下标即可。#include<bits/stdc++.h>using namespace std;int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ int x; ma...原创 2019-07-03 12:00:31 · 244 阅读 · 0 评论 -
Argus
Argus题意:系统支持一个注册命令,该命令每隔period产生一个编号,输出前k个事件的编号。思路:优先队列模拟。#include<bits/stdc++.h>using namespace std;struct node{ int qno,per,time; bool operator <(const node& a)const{ retur...原创 2019-07-03 12:17:46 · 860 阅读 · 0 评论 -
K Smallest Sums
K Smallest Sums题意:有k个数组,每个有k个元素,在每个数组里面取一个数加起来,问最小的k个数。思路:多路归并,优先队列维护。#include<bits/stdc++.h>using namespace std;int a[755][755];int n;struct node{ int s,b; node(int s,int b):s(s),b...原创 2019-07-03 14:27:15 · 313 阅读 · 0 评论 -
X-Plosives(并查集)
X-Plosives题意:如果存在k个化合物,并且包含k个元素,就会形成一个易爆化合物。输出有多少个没装车的化合物。思路:并查集,当图存在环时,化合物就是危险的。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;int fa[maxn];int find(int x){ if(x!=f...原创 2019-07-03 14:51:39 · 218 阅读 · 0 评论 -
Codeforces Beta Round #6 (Div. 2 Only)
A. Triangle题意:给定4条边,问能否组成一个三角形。#include<bits/stdc++.h>using namespace std;int a[10];int main(){ ios::sync_with_stdio(false); cin>>a[0]>>a[1]>>a[2]>>a[3]; sort(...原创 2019-07-09 08:17:26 · 192 阅读 · 0 评论 -
Corporative Network(并查集)
Corporative Network题意:两种操作 I u v:把节点u的父节点设为v,距离为|u-v|除以1000的余数,保证执行前u没有父节点。E u:询问u到根节点的距离。思路:路径压缩时维护d数组。#include<bits/stdc++.h>using namespace std;int fa[200005],d[200005];int find(i...原创 2019-07-03 15:44:11 · 125 阅读 · 0 评论 -
"Ray, Pass me the dishes!"(动态最大连续和)(线段树)
"Ray, Pass me the dishes!" 题意:给出一个长度为n的序列D,对于m个询问(a,b)找到两个下标x,y使得a<=x<=y<=b,Da+...+Db尽量大,输出x可能小,y也可能小的结果。思路:构造一颗线段树,每个结点维护3个值,最大连续和max_sub,最大前缀和max_perfix,最大后缀和max_suffix,最后只有3种情况。1连续最大...原创 2019-06-25 15:28:17 · 242 阅读 · 0 评论 -
Professional Manager(并查集)
Professional Manager题意:给定4种操作:1,合并u,v. 2,移除u.3,查询u集合里元素的个数.4,判断u,v是否在一个集合里.思路:并查集#include<bits/stdc++.h>using namespace std;int fa[100005],d[100005],pre[100005];int find(in...原创 2019-06-26 14:34:46 · 379 阅读 · 0 评论 -
士兵杀敌(四) (线段树)
士兵杀敌(四) 线段树入门题。。。#include<bits/stdc++.h>using namespace std;int add[4000005];int ql,qr,w,ans;void up(int o,int l,int r){ if(ql<=l&&qr>=r){ add[o]+=w; return ; } int...原创 2019-06-28 10:58:10 · 135 阅读 · 0 评论 -
士兵杀敌(二) (线段树)
士兵杀敌(二) 单点修改,区间查询。#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int ql,qr,w;int add[maxn*4];void build(int o,int l,int r){ if(l==r){ scanf("%d",&add[o]); ret...原创 2019-06-28 11:24:00 · 217 阅读 · 0 评论 -
Permutation(线段树)
Permutation题意:给定k个数的全排列,输出按字典序从小到大的第n个排列。n由si*(k-i)!+...的形式给出。思路:假设k=3,s=2,0,1第一个数是2*2!.不难发现123到213就是2!那么2*2!就是3.同理0*1!剩下只有两个数1和2,那么0*1!就是1,最后只剩下一个数2所以k=3,s=2,0,1的排列是312.那么这题就可以转换成动态求区间的第si+1小的...原创 2019-07-12 17:01:44 · 143 阅读 · 0 评论 -
Billboard(线段树)
Billboard题意:给定h*w的板子,每张海报宽wi 从上到下,从左至右贴海报,问每张海报贴的位置。思路:线段树维护。#include<bits/stdc++.h>using namespace std;int add[800005];int h,w,n,ql,ans;void build(int o,int l,int r){ add[o]=w; if(...原创 2019-07-03 19:16:08 · 152 阅读 · 0 评论 -
SKYLINE (线段树)
SKYLINE 题意:给出l r h如果h大于原来l r区间里的hi那么将覆盖掉 l r里面的hi求覆盖的区间长度。思路:区间更新,查询区间最值的线段数维护即可。#include<bits/stdc++.h>using namespace std;const int maxn=3e5+5;int ql,qr,n,mmax[maxn],_set[maxn],ans,h...原创 2019-07-09 15:09:13 · 222 阅读 · 0 评论 -
2019牛客暑期多校训练营(第十场)F:Popping Balloons
Popping Balloons题意:选3条横线,3条竖线,相邻线之间的距离不超过r,求能穿过的最大点数。思路:考虑只有一条横线,一条竖线的情况。利用竖线权值线段树维护该横坐标能通过的点数,枚举竖线,考虑该点会重复计算,所以先取出来,计算完后再加回去。3条横线,3条竖线类似。代码:#include<bits/stdc++.h>using namespace ...原创 2019-08-20 15:27:09 · 237 阅读 · 0 评论