数据结构
(单调)栈,(单调)队列,(带权)并查集,树状数组,平衡树,二叉搜索树,splay,treap等各种
Christine_xb
lnsyoier
展开
-
poj2155 Matrix
二维树状数组加差分#include<cstdio> #include<algorithm> #include<cstring> int t,n,k,x1,y1,x2,y2; int e[1111][1111]; char ch[5]; void change(int x,int y,int val) { for(int i...原创 2020-02-22 09:09:45 · 62 阅读 · 0 评论 -
树状数组学习笔记
引入如何把一个正整数x分成几个区间?while(x>0){ printf("[%d,%d]\n",x-(x&-x)+1,x); x-=x&-x;}这里来了解一下lowbit()函数。int lowbit(int x){ return x&-x;}返回值为对参数x转为二进制后,将最后一个1进位的结果。例如,l...原创 2020-02-18 13:21:03 · 69 阅读 · 0 评论 -
lnsyoj111 求和
树状数组模板题#include<cstdio>#include<algorithm>#include<iostream>using namespace std;const int maxn=100007;int a[maxn],e[maxn],n,m;void fix(int x,int y){ int i; for(i=x;i<=n;...原创 2020-02-18 12:44:43 · 197 阅读 · 0 评论 -
poj2352 stars(lnsyoj112变式)
等级判别:只要该星星左下方(包括正下方和正左方,不包括自己)有几个星星,等级就是几。#include<cstdio>#include<algorithm>#include<iostream>using namespace std;const int range=32007;int c[range],star[15007];void add(int ...原创 2020-02-17 11:56:44 · 137 阅读 · 0 评论 -
p1908 求逆序对(树状数组)
当ai < 10^5的时候树状数组向上修改,向下查询(即传统方法)。逆向枚举每一个数,先查询已经插入树状数组中比他小的元素的个数,累加ans;然后再把这个数加入到树状数组。for(i=n;i>=1;i–){ans+=getsum(a[i]-1);fix(a[i]);}...原创 2020-02-29 10:29:49 · 339 阅读 · 1 评论 -
lnsyoj105烽火传递
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string> using namespace std;const int maxn=100007;int a[maxn],q[maxn],s[maxn];//s保存每...原创 2020-02-13 11:51:53 · 104 阅读 · 0 评论 -
lnsyoj106猴子
这道题的算法是一个动态规划加单调队列优化时间复杂度,未优化的时间复杂度是O(nnm),优化后是O(nm)。构造一个单减队列,队头是起始点,新入队的元素是要跳跃到的树。代码如下#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<...原创 2020-02-14 10:48:40 · 136 阅读 · 0 评论 -
lnsyoj101括弧匹配检验
原题就是一个栈的应用,不是单调栈。#include<cstdio>#include<algorithm>#include<iostream>#include<stack>#include<string>#include<cstring>using namespace std;string a,stk;int...原创 2020-02-14 13:12:33 · 182 阅读 · 0 评论 -
poj1796 Feel Good
#include<cstdio>#include<algorithm>#include<iostream>#include<stack>using namespace std;const int maxn=1e5+7;/*int n,ansl,ansr;long long num,ans;struct node{ int l,r,v...原创 2020-02-14 13:54:23 · 147 阅读 · 0 评论 -
p4147玉蟾宫
1.我们按行去划分,O(n)枚举行,对该行即以上的部分做最大矩阵处理。2.那么我们用pos数组记录每行向上可延伸的最大距离,预处理的方式即为:(1)读到一个‘F’,该处pos=上一行该列pos的值+1。(2)读到一个‘R’,该处pos=0(因为该处不可向上伸展)。for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { c=ge...原创 2020-02-14 13:56:22 · 230 阅读 · 0 评论 -
lnsyoj102bad hair day
题目大意:n个牛排成一列向右看,牛i能看到牛j的头顶,当且仅当牛j在牛i的右边并且牛i与牛j之间的所有牛均比牛i矮。 设牛i能看到的牛数为Ci,求∑Ci (1 ≤ N ≤ 80,000)。算法解析:可以转化为:这n头牛共能被多少头牛看见。维护一个单减栈。当我们新加入一个高度值时,如果栈中存在元素小于新加入的高度值,那么这些小的牛肯定看不见这个高度的牛(那就看不见这头牛后边的所有牛), 所...原创 2020-02-14 14:09:37 · 119 阅读 · 0 评论 -
p1196关押罪犯
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;struct node{ int x,y,val;}f[100005];int n,m;int fa[100005],b[100005];int find(int x){ if(fa[x]==x)...原创 2020-02-15 10:09:14 · 105 阅读 · 0 评论 -
p2024【NOI2002】食物链
带权并查集的应用,re数组保存元素到达父节点的权值,0表示同种动物,1捕食关系,2表示被捕食关系。注意一下路径压缩和合并时对权值的操作。合并时fa[f1]=f2; re[f1]=(re[a]-re[b]+3)%3;加三是为防止值是负的,合并之后和刚才的关系应是相反的,所以a与b的权值相减,可以证明。路径压缩时fa[x]=find(f);re[x]=(re[x]+re[f])%...原创 2020-02-15 11:56:06 · 105 阅读 · 0 评论 -
p1196【NOI2002】银河英雄传说
所谓带权并查集本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,re[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。#include<cstdio>#include<algorithm>#include<iostream>...原创 2020-02-16 10:26:05 · 207 阅读 · 0 评论