st

学习笛卡尔树

匿名 (未验证) 提交于 2019-12-02 23:52:01
笛卡尔树(知识总结+板子整理) 笛卡尔树 例题1:hdu-6305 RMQ Similar Sequence 【题意】: 题意:定义RMQ(A,l,r)为:序列A中,满足A[i] = max(A[l],A[l+1],...,A[r])的最小的i。如果对于任意(l,r)都满足RMQ(A,l,r)=RMQ(B,l,r)则为A和B是RMQ Similar。现在出A序列,B序列的每个数都是0~1之间的实数,问满足与A是RMQ Similar的所有B序列中所有数之和的期望。 题解:不难看出如果A和B是RMQ Similar,则A和B的笛卡尔树同构。考虑B中的每个数是0~1之间的实数,因此出现相同数字的概率为0,可以假设B是每个数都不相同排列。设A的笛卡尔树每个子树的大小为sz[u],则任一B排列与A同构的概率是 ,因为B中每个数满足均匀分布,因此期望值为1/2,和的期望为n/2,因此满足与A同构的B中所有数之和的期望为 所以求:sz[i] 指的是笛卡尔树每个子树的大小。 贴上代码: 1 #include<cstdio> 2 #include<algorithm> 3 #include<stack> 4 using namespace std; 5 typedef long long ll; 6 const int N = 1e6 + 5 ; 7 const int INF =

Rescue BFS+优先队列 杭电1242

匿名 (未验证) 提交于 2019-12-02 23:51:01
˼· : 优先队列 每次都取最小的时间,遇到了终点直接就输出# include <iostream> #include <queue> #include <cstring> using namespace std ; const int N = 200 ; int n , m , sa , ea , sr , er ; char arr [ N ][ N ]; int bb [ N ][ N ]={ 0 }; struct stu { int a , b ; int time ; bool friend operator <( const stu & a , const stu & b ){ return a . time > b . time ; } }; int a [ 4 ]={ 0 , 1 , 0 ,- 1 }; int br [ 4 ]={ 1 , 0 ,- 1 , 0 }; void bfs (){ priority_queue <stu> que ; stu s ; s . a = sa ; s . b = ea ; s . time = 0 ; que . push ( s ); bb [ sa ][ ea ]= 1 ; int flag = 0 ; while ( que . size ()){ stu p ; p = que . top (); que .

2019牛客多校第二场

匿名 (未验证) 提交于 2019-12-02 23:49:02
题意:从图中随机选几个点,如果这些点连通,那么就称为团.团的价值是所有点的和.求第 \(k\) 小的团. 一开始想到 \(2^n\) 的算法 如果从合法状态然后增广,就可以避免走到很多非法状态,然后用一个last避免重复 cin>>bit[i] bitset不能这样输入 #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 105; ll s[maxn]; bitset<100> bit[maxn]; int n, k; struct node { bitset<100> now; int last = 0; ll val = 0; node(bitset<100> _now = 0, int _last = 0, ll _val = 0) { now = _now; last = _last; val = _val; } bool operator<(const node &c) const { return val > c.val; } }; priority_queue<node> que; ll dijkstra() { node st; st.now.reset(); que.push(st); while (!que.empty()) { st = que

最大流(三)―― Dinic算法

匿名 (未验证) 提交于 2019-12-02 23:49:02
因为没打优化,比打了优化的SAP算法慢了很多,超时了。 #include <vector> #include <cstdio> #include <iostream> #include <cmath> #include <queue> #define numm ch - 48 #define pd putchar ( ' ' ) #define pn putchar ( '\n' ) #define pb push_back #define fi first #define se second #define fre1 freopen ( "1.txt" , "r" , stdin ) #define fre2 freopen ( "2.txt" , "w" , stdout ) using namespace std ; template < typename T > void read ( T & res ) { bool flag = false ; char ch ; while (! isdigit ( ch = getchar ())) ( ch == '-' )&&( flag = true ); for ( res = numm ; isdigit ( ch = getchar ()); res =( res << 1 )+( res << 3 )+ numm );

【模板】ST表

匿名 (未验证) 提交于 2019-12-02 23:49:02
题目背景 这是一道ST表经典题――静态区间最大值 O(1) 题目描述 N 输入输出格式 输入格式: N , N a_i i 项。 M l_i, r_i [ l_i, r_i] 输出格式: M行,每行一个整数,依次表示每一次询问的结果。 输入输出样例 8 8 9 3 1 7 5 6 0 8 1 6 1 5 2 7 2 6 1 8 4 8 3 7 1 8 9 9 7 7 9 8 7 9 说明 对于30%的数据,满足: 1 ≤ N , M ≤ 1 0 1 1 ≤ N , M ≤ 1 0^ 5 对于100%的数据,满足: 1 ≤ N ≤ 1 0^ 5 , 1 ≤ M ≤ 1 0^ 6 , a i ∈ [ 0 , 1 0^ 9 ] , 1 ≤ l i ≤ r i ≤ N 分析: 所谓的ST表就是一种类似于线段树的数据结构,然后通过类似倍增的查找进行求解区间最值。 CODE: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 int n,m,a[100005],maxn[100005][25]; 8 int max(int x,int y){return x>y?x:y;} 9 int

