- 博客(29)
- 收藏
- 关注
原创 CryptoPP::SecByteBlock类型转unsigned char
在使用CryptoPP库时,大多key和iv都是CryptoPP::SecByteBlock这种类型,有时候想用key和iv做一些事情,我习惯用unsigned char类型,方便一些。转换方法如下://这里就是举个例子,只有一些必要的代码片段:using namespace std;using namespace CryptoPP;SecByteBlock key;string s = string(key.begin(), key.end());unsigned char out[32
2022-05-16 00:35:16
619
1
原创 Windows API 获取MachineGUID
MachineGUID在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\中。使用WindowsAPI获取,需要用到RegOpenKeyA(),RegQueryValueExA(),和RegCloseKey()这三个函数代码如下:#include <Windows.h>#include <string>#include <iostream>int main(){ std::string sub
2022-05-12 20:29:37
3257
原创 C++将函数作为参数
举例:#include <stdio.h>typedef int(*Fun)(int,int);//x+yint add(int x,int y){ return x+y;}//x-yint d(int x,int y){ return x-y;}void print(Fun f){ printf("%d\n",f(5,2));} int main(){ //分别将add和d函数作为参数传给print函数 print(add);
2022-04-14 10:26:11
985
原创 使用ShellExecuteW执行exe并传入参数
ShellExecuteW函数用法#include <iostream>#include <Windows.h>#include <string>using namespace std;wchar_t* string_2_LPCWSTR(string orig){ size_t origsize = orig.length() + 1; const size_t newsize = 100; size_t convertedChars = 0; wch
2022-04-06 10:14:03
2657
原创 洛谷P3373线段树
这题挺难受的,又加又乘还得取模主要是维护懒标记的时候先乘后加细节过两天再补#include <bits/stdc++.h>using namespace std;typedef long long ll;#define putln putchar('\n')#define rep(i,a,b) for(int i=a;i<=b;++i)#define per(i,a,b) for(int i=a;i>=b;--i)const int MXN=1e5+5;int
2021-10-06 19:09:35
154
原创 线段树模板+一些自己的理解
#include <bits/stdc++.h>using namespace std;#define rg register#define putln putchar('\n')#define debug(x) cout<<"@ "<<(x)<<endl#define rep(i,a,b) for(rg int i=a;i<=b;++i)#define per(i,a,b) for(rg int i=a;i>=b;--i)typ
2021-09-24 20:00:15
130
原创 线段树单点修改,维护区间最大值
以hdoj1754为例:#include <bits/stdc++.h>using namespace std;#define rg register#define putln putchar('\n')#define debug(x) cout<<"@ "<<(x)<<endl#define rep(i,a,b) for(rg int i=a;i<=b;++i)#define per(i,a,b) for(rg int i=a;i>
2021-09-23 20:28:23
305
原创 随便写写,关于2021ccpc网络赛
·····这篇文章不是吐槽这次网络赛的,就是想写点东西。···· 这次网络赛是在家打的,三人连着麦。因为疫情下周要在家上网课,所以这个暑假特别长,在家就很懒散,虽说想好好补一补,但是总想去玩。时间过得很快,然而我的水平并没有什么提高。····今天只过了一题,最简单那道,而且还是俩人想了半天写了半天还wa了一次,之后就没再过题,总是把简单的问题想的很复杂。虽说今天在杭电oj体验极差,但无法掩盖我菜的事实,过的题少和今天oj的服务器没什么太大关系。·····回想一下acm正经开始了一年多了,这是第二个赛季
2021-08-28 23:16:17
1475
原创 hdoj 1850 nim博弈
题目意思就是若干堆牌,如果先手必胜的话先手第一步有几种拿牌方式。首先nim博弈判断输赢的方法是 如果异或和为0则先手必败,不等于0则先手必胜。对于先手必胜的情况,先手第一步拿完牌之后剩下的牌对于后手应该是必败的情况,也就是剩下牌异或和为0。m堆牌,a1, a2, a3, … ,am假设此时是先手必胜的局面,则异或和ans = a1^ a2^ a3 ^ … ^am > 0现在假设先手第一步在 a1堆牌里拿走x张 ,此时a1变为 a1’ ,如果这么拿是可行的话,那么现在的牌面 a1’, a2, a
2021-08-26 09:28:35
154
原创 hdoj 1847 博弈(打表,找规律)
一堆牌,轮流拿,每次只能拿2的幂次张牌,判断输赢。最后结论是牌数为3的倍数时先手输结论很简单,但一开始真看不出来,先打个表看一下,毕竟数据不大,<=1000,直接打表做一下:思路:首先sg[ i ]=0,必败。对于每一数量 i,分析所有第一次能拿的数量 f [ j ],如果sg[ i - f [ j ] ]==0,说明先手拿完f [ j ]张牌以后剩下的数量对于另一个人是必败的,那么对于先手来说就是必胜的。分析所有可以拿的数量,如果都是先手败的情况,那对于这个数量就是先手必败,sg[ i
2021-08-24 21:11:16
255
原创 线段树模板
区间修改,区间查询#include <bits/stdc++.h>using namespace std;inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
2021-08-12 20:07:02
168
原创 数组离散化
只保留数组之间的大小关系#include <bits/stdc++.h>using namespace std;typedef long long ll;#define rg register#define putln putchar('\n')#define rep(i,a,b) for(rg int i=a;i<=b;++i)#define per(i,a,b) for(rg int i=a;i>=b;--i)const int MXN=1e5+5;int
2021-08-10 21:21:41
203
原创 静态RMQ问题:ST表
ST表,用于解决静态区间最值查询问题,预处理O(nlogn),查询O(1)!详解推荐视频:树状数组与ST表用到三个数组a[ ] , lg[ ] , st[ ][ ]数组a[ ],原数组数组lg[ ],lg[i]表示log(i)数组st[ ][ ],st[i][j]表示左端点为i,长度为2^j的一段区间的最值,也就是(i…i+2^j-1)这段区间初始化过程用了dp思想,二重循环,第一层枚举区间长度,第二层枚举左端点。洛谷模板题:ST表代码:#include <bits/stdc++.h
2021-08-08 22:01:00
202
原创 利用树状数组求逆序对
逆序对:ai>aj 且 i<j 。说白了就是一个序列中前面比后面大的对,举个例子:序列2 1 4 3 2 , (2 1)就是一个逆序对,(4 3)、(4 2)也是。暴力做法:遍历这个序列,数一下每个元素前面比他大的元素的个数,累加就是最后的结果,举个例子:序列2 1 4 3 2第一个元素 2,前面没有元素,结果 = 0第二个元素 1,前面比他大的是 2,结果 = 1第三个元素 4,前面没有比他大的,结果 = 0第四个元素 3,前面比他大的是 4,结果 = 1第五个元素 2
2021-08-01 16:10:53
352
原创 树状数组(三)【区间修改,区间查询】
【区间修改,区间查询】同样利用到了差分数组。求区间和可以是求两个前缀和再相减,比如求l~r的和,可以是s( r)-s(l-1),所以问题就是求前缀和。原数组为a,他的差分数组为x,(a1=x1=0)则a1=x1,a2=x1+x2,… ,an=x1+x2+…+xn那么前缀和s(n)=a1+a2+…+an=(x1)+(x1+x2)+…+(x1+x2+…+xn)=n(x1+x2+…+xn)-(0* x1+1* x2+…+(n-1)* xn)所以维护x1, x2, … ,xn和 (0)*x1, (
2021-07-28 09:52:32
630
原创 树状数组(二)【区间修改,单点查询】
【区间修改,单点查询】区间修改考虑一个数组,频繁的进行区间(l~r)修改,这时候我们会利用差分数组,关于差分数组 因为只需要修改 l 和r+1就可以,复杂度O(1),最后求个前缀和即可。树状数组进行区间修改也一样可以用差分数组来实现。我们维护一个差分数组,这个差分数组不需要是原数组的差分数组,可以当做是当前变化量的差分数组。显然在初始阶段,没有对任何区间做任何操作,所以这个差分数组全部是0。这样也是方便单点查询,因为这个差分数组的前缀和就是当前值的变化量。举个例子: 原数组a: 4
2021-07-27 14:29:48
730
原创 树状数组(一) 【单点修改,区间查询】
【单点修改,区间查询】这是树状数组的基本用法,修改和查询的复杂度都是O(logn)。个人认为树状数组是巧妙的利用二进制实现了二分,所以他查询的时候很快。单点修改是要把与这个点所有有关的点都进行修改,是一个从下往上的过程,通过一个点+lowbit(这个点)来更新所有管辖这个点的点,直到最上面区间查询时就是求两个前缀和,一相减就是区间和。求前缀和的过程与单点修改的操作相反,是不断通过一个点 - lowbit(这个点) 来覆盖所有小的区间以上是个人理解。树状数组就不放图了,关于lowbit的内容可以看一
2021-07-27 14:10:46
585
原创 CF1537C Challenging Cliffs
CF round #762(div2)C题 Challenging Cliffs题目补题。昨晚真是没想到这么做啊。。。好蠢官方tutorial:标程:#include "bits/stdc++.h"using namespace std;int main(){ int t; cin >> t; while(t--){ int n; cin >> n; vector<int> h(
2021-06-19 09:23:18
391
原创 百度地图爬取poi数据(圆形区域检索)
爬取百度地图poi数据需要用到百度地图的“地点检索”服务,关于“地点检索”和ak的获取请看:百度地图开放平台的服务文档,文档很重要,要仔细看。因为矩形区域检索是高级权限,不能直接用,所以我用的是圆形区域检索,覆盖地图的范围肯定是不够好的。“地点检索”这个服务给的配额上限是2000次/天(如果没充钱的话),并发值是2,所以一天要控制在这个范围内。之前网上也有说过有400条的限制,现在不是400条了,是100左右,所以用圆形区域检索的话注意半径别太大了,要不爬的就太少了。我这半径设的是2000米,设定经纬
2021-06-16 09:07:43
3192
8
原创 百度地图api “BMapGL is not defined“ 错误
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2021-06-03 20:39:53
16211
13
原创 判断闰年
满足下列条件之一的是闰年:1.能被4整除但不能被100整除2.能被400整除bool run(int n){ if((n%4==0&&n%100!=0)||(n%400==0)) return true; return false;}
2021-03-03 09:11:58
162
原创 对一维差分的一些理解
差分差分就是两个元素的差值差分数组是一个数组中前后两个元素的差值构成的数组。设原数组为a[ ],差分数组为b[ ]则b[0]=a[0],b[i]=a[i]-a[i-1]例: 下标 : 0 1 2 3 4 5 原数组 a[]: 5 3 2 6 8 9差分数组 b[]: 5 -2 -1 4 2 1我们可以发现,通过求差分数组的前缀和就可以得到原数组为什么要用差分当对一个数组的某一部分+或-同一个数时,可以遍历,复杂度O(n)。但如果进行许多次这样
2021-02-24 23:33:20
291
1
原创 杭电oj 1258 Sum It Up
dfs要记录路径最后输出#include <bits/stdc++.h>using namespace std;typedef long long ll;int sum,n,ans,x;/*sum和n是总和,ans用来记录是否有解,x是一个中间量,临时存数*/int a[15],b[15];//数组a存放输入的数据,数组b存放路径void dfs(int nowsum,int nowk,int bi)//nowsum是当前的和,nowk记录选择的是数组a的第几个数{
2021-02-04 13:22:35
261
原创 巴什博奕
巴什博奕一堆石子,石子的数量为n,两个人轮流拿,每人最少拿1个,最多拿m个第一种情况:最后一个拿完的赢n%(m+1) = 0 后手胜,反之先手胜第二种情况:最后一个拿完的输(n-1)%(m+1)=0 后手胜 ,反之先手胜...
2021-01-30 23:16:46
268
原创 洛谷P5638 光骓者的荣耀(前缀和、dp)
洛谷P5638 光骓者的荣耀这道题可以看成大小为n数组的和减去中间某一段连续的k个数,并且使得结果最小。最直白的方法当然逐一尝试,用数组的和减去每一段连续的k个数,最后输出一个最小值,但是这样会超时。所以这里介绍一个动态规划的方法,一个简单的dp,万物皆可dp思路还是一样的,大小为n数组的和减去中间某一段连续的k个数,任何一段连续k个数都可能是我们需要减去的一段,所以我们从头开始,每一段都尝试,所以对于从头开始的每一部分数(也就是前缀)都有两种可能:要么减去这一段,要么保留这一段。如果保留的话,值就
2020-10-27 21:10:12
601
原创 哈夫曼编码的C++实现(优先队列、贪心)
哈夫曼编码C++实现哈夫曼编码就是不断地取数列中最小的两个,合并,再添加到数列中,循环。利用了贪心的思想。在C++实现的时候可以用到优先队列 priority_queue,这个方便的东西。这个优先队列,会自己进行排序,每次加进去一个数,都会更新,降序排列或升序排列。以升序排列为例,更新过后的队首元素就是数列中最小的数。priority_queue的用法首先要用到头文件#include<queue>定义优先队列:priority_queue<int,vector<int>
2020-10-08 23:36:22
906
2
原创 大数加法(C++和Java实现)
大数加法C++实现Java实现C++实现先用字符串输入,再分别逆序填入数组,接着就模拟手算,从两个数的低位开始(也就是数组从0开始)逐位相加,判断是否大于等于10,如果大于等于10,就取余,然后下一位+1;如果小于10,正常加。上代码:#include <iostream>#include <cstring>using namespace std;int a[1000000],b[1000000];int main(){ int l1,l2,l; memset(
2020-10-08 23:12:32
228
原创 洛谷 P1135 奇怪的电梯(BFS实现)
洛谷 P1135 奇怪的电梯又是一道广搜最开始交了一次只过了四个点,还有两个点MLE,其余的T了。很纳闷,数据规模只有200,BFS居然会T。后来思考了一下,发现有好多重复的点,比如:有多个楼层都可以到达某一楼层,那么到达的这个楼层就可以不用再入队了 所以我用了一个check[ ]数组用来判断第i层有没有去过,0表示没有去过,1表示去过。之后正常搜就好了。上代码:#include <queue>#include <stdio.h>using namespace std;
2020-10-03 00:16:30
450
原创 洛谷P1443 马的遍历(BFS)
洛谷P1443 马的遍历蒟蒻第一篇题解&博客一道基本的广搜,也是我第一次完整地自己写出来的广搜,菜死了。。。大概思路就是从最初的位置开始,遍历八个方向,符合条件的放到队列里,然后出队一个点执行上述操作,直到队列为空。还是挺好写的,个人感觉比深搜好写,也好想。代码不是很简洁,但是我自己好理解上代码:#include <iostream>#include <stdio.h>#include <queue>using namespace std;st
2020-10-02 18:52:15
447
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