st

最短路 次短路 k短路(k很小)

蹲街弑〆低调 提交于 2020-03-09 04:11:45
最短路 luogu 3371 https://www.luogu.org/problemnew/show/P3371 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <queue> 5 #include <algorithm> 6 using namespace std; 7 const int maxn=1e4+10; 8 9 int dist[maxn]; 10 bool vis[maxn]; 11 12 struct node 13 { 14 int d,len; 15 ///相反 16 bool operator<(const node & b) const 17 { 18 return b.len<len; ///b.d放在左边,方便 19 } 20 }; 21 22 priority_queue<node> st;///这样写就可以了,省略后面的部分 23 vector<pair<int,int> >e[maxn]; 24 25 int main() 26 { 27 int n,m,s,x,y,z,d,i; 28 vector<pair<int,int> >::iterator j; 29 scanf("%d%d%d",&n,&m,&s); 30 for (i=1;i<=m

ST表

不羁的心 提交于 2020-03-08 09:49:02
ST表 部分内容来自: https://blog.csdn.net/xuechen_gemgirl/article/details/77073979?ops_request_misc=%7B%22request%5Fid%22%3A%22158265901119725222458250%22%2C%22scm%22%3A%2220140713.130056874 ..%22%7D&request_id=158265901119725222458250&biz_id=0&utm_source=distribute.pc_search_result.none-task 特点 1.用来维护 静态区间最值 非常有效快捷的方法 2.它与DP类似,具有 后无效性 ,层次关系之间具有 最优性 复杂度:预处理:O(nlogn),单次查询O(1),空间O(nlogn) (对比隔壁线段树:预处理O(nlogn),查询O(logn),空间O(n)) 具体操作 更新 用二维数组a[m][i]来记录 包含m这个点 且 以m为左(或右)端点 区间长为2^i个数的最优值 那么类似于dp,他也有类似的转移关系式(这里默认m为右端点) a[m][i]=opt(a[m][i-1]+a[m-(1<<(i-1))][i-1] (注意别忘了给位运算加小括号) 既然m左边的ST值已经确定,那么维护a[m][i

二叉搜索树迭代器(栈)

ε祈祈猫儿з 提交于 2020-03-08 06:19:14
题目: https://leetcode-cn.com/problems/binary-search-tree-iterator/ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { public : /* *实现一个二叉搜索树迭代器。你将使用二叉搜索树的 *根节点初始化迭代器。调用 next() 将返回二叉搜索 *树中的下一个最小的数。 */ stack < TreeNode * > st ; BSTIterator ( TreeNode * root ) { while ( root ) { st . push ( root ) ; root = root - > left ; } } int next ( ) { TreeNode * p = st . top ( ) ; st . pop ( ) ; int ans = p - > val ; p = p - > right ; while ( p ) { st . push ( p ) ; p =

蓝桥杯——发现环(并查集+DFS)

妖精的绣舞 提交于 2020-03-05 21:01:27
题目: 输入输出: 分析: 根据题目可知只会多出一条边,那么只有可能出现一个环,每当输入两个点的时候使用并查集判断两个点是否有相同的祖先,如果没有,将两个点合并,如果两个点已经具有共同的祖先,说明此时这条边构成了环,那么此时可以将这两个点作为环的起点和终点,使用DFS搜索这一条路径,所经过的点即为环上的点。 代码: # include <iostream> # include <cstring> # include <cstdio> # include <vector> # include <algorithm> using namespace std ; const int MAXN = 100005 ; int root [ MAXN ] , rnk [ MAXN ] , num [ MAXN ] ; bool vis [ MAXN ] , found ; vector < int > vec [ MAXN ] ; int n , ind ; int Getr ( int x ) { if ( root [ x ] == x ) return x ; else return root [ x ] = Getr ( root [ x ] ) ; } void Union ( int x , int y ) { if ( rnk [ x ] > rnk [ y ] ) root [

STL专题-栈

天涯浪子 提交于 2020-03-05 10:23:57
# include <iostream> # include <cstdio> # include <string> # include <queue> # include <stack> # include <algorithm> # include <cmath> # include <list> # include <cstdlib> # include <cstring> using namespace std ; int main ( ) { string s ; int t ; cin >> t ; getchar ( ) ; while ( t -- ) { getline ( cin , s ) ; //输入空格需要用getline int len ; len = ( int ) s . size ( ) ; stack < char > st ; for ( int i = 0 ; i < len ; i ++ ) { if ( s [ i ] != ' ' ) { st . push ( s [ i ] ) ; //持续入栈 } if ( s [ i ] == ' ' || i == len - 1 ) { //遇到空格或栈满的情况 while ( ! st . empty ( ) ) { //栈非空 printf ( "%c" , st . top ( ) )

STL-栈&队列FIFO,FILO

