自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (1)
  • 收藏
  • 关注

原创 grep的使用以及匹配多个字符串

匹配多个字符串,使用\|隔开每一个字符串。grep 'phoenix\|linux' sample.txt匹配多个字符串grep基本用法

2021-03-18 17:22:48 767

转载 C语言把宏定义字符串化

原文链接有时候想要把一个宏定义的内容嵌入到字符串中去。例如宏定义:#define RATE 15000#define STR1(R) #R#define STR2(R) STR1(R)printf(STR1(RATE) "\n");printf("rate is: " STR2(RATE) "\n");想要把RATE的15000作为字符串嵌入到其他地方,就可以使用STR2(A)这个宏,将另一个宏定义A的内容转化成字符串,例如上面的代码就会输出:RATEsample rate = 15

2021-02-01 22:19:14 2731

原创 ARM内存屏障产生的原因

程序在执行时的实际内存访问顺序和程序代码编写的访问顺序不一致,会导致内存乱序访问。编译时,编译器优化导致内存乱序访问;执行时,多个CPU间交互引起的内存乱序访问。这些优化可能会导致实际执行代码与程序员的代码逻辑不符,导致一些错误的发生,为了保证内存访问的一致性,也是保证程序的正确性,使用内存屏障来保证内存的访问顺序。ARM采用的是弱一致性内存模型,使用内存屏障将一致性问题交由程序员解决。内存屏障指令的基本原则如下:所有在内存屏障指令之前的数据访问必须在内存屏障指令之前完成;所有在内存屏障指

2021-01-15 13:36:42 547

原创 LMA与VMA详解

reference

2021-01-03 11:37:00 1310

原创 Arm——AArch64简介

AArch64 state的寄存器寄存器分为一般寄存器和特殊寄存器,另外一些寄存器在特权执行模式下才能使用。31个64位的一般寄存器X0-X30,通过W0-W30访问其中的低32位。四个栈寄存器

2020-12-30 21:12:57 3092

原创 Makefile入门

referenceassignmentsSimple assignment (:=)变量一旦赋值,就用这个定义替换这个变量出现的所有地方。Recursive assignment (=)变量遇到了才被替换,可以在之后改变它的值。Conditional assignment (?=)只有变量没有值的时候,该赋值才有效。Appending (+=)例如CC = gcc, CC += -w, CC现在的值为gcc -w.patterns and special variables%是通配

2020-12-29 20:32:25 192

原创 Google KickStart 2020 Round G, Combination Lock,二分

