st

LOJ10121 与众不同

戏子无情 提交于 2020-01-27 02:55:58
## \[ 本题要求: 求 [l,r] 内最长连续无重子序列(下称LCRS) \] 如何解决 st[i] 记录 以i结尾的LCRS 的起点)last[i] 记录 i 在 a[] 中 上次出现的位置 p.s. st[]在任何一个序列中都是 单调不上升 的,有兴趣的读者可以自己推推看 怎么做 处理 \(last[i]\) ; 维护 \(st[i]\) 转移:$ st[i] = max(st[i-1],last[a[i]]+1) $ 所以 \(f[i][0]=i-st[i]+1\) 所以可以预处理 \(RMQ\) 对每一次询问的 \(L,R寻找其pos(pos的左侧所有的st[i]<l,右侧都 >=l)\) 所以 $ answer = max(pos-l,RMQ(pos,r))$ p.s. 因为st是单调的,所以可以用二分找pos #include <bits/stdc++.h> using namespace std; const int maxn = 2 * 1e6 + 5; const int adnu = 1e6 + 5; const int logn = 50; int n, m; int last[maxn], st[maxn], a[maxn], len[maxn]; int f[maxn][logn], lg[maxn]; void RMQ() { lg[0] = -1;

强连通缩点

倖福魔咒の 提交于 2020-01-26 13:12:44
const int MAXN = 8001, MAXM = 8001; int head[MAXN], next[MAXM], last[MAXM], lineNum = 0; void add(int x,int y){ lineNum++, next[lineNum] = head[x], last[lineNum] = y, head[x] = lineNum; } vector<int> own[MAXN]; int vis[MAXN], bel[MAXN], st[MAXN], dfn[MAXN], low[MAXN], deep = 0, cnt = 0; void tarjan(int x){ vis[x] = 1; low[x] = dfn[x] = ++deep; st[++st[0]] = x; for(int l=head[x]; l; l=next[l]){ int y = last[l]; if(vis[y] == 0) tarjan(y), low[x] = min(low[x], low[y]); else if(vis[y] == 1) low[x] = min(low[x], dfn[y]); } if(dfn[x] == low[x]){ ++cnt; do{ bel[st[st[0]]] = cnt; own[cnt].push_back(st

UVA10085-不知错在何处

有些话、适合烂在心里 提交于 2020-01-26 11:53:34
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<map> 6 #include<queue> 7 #include<string> 8 using namespace std; 9 typedef struct state STA; 10 struct state 11 { 12 int st[3][3]; 13 int stnum; 14 int step; 15 string way; 16 bool operator< (const state p)const 17 { 18 return this->step<p.step; 19 } 20 }; 21 22 const int dx[]={1,-1,0,0}; 23 const int dy[]={0,0,1,-1}; 24 const char Wy[]={'D','U','R','L'}; 25 26 int ans[3][3]; 27 string answay; 28 int ans_step; 29 30 map<int,bool> cyc; 31 queue<STA> psd; 32 33 int bfs(STA start) 34 { 35 int nowstep

线段树

假如想象 提交于 2020-01-25 19:50:05
/* Please write complete compilable code. Read input from standard input (STDIN) and print output to standard output(STDOUT). For more details, please check http://www.interviewstreet.com/recruit/challenges/faq/view#stdio */ #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #include <string> #include <map> #include <set> #include <fstream> using namespace std; typedef long long ll; const int MAXN = 100010; const int QUADRANT = 4; int ans[QUADRANT]; inline int get_quadrant(int x, int y){ if(x > 0){ if(y > 0)return 0; return 3; } if(y > 0)return 1;

剑指offer-栈的压入、弹出序列

爷,独闯天下 提交于 2020-01-24 07:30:15
问题描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 源码: 以popV作为外层循环,方便很多。 class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { stack<int> st; for(int i=0, id=0; i<pushV.size(); i++) { while(st.empty() || st.top() != popV[i]) { st.push(pushV[id++]); if(id > pushV.size()) return false; } st.pop(); } return st.empty(); } }; 来源: CSDN 作者: 凡凡.cs 链接: https://blog.csdn.net/fanyuwgy/article/details/104070225

天勤数据结构代码——栈基本操作

纵然是瞬间 提交于 2020-01-24 03:27:47
顺序栈 typedef struct SqStack { int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释。 int top; //栈顶下标(指针) }; 链栈节点 typedef struct LNode { int data; //数据域 struct LNode *next; //指针域 }; 初始化顺序栈 void initStack(SqStack &st) { st.top = -1; } 判断栈空 如果为空则返回 1, int isEmpty(SqStack st) { if (st.top == -1) { return 1; } else { return 0; } } 进栈代码 int push(SqStack &st, int x) { if (st.top == maxSize - 1) { //栈不满 return 0; } ++(st.top); st.data[st.top] = x; return 1; } 出栈代码 int pop(SqStack &st, int &x) { if (st.top == -1) { // 判断栈是否为空, return 0; } x = st.data[st.top]; --(st.top); return 1; } 链栈的初始化 void

模板 - 数据结构 - 重链剖分

霸气de小男生 提交于 2020-01-24 00:49:36
一般都是重链剖分的多,重链剖分在维护路径信息时比较优秀。 也可以使用长链剖分,使用深度最大的儿子作为“重儿子”即可,看了一下用于某种与深度有关的启发式合并比重链剖分好,等以后再研究吧。 #include<bits/stdc++.h> #define lc (o<<1) #define rc (o<<1|1) typedef long long ll; using namespace std; const int MAXN = 100000 + 5; int dep[MAXN], siz[MAXN], son[MAXN], fa[MAXN], top[MAXN], tid[MAXN], rnk[MAXN], cnt; int n, m, r, mod; int a[MAXN]; int head[MAXN], etop; struct Edge { int v, next; } e[MAXN * 2]; inline void init(int n) { etop = 0; memset(head, -1, sizeof(head[0]) * (n + 1)); } inline void addedge(int u, int v) { e[++etop].v = v; e[etop].next = head[u]; head[u] = etop; e[++etop].v = u;

RMQ问题(ST算法)

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-24 00:28:26
RMQ是询问某个区间内的最大值或最小值的问题,ST算法可以求解RMQ问题.ST算法通常用在要 多次询问某一些区间的问题中,相比于线段树,它的程序实现更加简单,运行速度更快,它可以做到O(nlogn)的预处理,O(1)回答每个问题.使用ST算法的条件是没有修改操作,因此它适用于没有修改操作并且访问次数较多(10^6级别甚至更大)的情况. 1.预处理 ST算法的原理实际上是动态规划,首先要知道f数组的含义,f[i][j]中i表示左边端点,j表示2^j个长度, 因此f[i,j]表示的是区间为[i,i+2^j-1]这个范围内的最大值,也就是以a[i]为起点连续的2^j个数的最大值.由于元素个数为2^j个,所以从中间平均分成两部分,每一部分的个数都为2^(j-1);假设f[6][3]分为f[6][2]和f[10][2],如下图所示, 整个区间的最大值一定是左右两部分最大值的较大者,满足动态规划的最优化原理,分析得f数组的状态转移方程为f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1]). for(int j = 1;(1<<j) <= n;++j) //j枚举每一个可能出现的长度 for(int i = 1;i + (1<<j)-1 <= n;i++) //i枚举每一个区间的左端点 f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j

1745. Yet Another Answer

梦想的初衷 提交于 2020-01-23 04:38:18
http://acm.timus.ru/problem.aspx?space=1&num=1745 题目大意: 可以是任意的顺序,在满足括号匹配的情况下,求组合成的字符串长度最长 思路: 先将每一个字符串进行处理,处理时将匹配的去掉 比如说 { )(()(())(} 处理后就变成了 {)( (} 当然字符串的长度是没有变化的 处理后的字符串假如说 左括号的个数为L 右括号的个数为R 我们必须确定一个正确的顺序,可以让我们从头到尾的逐个决定是否选用当前字符串,而且不影响最优结果 字符串有 L>R,L<R 和 L=R 三种情况,对于L>R的字符串要放在前面 因为每一个这样的字符串都可以使 左括号 — 右括号 的值变大, 而对于 L<R 的情况对应放在最后,L=R的情况放在中间 对于L<R的字符串之间 需要把 R 小的放在前面, 对于L>R的情况 要用对称思想去确定顺序 确定顺序之后,剩下的就DP就可以了 代码: #include<iostream> #include<stack> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #include<vector> #include<set> #include<map> #include<string> #include<cmath> using

虚树

醉酒当歌 提交于 2020-01-22 21:25:22
给定树上一些点集,处理和该点集有关的询问,通常这些询问需要用树形 \(DP\) 解决 若发现所有询问的点集总大小 \(\sum k\leqslant 10^5\) ,那么就可以考虑用虚树来解决 若原树为 若询问点为 \(1\ 2\ 3\) ,则虚树为 若询问点为 \(1\ 3\ 7\ 8\) ,则虚树为 构造出的虚树为询问点和询问点的 \(LCA\) ,其他不重要的点和边都进行了类似于路径压缩的操作 虚树的构建为增量算法,先将每个询问点按 \(dfs\) 序排序,用栈来实现,栈内为从根到栈顶元素这条链,这条链同时也是虚树上的链 实现时,先将根节点入栈 当要向虚树内插入节点 \(x\) 时,分若干情况讨论 ① 若栈内只有根节点( \(top=1\) ),则直接将 \(x\) 入栈 ② 若 \(lca(x,st[top])=st[top]\) ,说明 \(x\) 和 \(st[top]\) 在同一条链上,则 ③ 若 \(lca(x,st[top])\ne st[top]\) ,则说明 \(x\) 和 \(st[top]\) 分别在两棵不同的子树中,这时 \(st[top]\) 所在的子树已经在虚树上构建完。那么开始退栈,直到将 \(st[top]\) 所在的子树全部退出栈,同时连虚树上的边,若操作完后 \(lca\) 不在栈中,再将其入栈以及连边,最后将 \(x\) 入栈