陌路散爱 提交于 2020-03-05 10:12:52
# include <iostream> # include <cstdio> # include <string> # include <queue> # include <stack> # include <algorithm> # include <cmath> # include <list> # include <cstdlib> # include <cstring> using namespace std ; int main ( ) { int t ; cin >> t ; while ( t -- ) { int n ; cin >> n ; string s1 , s2 ; cin >> s1 ; if ( s1 == "FIFO" ) { queue < int > qu ; while ( n -- ) { cin >> s2 ; if ( s2 == "IN" ) { int num ; cin >> num ; qu . push ( num ) ; } else { if ( qu . empty ( ) ) { cout << "None" << endl ; } else { cout << qu . front ( ) << endl ; qu . pop ( ) ; } } } } else { stack < int > st ; while

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)D(交互,DFS)

为君一笑 提交于 2020-03-04 18:22:09
每次查询两个叶子结点并把他们从树上删除,最终返回的答案就是根节点。 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 vector<int>v[1007]; 5 int dep[1007],pre[1007]; 6 int vis[1007]; 7 void dfs(int x,int fa){ 8 for(int i=0;i<v[x].size();++i){ 9 if(v[x][i]==fa) 10 continue; 11 dep[v[x][i]]=dep[x]+1; 12 pre[v[x][i]]=x; 13 dfs(v[x][i],x); 14 } 15 } 16 int main(){ 17 ios::sync_with_stdio(false); 18 cin.tie(NULL); 19 cout.tie(NULL); 20 int n; 21 cin>>n; 22 for(int i=1;i<n;++i){ 23 int x,y; 24 cin>>x>>y; 25 v[x].emplace_back(y); 26 v[y].emplace_back(x); 27 } 28 int st=1; 29 for(int t=1;t<=n/2;++t){ 30

BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

谁说胖子不能爱 提交于 2020-03-04 16:17:48
曼哈顿距离转切比雪夫距离 把坐标变为 \((x+y,x-y)\) 之后,求两点之间距离即为 \(\max(|x_1-x_2|,|y_1-y_2|)\) 之后再通过扫描线,平衡树维护 \(y\) 坐标,每次将前驱后继进行合并 #include <bits/stdc++.h> #define pb push_back #define fi first #define se second #define pii pair<int, int> #define pli pair<ll, int> #define lp p << 1 #define rp p << 1 | 1 #define mid ((l + r) / 2) #define lowbit(i) ((i) & (-i)) #define ll long long #define ull unsigned long long #define db double #define rep(i,a,b) for(int i=a;i<b;i++) #define per(i,a,b) for(int i=b-1;i>=a;i--) #define Edg int ccnt=1,head[N],to[E],ne[E];void addd(int u,int v){to[++ccnt]=v;ne[ccnt]=head[u];head[u]

后缀数组小结

让人想犯罪 __ 提交于 2020-03-04 07:05:54
后缀数组果然是个神奇的东西…看起来非常巧妙的样子。话说我花了很长时间终于把罗穗骞大神论文里的代码弄懂了。。。 论文在这里: http://wenku.baidu.com/view/ed1be61e10a6f524ccbf85fd.html (OrzOrzOrzOrz) 关于后缀数组的一些小应用: POJ3693 给定一个字符串,求重复次数最多的连续重复子串。如果存在多个,则输出字典序最小的一个。 枚举长度 l, 然后求长度为 l 的子串最多能连续出现几次。 http://www.cnblogs.com/wangziyun/archive/2013/03/18/2966628.html POJ1743 给定一列数,求最长重复子串,且这两个子串不能重叠。 注意:这道题中的“重复”定义为整个子串加上或减去一个整数后和另一子串相同。 转化为差分序列后二分答案 k,然后把height数组分组,每组的后缀之间的height值不少于 k。判断每组中sa的最大值与最小值之差是否不小于 k。如果有一组满足,那么该答案就是满足条件的。这种分组的思想似乎十分常用。 View Code 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 #define maxn 20010 6

CF1234F Yet Another Substring Reverse (状压dp)

牧云@^-^@ 提交于 2020-03-03 11:19:12
首先我们发现,因为可以在任意地方翻转,所以最后的答案就是一个合法子串和他的补集的子集中个数和最大的那个 因此我们先枚举每一个合法状态,记录他的合法个数有几个。 然后我们从头枚举每一个状态,计算状态的子集中的最大个数。 这样我们最后只要枚举状态和补集,就能计算出真正的答案了 #include<iostream> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int N=21; int f[1<<21]; int n; string s; int st[N]; int main(){ cin>>s; int i,j; for(i=0;i<s.size();i++){ int tmp=0; int cnt=0; memset(st,0,sizeof st); for(j=i;j<s.size();j++){ //枚举每一个合法状态 if(st[s[j]-'a']) break; tmp+=1<<(s[j]-'a'); st[s[j]-'a']=1; cnt++; f[tmp]=cnt; } } for(i=0;i<1<<20;i++){ //dp思想由子集的最大数来判断当前状态的最大个数 for(j=0