st

Knapsack Cryptosystem

我是研究僧i 提交于 2019-11-27 10:31:22
Knapsack Cryptosystem 超大背包 折半查找 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define P pair<ll,int> ll A[39]; ll C[39]; bool B[39]; ll s,_n; vector<P> v1,v2; void dfs(int i,ll x,int n,bool f) { P a; a.first=x; int t=0; if(f) for(int i=0; i<n; i++) { t=t*2+B[i]; } else { for(int i=_n/2; i<n; i++) { t=t*2+B[i]; } } a.second=t; if(f) v1.push_back(a); else v2.push_back(a); if(i==n)return ; else { B[i]=1; dfs(i+1,x+A[i],n,f); B[i]=0; dfs(i+1,x,n,f); } } int main() { scanf("%lld%lld",&_n,&s); for(int i=0; i<_n; i++) { scanf("%lld",&A[i]); } dfs(0,0,_n/2,1); dfs(_n/2,0,_n,0);

NOIP2015运输计划的一个O(n)解法

偶尔善良 提交于 2019-11-27 10:22:54
一个O(n)的解法。 不难发现有如下性质: 被改造成虫洞的边一定在最长路径上 那么,我们用类似提直径的方法把 这条路径给拎出来 就会形成这样的一棵树。 那么,对于一条边,若其被改成虫洞,最长路径会有如下三种情况: 依然是当前的最长路径 被改造边左端点的最长路径 被改造边右端点的最长路径 难道我们不用考虑经过该边的路径吗?? 当然不用。 我们已经是在 最长路径 上改造边了, 而最长路径是长于任何一条路径的 (废话),那么经过该边的任何路径在此边被改造后 依然短于最长路径 ,故不用考虑。 至于求两端的最长路径,我们可以前缀和后缀分别维护一下。 那么怎么求前缀(后缀)呢? 我们可以在每个点开个vector,对于一条路径,我们把另一端点以及路径的编号加到vector中。 然后,再开个vis数组,表示这个点是否被访问过。 在遍历时,我们访问所有以这一点为一端点的路径标号 \(id\) 和另一端点 \(y\) ,若另 \(vis[y]=true\) ,就拿 \(id\) 的长度去更新即可。(口胡不清,这最好手动模拟一下) 至于求路径长和LCA呢? 额,树剖我是当常数看的。。。 实在不行你可以Tarjan离线预处理啊 代码( 巨丑无比 ): #include<bits/stdc++.h> #define reg register int #define MAXN 300010 using

STL标准模板库之set

不想你离开。 提交于 2019-11-27 09:52:20
目录 一、关联式容器 二、什么是set? 特点 优缺点和适用场景: 三、定义及初始化 四、基本操作 1)容量函数 2)修改函数 3)迭代器 4)其他函数 五、与序列容器的不同点 一、关联式容器 关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值(value)或元素键(key)。缺省情况下以 operator< 进行 比较,不过你也可以提供自己的比较函数,定义出不同的排序准则。 通常关联式容器由二叉树(binary tree)实现。在二叉树中,每个元素(节 点)都有一个父节点和两个子节点;左子树的所有元素都比自己小,右子树的所有元素都比自己大。关联式容器的差别主要在于元素的类型以及处理重复元素时的方式。 STL预先定义好的关联式容器有:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。 二、什么是set? 集合(set)简而言之是一种包含已排序对象的关联容器,不允许有重复元素。 一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。具体实现采用了红黑树的平衡二叉树的数据结构。 特点 set中的元素都是排好序的。 set中没有重复的元素。 map和set的插入删除效率比用其他序列容器高,因为对于关联容器来说,不需要做内存拷贝和内存移动。 优缺点和适用场景

LuoGuP4127:[AHOI2009]同类分布

荒凉一梦 提交于 2019-11-27 09:27:17
Pre 前前后后交了 \(4\) 次。 Solution 直接枚举模数,就是每一个数的各位数的和,然后 \(dp\) 到了最后判断和是否相等。 学习了记忆化搜索实现的数位 \(dp\) ,发现挺好用的。 Code #include <cstdio> #include <cstring> #define ll long long using namespace std; const ll N = 20, M = 200; ll dp[N][M][M], a[N], len, mod; inline ll dfs (int p, int limit, int st, int pre) { if (!p) { if (st == mod && !pre) return 1; else return 0; } if (!limit && dp[p][st][pre] != -1) return dp[p][st][pre]; ll res = 0; for (int i = 0; i <= (limit ? a[p] : 9); ++i) { res += dfs (p - 1, limit && (i == a[p]), st + i, (pre * 10 + i) % mod); } if (!limit) dp[p][st][pre] = res; return res; }

字符串操作、数据类型转换

风流意气都作罢 提交于 2019-11-27 08:35:15
字符串主要操作方法: st = 'hello kitty' print(st.count('l'))      #统计元素出现次数 print(st.center(50,'#'))    # 居中 print(st.startswith('he'))   # 判断是否以某个字符串开头 print(st.find('t'))       #返回索引值 print(st.format(name='alex',age=37))      # 格式化输出的另一种方式 print('My tLtle'.lower())        #转换成小写 print('My tLtle'.upper())        #转换成大写 print('\tMy tLtle\n'.strip())        #左右空格及制表符、换行符删除 print('My title title'.replace('itle','lesson',1))  #整体替换、可指定位置字符串替换 print('My title title'.split('i',1))        #字符串用,分割,用指定字符串替换,分隔 数据类型转换: 1,int <——> str s = str(int),没有条件 i = int(str),转换的字符串必须是数字 2, list <——> tuble list = list