VIJOS-P1514 天才的记忆

匿名 (未验证) 提交于 2019-12-02 23:47:01
JDOJ 1548 https://neooj.com/oldoj/problem.php?id=1548 题目描述 输入 一个整数N表示数字的个数,接下来一行为N个数。第三行读入一个M,表示你看完那串数后需要被提问的次数,接下来M行,每行都有两个整数A,B。 输出 输出共M行,每行输出一个数。 样例输入 6 34 1 8 123 3 2 4 1 2 1 5 3 4 2 3 样例输出 34 123 123 8 提示 对于30%的数据,1< =N< =10000,1< =M< =100 对于100%的数据,1< =N< =200000,1< =M< =10000. RMQ问题的经典裸题,知识点是使用ST算法快速求解区间最大值(最小值) 个人认为ST算法是比较数学的一个方法,思想很独特也很好用。 这里简单介绍一下ST算法以及我对ST算法的浅薄理解。 首先我们明确ST算法的适用范围,即给定数列区间求最值。设每个查询区间为[x,y],那么它的长度就是y-x+1,(很好理解吧)。ST算法的原理是动态规划以及倍增思想,换句话说,假如我们要求解一个区间的最大值最小值,我们可以这样考虑:把一个区间分成两块,求左边那块和右边那块的最值,最后把答案汇总更新即可。那么我们的动归状态就出来了: 设f[i][j]为数列a中a[i]到a[i+2^j-1]这个区间的最值。 状态转移方程: f[i][j]=max

[力扣]144_二叉树的前序遍历

匿名 (未验证) 提交于 2019-12-02 23:47:01
/* 给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 */ 方法一:常规递归方式,用C语言实现(根左右) 代码实现: /** * Note: The returned array must be malloced, assume caller calls free(). */ int length = 0 ; int* ret_val = NULL ; void add_ele(int val) { length++; ret_val = (int*)realloc(ret_val,sizeof(int)*length); /*追加动态空间*/ ret_val[length-1] = val; } void __preOrder(struct TreeNode* node) { if(node==NULL) { return; } add_ele ( node->val ); __preOrder ( node->left

ST LINK DIY记录

匿名 (未验证) 提交于 2019-12-02 23:40:02
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYGY731793898/article/details/91446660 自制ST-LINK笔记 原理图 从网上搜集,稍作整理。如下: 外壳 前不久从淘宝上 买USB外壳,顺带了几个小盒子,这次用上。 PCB尺寸 36.6*15CM 准备烧程序了,官方的固件STLinkV2.J16.S4.bin准备好。 先安装固件程序下载软件STM32 ST-LINK Utility_v3.1.0.exe. 找一个好的ST-LINK,连接到目标板的四线ISP SWD接口。运行下载软件,先加载需下载的固件, 再点Target connect, 建立目标板与STLINK下载器的连接。再点Full chip erase, 然后Program verify.固件下载完毕。接着运行ST-LinkUpgrade.exe升级固件。 先Device Connect, 如须升级,点Yes. 做了两个ST LINK, 一个主芯片是STM32F103C8T6, STM32,STM8下载一切正常。另一个主芯片是国产的CKS32 F103C8T6, 给STM32下载没问题,但是给STM8下载程序的SWIM接口有问题 ,不能正常下载。换回STM32F103C8T6,一切正常。看来这国产替代产品,在某些方面也是 不能完全代替的

1046. Last Stone Weight

匿名 (未验证) 提交于 2019-12-02 23:34:01
1046. Last Stone Weight 方法1: multiset We have a collection of rocks, each rock has a positive integer weight. Each turn, we choose the two heaviest rocks and smash them together. Suppose the stones have weights x and y with x <= y. The result of this smash is: If x == y, both stones are totally destroyed; If x != y, the stone of weight x is totally destroyed, and the stone of weight y has new weight y-x. At the end, there is at most 1 stone left. Return the weight of this stone (or 0 if there are no stones left.) Example 1: Input: [2,7,4,1,8,1] Output: 1 Explanation: We combine 7 and 8 to get

Knight Moves

元气小坏坏 提交于 2019-12-02 23:18:35
https://loj.ac/problem/10028 题目描述   在一个 \(L×L\) 的棋盘中,给出马的初始位置和终止位置,求最少跳多少步从初始到终止。 思路    \(bfs\) 的模板题,不过为了提高速度我们可以采用双向宽度搜索,分别从起始位置和终止位置进行 \(bfs\) ,在判断何时两个 \(bfs\) 在同一地点相遇即可。为了避免效率过低,我们可以每次选择队列中节点少的进行拓展。 代码 #include <bits/stdc++.h> using namespace std; struct aa { int x,y; }st,ed; int dx[10]={1,1,-1,-1,2,2,-2,-2}; int dy[10]={2,-2,2,-2,1,-1,1,-1}; int dis[3][330][330],l,ans; queue<aa>q[3]; bool vis[3][330][330]; bool expand(int k) { aa now=q[k].front();q[k].pop(); int d=dis[k][now.x][now.y]; for(int i=0;i<8;i++) { aa nex; nex.x=now.x+dx[i];nex.y=now.y+dy[i]; if(nex.x<=0||nex.x>l||nex.y<=0||nex.y