题目链接题意:给NNN个数,每个数的范围为[1,W][1,W][1,W],通过以下两种操作将所有的数都变成一样的,问最小操作数是多少。操作一个数+1+1+1,即a[i]=(a[i]+1>W?1:a[i]+1)a[i]=(a[i]+1>W?1:a[i]+1)a[i]=(a[i]+1>W?1:a[i]+1)操作一个数−1-1−1,即a[i]=(a[i]−1<1?W:a[i]−1)a[i]=(a[i]-1<1?W:a[i]-1)a[i]=(a[i]−1<1?W:a[i

2020-12-22 12:57:59 231

原创 二分的本质以及模板

给y总打一波广告,自从看了acwing y总讲的二分,再也没有不会的二分题了。模板bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:// 求左端点,红色箭头int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mi

2020-12-21 20:41:03 224

原创 并查集的理解,附练习题

首先贴上模板:struct DSU { vector<int> fa, dis, sz; int n, comp_cnt; DSU(int _n) : n(_n), comp_cnt(_n), fa(_n), dis(_n, 0), sz(_n, 1) { iota(fa.begin(), fa.end(), 0); } int find(int x) { if (x == fa[x]) return

2020-12-19 12:03:08 279

原创 离散化的两种方法

#include <bits/stdc++.h>using namespace std;void fun1() { // 有重复元素的离散化 vector<int> a = {20, 20, 30, 30, 15}; vector<int> t; t = a; sort(t.begin(), t.end()); // 需要先去重 int m = unique(t.begin(), t.end()) - t.begin(); for (int&am

2020-12-16 15:08:22 191

原创 几道贪心证明题,基本都是通过交换相邻元素来证明结论

对于有顺序的序列类问题,若要求最小最大值,常常可考虑贪心解决,常用套路就是对于一个排列来说,考虑交换其中的相邻两个元素可以使得结果更优,则通常能得到一个方案使得整个排列的结果最优。leetcode1665leetcode1665. 完成所有任务的最少初始能量分析:两种分析方法,一种是正向考虑,即设最小的初始能量是ppp,一种是逆向考虑,即设最小的结束能量是ppp,这里我们使用逆向考虑的方法。假设我们当前的任务的排列是[a1,m1],[a2,m2],...,[an,mn][a_1,m_1],[a_2

2020-12-14 13:53:34 169

原创 两道逆序对的题,都是把数组a通过交换相邻元素变成与数组b相同的最小次数等于新构造数组c的逆序对个数

P1966 火柴排序CF1375E. Inversion SwapSort

2020-12-12 11:51:33 490

原创 判断一个数是不是2的幂次

1. 用一个更大的2的幂次数来整除当前数比如2102^{10}210一定能够整除21,22...2^1, 2^2...21,22...等等。2. 使用位运算来判断当一个数为2的幂次时,其二进制表示一定只有一位是1,其形式如001000000010000000100000,而把它减一后得到形如000111110001111100011111,即两数相与等于0.if ((i & (i-1) == 0) // i is power of 2...

2020-12-07 15:18:50 644

原创 网络编程之半同步/半异步模式

这种模式是一个主线程,主线程自己创建一个epoll然后负责接收连接,也只负责接收连接,当接收到连接之后,将连接的fd分发给子线程。子线程有多个,类似于线程池的模式,不同的是这里的子线程每个子线程都有自己的一个epoll,从主线程分发过来的fd会被加入到子线程的epoll中然后由子线程接管后续的读写。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#i.

2020-11-16 21:11:40 157

原创 Codeforces 1417C.k-Amazing Numbers,经典区间覆盖点问题

1417C.k-Amazing Numbers题意:对于每一个区间长度[1,k][1,k][1,k],输出在每个区间内都存在的最小的数,若不存在,输出−1-1−1。题解:首先固定一个数xxx,其在数组中出现的位置p1<p2<⋯<pmp_1<p_2<\cdots<p_mp1​<p2​<⋯<pm​,那么对于每一个区间长度为kkk的区间都要覆盖到xxx,那么区间长度至少为pi+1−pip_{i+1}-p_ipi+1​−pi​,同时k≥p1&&a

2020-10-19 19:33:20 172

原创 Codeforces 1422D.Returning Home, 最短路,奇妙的建图方式

1422D.Returning Home题意:二维空间里有nnn个点,若两个点的xxx或yyy相同,则两个点之间的移动不需要时间,否则两个点之间的移动消耗min(abs(x1−x2),abs(y1−y2))min(abs(x_1-x_2),abs(y_1-y_2))min(abs(x1​−x2​),abs(y1​−y2​))的时间,给一个起点和一个终点,问从起点到终点的最短时间是多少?题解:很明显如果在每两个点之间连一条边,那么直接跑一个最短路就得出结果了,但是很不幸的是点的数量多达1e51e51e

2020-10-19 13:30:30 156

原创 Codeforces1422C, Bargain, 数学题,整体拆分成计算每部分贡献

1422C. Bargain题意:对于一个数,比如121312112131211213121,每次可以移除其中连续的一段,比如移除131213121312,剩下的数为121121121,现在要求的是对于每一种子串被移除的情况,最后剩下的数的和是多少?比如107107107这个数,我们可以移除111,000,777,101010,070707,107107107等子串,然后得到070707,171717,101010,777,111,000,和为42.题解:若直接暴力枚举每一段子串,然后计算答案的话

2020-10-19 11:05:44 204

原创 CF1430F. Realistic Gameplay,动态规划,打僵尸,一个弹夹k发子弹,求最少消耗的子弹。

CF1430F. Realistic Gameplay题意:打僵尸游戏,你有一把枪,一个弹夹里装着kkk发子弹,有nnn波僵尸,每一波僵尸在[li,ri][l_i,r_i][li​,ri​]时间内同时出现aia_iai​个,nnn个区间相互不重合,消灭僵尸不消耗时间,但是换弹夹(将子弹填充满)需要111个时间,若换掉的弹夹里还有子弹,则这些子弹被统计为额外的消耗,求的是消灭所有僵尸所消耗的最少的子弹数量(僵尸的数量加上丢掉的子弹数量)是多少(等价于丢掉的子弹的数量最少)?题解:首先能想到的DP就是d

2020-10-18 23:00:42 433

原创 arc097,E - Sorted and Sorted,逆序对+DP

题目链接题意:两种不同颜色的球混合在一起构成了一个序列,现在每次可以交换相邻的两个球,问至少多少次操作后可以使得每种颜色球自己的序列有序。每种球的值都是[1,n][1,n][1,n]。题解:首先只考虑一个单独的排列,那么会发现最小的交换次数就是逆序对个数,因为每次都要将最小的未有序数移动到最左边,这样只会减少当前最小数的逆序对个数。当两种颜色(黑和白)的球混合到一起后,虽然也是以相同的方式每一次将最小的未有序的数移动到左边,但是不能确定是先移动黑球最小的还是先移动白球最小的,因为移动一种颜色的球会

2020-09-10 10:20:38 230

原创 CF1365E.Inversion SwapSort,逆序对与冒泡排序的神奇关系

题目链接题意题意很简单,就是给一个数组aaa,然后首先找出aaa中所有的逆序对,然后输出一个逆序对的排列,按顺序交换所有的逆序对最后使得整个数组非递减 。比如这样[3,1,2]→[2,1,3]→[1,2,3][3,1,2]→[2,1,3]→[1,2,3][3,1,2]→[2,1,3]→[1,2,3],输出[1,3],[1,2][1,3],[1,2][1,3],[1,2]。题解解法1:首先考虑对于一个排列来说,如何安排逆序对的顺序才能使得最终有序?考虑每次确定最后一个数,也就是最后一个数得是nnn

2020-07-07 23:04:11 248

原创 cf1371E2.Asterism,数学,同余

题目链接题意:给一个数组aaa,进行如下操作:初始有一个值xxx,对于aaa的任意一个排列PPP,依次比较a1,a2,...ana_1,a_2,...a_na1​,a2​,...an​,如果x>ai,则x=x+1x>a_i,则x=x+1x>ai​,则x=x+1,要求xxx大于所有的aia_iai​。令f(x)f(x)f(x)为满足上述条件的aaa的排列的个数。另外再给一个质数p,p≤np,p \leq np,p≤n,要求f(x)%p≠0f(x)\% p\neq 0f(x)%p​=

2020-07-02 20:23:23 491

原创 acwing545.Kickstart闹钟,等比数列求和,推公式

题目太长了,直接看原题链接吧。传送门首先固定指数幂,假设当前kkk为2。那么单独考虑每一个A[i]A[i]A[i]的贡献到底是多少,就以题目里的[1,4,2][1,4,2][1,4,2]这个序列为例。A[1]A[1]A[1]的贡献为A[1]∗(12+12+12)=3∗A[i]∗(12)A[1]*(1^2+1^2+1^2)=\\ \qquad \qquad \qquad \qquad 3*A[i]*(1^2)A[1]∗(12+12+12)=3∗A[i]∗(12)A[2]A[2]A[2]的贡献为A[2]

2020-06-23 20:25:56 125

原创 cf1265E,Beautiful Mirrors, 期望,解方程

传送门官方题解题意:从1→n1 \to n1→n,在位置iii有p[i]p[i]p[i]的概率到i+1i+1i+1,有1−p[i]1-p[i]1−p[i]的概率回到1,问到nnn的期望是多少。#include <bits/stdc++.h>using namespace std;const int MOD = 119 << 23 | 1;int inv(int a) { int r = 1, t = a, k = MOD - 2; while (k)

2020-06-20 22:08:26 176

原创 cf1362E. Johnny and Grandmaster,贪心+数学,一个序列划分成两部分,差最小

题意:给一个序列,序列里的数都是pkip^{k_i}pki​,把序列里的数划分为两个集合,使得差值最小。题解:首先对kik_iki​排序,从大到小排列,对于pkip^{k_i}pki​来说,如果∑j=i+1npkj>=pki\sum_{j=i+1}^{n}p^{k_j}>=p^{k_i}∑j=i+1n​pkj​>=pki​,那么一定存在lll使得∑j=i+1lpkj==pki\sum_{j=i+1}^{l}p^{k_j}==p^{k_i}∑j=i+1l​pkj​==pki​。否则直

2020-06-05 22:42:09 265

原创 cf 1355C, Count Triangles,区间前缀和或者组合计数

题意三角形的三条边满足条件1≤A≤x≤B≤y≤C≤z≤D≤5⋅1051\leq A\leq x\leq B\leq y \leq C\leq z\leq D\leq 5\cdot 10^51≤A≤x≤B≤y≤C≤z≤D≤5⋅105,求有多少组{x,y,z}\{x,y,z\}{x,y,z}能够构成一个合法的三角形。题解很明显,合法三角形必满足x+y>zx+y>zx+y>z,那么如果每次固定xxx的值,而yyy和zzz的值可以在区间内随意取的话,这就转化为了一个求区间交集的问题了,x+y

2020-06-01 23:22:41 236

原创 cf1354D,模拟Multiset,树状数组+倍增二分

题意:模拟一个multiset,两种操作:插入一个数kkk删除当前multiset中第kkk大的数最后经过一系列操作后输出multiset中的数。题解:插入数的话可以用树状数组去维护每个数的个数。删除操作的话可以通过倍增二分的方式去查找树状数组中[0...idx][0...idx][0...idx]的最大的那个idxidxidx使得区间和小于kkk。#include <bits/stdc++.h>using namespace std;const int maxn =

2020-06-01 17:55:30 191

原创 cf1263E,Editor,括号的匹配+两个单调栈

codeforces 1263E题意:给一串类似编辑器的操作:L:把光标向左移R:把光标向右移(:把当前位置字符修改为():把当前位置字符修改为)问每一次操作后当前括号是否匹配,若匹配则输出匹配的最大深度。题解:如果不进行修改,那么可以用两个单调栈,一个单调递减栈记录是否有不匹配的括号,若有不匹配的括号则栈顶的值不等于0;一个单调递增栈记录最深的深度,栈顶的值代表最大括号深度。而现在可以进行修改,需要注意到每次修改只会移动一步或是修改当前位置的字符,那么以当前下标ppp为中心,将整个区间

2020-05-31 18:41:05 232

原创 (环形)最大子序列和,Kadane算法的前缀和解释

在Kadane算法中,问题是求以下标i结尾的最大子序列和,换句话说,我们想找到cur−prefcur-prefcur−pref的最大值,其中curcurcur是[0,i][0,i][0,i]所有元素的和,pref是[0,j][0,j][0,j]所有元素的和,其中j<ij<ij<i,所以想要cur−prefcur-prefcur−pref最大,就是找到prefprefpref的最小值。leetcode53.最大子序和class Solution {public: int max

2020-05-31 11:58:38 600

原创 Codeforces Round #632,D. Challenges in school №41, 思维+二进制序列01的交换

题目链接题意给一个只包含0,10,10,1的序列,如果a[i]=1,a[i+1]=0a[i]=1,a[i+1]=0a[i]=1,a[i+1]=0,那么在一次操作中可以将111和000交换,每一秒至少进行一次这样的操作,也可以在一秒内进行多次这样的操作,问在第kkk秒能否让序列刚好变成000111000111000111这种所有000在前,111在后的序列。并且输出每秒的操作的位置。题解首先考虑把变换一个序列到最终形式所需要的最少的时间miniminimini和最大的时间maximaximaxi。最

2020-05-23 16:52:03 158

原创 Codeforces 1237C2,Balanced Removals (Harder),三维空间中点与点的连接和消除,编码技巧(lambda递归)

题意:给nnn个三维平面中的点(xi,yi,zi)(x_i,y_i,z_i)(xi​,yi​,zi​),每一次可以消除两个点,如果这两个点构成的立方体中不包含其他的点,输出n/2n/2n/2次消除操作,每一次操作为{i,j}\{i,j\}{i,j}。input:63 1 00 3 02 2 01 0 01 3 00 1 0output:3 65 12 4题解:首先考虑一维的情况,在一维的情况下,所有的点都在一条线上,那么从左到右依次消除相邻的点,即满足条件。然后考虑二维的情

2020-05-15 15:32:26 253

原创 Codeforces Round #642, F. Decreasing Heights, dp,修改矩阵中格子的值,求修改次数最小满足条件

题意:有一个n∗mn*mn∗m的矩阵,每个格子的高度为ai,ja_{i,j}ai,j​,要求找到一条从左上角(1,1)(1,1)(1,1)到达(n,m)(n,m)(n,m)的路径,每次只能向下或向右走,并且路径上的格子高度满足如下条件:如果当前格子的高度为xxx,那么路径上的下一个格子的高度为x+1x+1x+1。你可以对格子的高度进行修改,每次可以将格子(i,j)(i,j)(i,j)的高度减一,即ai,j=ai,j−1a_{i,j}=a_{i,j}-1ai,j​=ai,j​−1。最终要求的是修改次数最

2020-05-15 14:56:08 197

原创 Codeforces Round 637 D. Nastya and Scoreboard, dp求是否存在,存在输出最大值(贪心)

题目链接题意:电子钟显示器,一共7个区段,可以用来表示9个数字。现在有n个这种显示器,并且一些区段没有未正常工作,现在问正好打开kkk个区段,能够显示的最大的数字是多少。题解:首先肯定得判断由当前的显示效果变到0−90-90−9这几个数字分别需要打开多少个区段,用dis[i][j]dis[i][j]dis[i][j]来表示第iii个显示器显示数字jjj需要几步操作,若不能变换到相应数字则为−1-1−1,那么可以通过dpdpdp来判断kkk步操作是否能够能把所有的显示器显示正常。dp[i][j]dp

2020-05-14 20:33:51 194

原创 Codeforces Round #627 F. Maximum White Subtree, 树形DP+"rebooting"

题意:给一颗多叉树,树上的节点要么为黑,要么为白,用a[i]a[i]a[i]给出,000为黑,111为白,现在要求以每一个节点作为根时,该节点下的树的cntw−cntbcnt_w-cnt_bcntw​−cntb​最大,cntwcnt_wcntw​是该树中白色节点的数量,cntbcnt_bcntb​为该树中黑色节点的数量。input:90 1 1 1 0 0 0 0 11 21 33 43 52 64 76 85 9output:2 2 2 2 2 1 1 0 2 首先考虑以1

2020-05-14 16:13:54 86

原创 Codeforces Round #636, D. Constant Palindrome Sum, 区间+前缀和

题意,一个数组aaa,包含nnn个整数,所有aaai_ii​都不超过一个整数kkk,你可以做一些替换数组中元素的操作:将aaai_ii​替换为[1;k][1;k][1;k]范围中的数,最终使得整个数组满足如下条件:在替换完成后,所有的aaai_ii​是正整数且不超过kkk;对iii从111~n2\frac{n}{2}2n​满足条件:aaai_ii​+aaan−i+1_{n-i+1}n−i+1...

2020-05-05 22:37:16 119

原创 Linux控制CPU使用率

代码主要来自陈硕的Muduo库,这里主要自己记录一下原理。Windows的任务管理器如何检测CPU使用率如果我们打开任务管理器,就会发现CPU的使用率差不多是1s更新一次,在这1s内,CPU忙(执行应用程序)的时间与刷新周期总时间(1s)的比率,就是CPU的使用率。如果我们想要控制CPU的使用率,比如要控制在50%,就应该让应用程序一半的时间忙,一半的时间空闲。但是又不能前0.5s忙,后0....

2020-04-20 20:43:01 275

原创 C++智能指针使用时遇到的坑

C++智能指针使用时遇到的坑unique_ptrunique_ptr当函数返回unique_ptr时,会自动使用move拷贝,所以经常会有下面这样类似的用法:unique_ptr<int> connect() { unique_ptr<int> p(new int(10)); // to do something return p;}问题在g++编译器中出...

2020-03-20 11:57:46 158

原创 编译驱动时error: ‘struct file’ has no member named ‘f_dentry’

Linux 3.19 compat: file_inode was addedstruct access f-&gt;f_dentry-&gt;d_inode was replaced by accessor functionfile_inode(f)Signed-off-by: Joerg Thalheim &lt;joerg@higgsboson.tk&gt;Signed-off-by...

2018-03-09 13:35:23 6921 2

转载 启动保护模式的程序

这里说的是把程序编译成COM文件,然后让DOS来执行它。1. 到Bochs官网下载一个FreeDos。解压后将其中的a.img复制到我们的工作目录中,并改名为freedos.img。2. 用bximage生成一个软盘映像,起名为pm.img。3. 修改bochs启动文件,修改为如下所示:floppya: 1_44=freedos.img, status=insertedfl

2017-07-31 21:56:41 294

转载 win32汇编清空键盘缓冲区

可调用win32函式FlushConsoleInputBuffer实作方法如下:.dataconsoleInHandle DWORD ? ; 控制台标准输入句柄.....code....INVOKE GetStdHandle, STD_INPUT_HANDLE ;读取输入句柄,STD_INPUT_HANDLE是win32常数mov console

2017-06-09 17:21:07 1035 1

转载 scanf读取带有空格的字符串

使用scanf("%[^\n]%*c", str);[^\n]的意思是读取到\n停止,当然也可以\n换成其他符号,%*c的意思是读入一个回车,这样就不用清空输入缓冲区了,否则如果不加%*c继续使用scanf的话就会直接读取缓冲区里的东西,需要使用fflush(stdin)清空缓冲区。

2017-06-01 21:20:05 538

win32汇编结构体快速排序

用win32汇编实现的结构体快速排序

2017-06-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除