leetcode654 Maximum Binary Tree

微笑、不失礼 提交于 2019-11-27 05:53:27
思路: 使用单调栈可以达到O(n)。 实现: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution 11 { 12 public: 13 TreeNode* constructMaximumBinaryTree(vector<int>& nums) 14 { 15 stack<TreeNode*> st; 16 for (auto it: nums) 17 { 18 TreeNode* tmp = new TreeNode(it), *last = NULL; 19 while (!st.empty() && tmp->val > st.top()->val) 20 { 21 last = st.top(); st.pop(); 22 } 23 tmp->left = last; 24 if (!st.empty()) st.top()->right = tmp; 25 st.push(tmp); 26 } 27

2019牛客多校第八场

大憨熊 提交于 2019-11-27 05:01:40
2019牛客多校第八场 A. All-one Matices solved at 01:58(+2) 求一个 \(n*m\) 的 \(01\) 矩阵的极大全 \(1\) 子矩阵数目 悬线法处理出 \(d\) 数组(从这个位置最多向上延伸多少个 \(1\) ),然后单调栈处理出每个位置的 \(d\) 能延伸的左右最远位置, \(vis\) 打标记的时候如果发现标记不是 \(i-1\) 也不是 \(0\) 说明这里之前有一个极大矩阵 #include <bits/stdc++.h> using namespace std; const int N = 3010; char a[N][N]; int d[N][N], s[N][N], s2[N][N], n, m, vis[N][N], ans; int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) { scanf("%s", a[i] + 1); } for(int j = 1; j <= m; ++j) { for(int i = 1; i <= n; ++i) { if(a[i][j] == '0') d[i][j] = 0; else d[i][j] = d[i - 1][j] + 1; } } for(int i = 1; i <= n; ++i) {

POJ 2201 Cartesian Tree

和自甴很熟 提交于 2019-11-27 04:59:10
笛卡尔树模版 按第一关键字排序,然后按第二关键字构建笛卡尔树即可。 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) #define __fastIn ios::sync_with_stdio(false), cin.tie(0) #define pb push_back using namespace std; typedef long long LL; inline int lowbit(int x){ return x & (-x); } inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar(); } while(isdigit(ch)){ ret = (ret << 3) + (ret << 1) + (ch ^ 48); ch = getchar(); } return w ? -ret : ret; } template <typename A> inline A __lcm(A a, A b){ return a / __gcd(a, b) * b; } template <typename

stm32——modbus例程网址收藏

◇◆丶佛笑我妖孽 提交于 2019-11-27 00:32:45
http://www.stmcu.org.cn/module/forum/thread-599873-1-1.html 注: 本程序适合新手入门,第一个程序写了如何实现串口的收发多个字节程序 第二个程序写了如何利用主程序循环来监控数据接收 第三个程序写了如何利用定时器来监控数据是否发送和接收完毕 第四个程序写了RS485如何通信通信 第五个程序写了modbus协议。。。。。。。。。。 通过上位机发送一串字节后并在显示屏上显示所发送的数据,大概就是这个功能 芯片是STM32F103VET的,编译器是IAR6.1的。需要的就带走吧! modbus <ignore_js_op> 1.usart.zip 799.08 KB, 下载次数: 1500, 下载积分: ST金币 -1 <ignore_js_op> 2.usart主程序循环监控.zip 826.95 KB, 下载次数: 1220, 下载积分: ST金币 -1 <ignore_js_op> 3.usart定时器监控.zip 812.14 KB, 下载次数: 1135, 下载积分: ST金币 -1 <ignore_js_op> 4.RS485.zip 816.13 KB, 下载次数: 1567, 下载积分: ST金币 -1 对需要的朋友很有用 modbus在工业现场的底层通信 应用非常广泛. 传个资料 ,版权归网络所有 <ignore

Ackerman函数的非递归表示

断了今生、忘了曾经 提交于 2019-11-27 00:31:58
/************************************************************************/ /* akm={ n+1 m=0 */ /* akm(m-1,1) m!=0,n=0 */ /* akm(m-1,akm(m,n-1)) m!=0,n1=0 */ /* Ackerman函数 */ /* nflag其实可以不用存在,本意想让其标志是否向下传递top的f给top-1的n,其实每一步都需要传递,所以不需要存在*/ /************************************************************************/ #include <stdio.h> const int MaxSize=100; struct { int f; int m; int n; int flag;//1表示函数值没有计算出来 int nflag;//1标志n是需要重新计算(是否需要向下求值) }st[MaxSize]; int top=-1; int ackerman(int m,int n) { top++; st[top].m=m; st[top].n=n; st[top].flag=1; st[top].nflag=0; while(top>-1) { if (st[top].flag==1)