- 博客(59)
- 收藏
- 关注
原创 [eBPF] sockops类型运行梳理
BPF_PROG_TYPE_SOCK_OPS程序类型能够在socket处理流程中的关键路径上执行ebpf程序。基础:在内核源码中静态埋点,在socket处理函数中调用函数,最终执行挂载的bpf逻辑。函数将上下文信息(sock结构体)封装成,最终透传出去,ebpf程序能够访问中的字段。应用:可以重定向socket,绕过TCP/IP协议栈;修改socket参数(通过辅助函数)…
2023-12-20 22:40:42
897
原创 [MIT 6.1810]Lab7-networking
为硬件所有,当网卡收到包时,会检查环形队列 head 位置的描述符。此时,生产者是硬件网卡(维护head指针),消费者是需要实现的接收函数(维护tail指针)。作为生产者将入参mbuf打包发送到发送环形队列中,这样硬件作为消费者会自己处理(发出去)。生产者消费者之间的通讯方式是:网卡收到包时产生中断,中断处理程序去调用接收函数。为了达成目的,需要看E1000的文档,对E1000有足够的了解。所以,接收函数就是要去实现处理这个环形队列中已有的待处理包。手册中约定了控制寄存器的地址,例如环形队列的地址…
2023-10-22 16:16:25
316
原创 牛客练习赛86 C. 取钱(DP)
传送门分析见代码注释#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<double, do
2021-11-01 14:22:54
158
原创 牛客练习赛59.E 石子搬运(数据结构优化dp)
传送门分析dp状态表示:f[i][j]表示前i个物品搬运了j次的最小代价。因为第x个物品搬n次是可以o(1)o(1)o(1)算出来的。LL calc(int x, int n){ if (x <= n) return 1ll * x; int cur = x / n, tmp = x -= cur * n; return 1ll * cur * cur * (n - tmp) + 1ll * tmp * (cur + 1) * (cur + 1);}
2021-10-17 14:50:20
146
原创 NC21336 和与或 (数位dp变形)
传送门分析给你一个数组R,包含N个元素,求有多少满足条件的序列A使得0 ≤ A[i] ≤ R[i]A[0]+A[1]+…+A[N-1]=A[0] or A[1]… or A[N-1]第一行输入一个整数N (2 ≤ N ≤ 10)第二行输入N个整数 R[i] (1 ≤ R[i] ≤ 1e18)很明显 等式左边不能产生二进制进位。那么A[]数组的二进制表示中,不可能有两个元素的相同的位都是1。举例:10012+102+00002=101121001_2+10_2+0000_2=1011_210
2021-10-06 16:06:26
184
原创 CF855E Salazar Slytherin‘s Locket(数位dp 状压)
传送门分析数位dp 问题是如何记录状态。题目要统计出现偶数次的个数->二进制利用二进制记录第i个数出现次数的奇偶性。代码#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typ
2021-09-23 16:26:27
196
原创 Educational Codeforces Round 46 F. One Occurrence(主席树)
传送门求任意一个区间中只出现一次的数区间问题用主席树维护,对前缀建主席树。主席树需要维护该元素上一次出现的位置,如果[l,r]中元素上一次出现的位置小于l,则说明有解(并且解就是这个元素)所以主席树需要维护区间最小值,顺带维护最小值出现的下标。如果一个元素在区间中出现了很多次:eg:5,6,5,7,5,8则元素5上一次出现的位置会不断被后面新出现的5更新。故答案是正确的。每个版本相较于上一个版本:1.将此位置的值更改为last[i]2.如果这个数之前出现过,则将last[i]这个位置重新
2021-09-07 16:53:37
119
原创 HDU4745 Two Rabbits(区间dp)
wsfw 卡在最后的答案统计了,看了别人的博客,觉得很有道理。先破环成链,答案有两种情况:1.在一段区间(最长为n)中的回文子序列:12321。两人站在l,r的位置开始行动2.对于一个长度为n-1的序列来说,str[l-1]==str[r+1],所以有一种情况是两人站在l-1,r+1的位置开始行动。(说白了,l-1,r+1是同一个点,这种情况就是起点相同的情况。)#include <bits/stdc++.h>using namespace std;//-----pre_def--
2021-08-23 20:43:01
140
原创 HDU4123 Bob’s Race(树形dp,RMQ,树的直径)
传送门题意一棵n点的树,每一个点都从当前位置走到距离最远的位置的距离dis[i],1~n的连续区间中最大并且走的最远距离差值不超过Q的区间右多大。分析感觉有点不好下手最后的询问是区间最大值减最小值,可以用RMQ实现。那么就需要处理出每个点从当前位置走到距离最远的位置的距离dis数组了。直觉上能dfs预处理出来,类似求树的直径,要注意的点是如何处理从父亲结点下来的长度。这里还是有很多细节的,需要想清楚,先dfs1出儿子结点(只向下)最远的距离,在dfs2和从父亲结点来的比较。但是如果父亲结
2021-08-23 18:23:24
123
原创 HDU1815 (二分+2-SAT+建图)
#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<double, double> PDD
2021-08-18 21:46:58
113
原创 2017ACM/ICPC亚洲区沈阳站 Tree(思维+dfs)
传送门题意一个n点的树,将树上点染成k(k<=500)种颜色。将染成第i中颜色的点连起来(类似生成树)的边集为EiE_iEi求k个边集的交集最大边的个数分析什么样的边不符合条件?如果这条边所连接的两颗子树的大小有一个小于k,说明一端不能被染成k种颜色。(抽屉原理)反之:如果这条边所连接的两颗子树的大小都大于等于k,则一定可以并且,边与边之间是没有相互制约的。(反证法)所以,dfs一遍,如果这条边所连接的两棵子树大小都大于等于k,ans++。...
2021-08-17 15:03:53
116
原创 Bomb Game(二分 2-SAT)
传送门题意略分析要求最大的合法半径。可以考虑二分,每次check重新建图跑tarjan判断是否合法。小于ans的半径一定合法,本题是有二分性质的。(数组开小了一直T调了好久)代码#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typede
2021-08-05 17:29:04
106
原创 K-TV Show Game(2-SAT)
传送门题意题目要求n个灯(R,B),给出m组赋值方式,每一组有三个赋值,至少有两个是正确的,问是否能找到一组正确的赋值方式.(摘自此博客)分析如何转化为2_SAT?设3 B 4 R 5 R:如果3为R,则4比为R,5比为R如果3为B,则3比为B,5比为R如果5为B,则3比为B,4比为R如此转化,每一组赋值可以建立6个约束关系(单向边)最后套板子输出可行解就行了代码#include <bits/stdc++.h>using namespace std;//-----p
2021-08-03 16:08:01
181
原创 牛客练习赛67 牛妹游历城市(二进制优化建图最短路)
传送门题意最近,牛妹天天宅在家里,真是憋死人了。他决定出去旅游。牛妹现在正在1号点(自己家里),他决定前往n号点(牛妹想去的地方),中途可以多次经过1~n号点。现在,已知每个点都有个权值a_i如果a_i & a_j ≠0则i号点和j号点之间连有一条双向边,权值为lowbit(a_i & a_j)。他想要最小化自己的行走距离,但是他计算不出来qaq。相信全牛客最聪明的你一定会吧!输入描述:本题有多组数据。第一行,输入一个数T,表示数据组数。接下来2*T行,先输入一个数n,再输入
2021-08-02 21:31:47
156
原创 2019CCPC-江西省赛 Cotree(树的重心 并查集)
传送门题意给两棵树,在两棵树中连一条边,使∑i=1n∑j=i+1ndis(i,j)\sum_{i=1}^{n}\sum^n_{j=i+1}dis(i,j)∑i=1n∑j=i+1ndis(i,j)最小。分析需要找到两棵树的重心,将两棵树的重心连起来,再统计每条边对答案的贡献。对于输入的处理用并查集即可。代码#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = ac
2021-07-30 11:35:12
152
原创 P2414 [NOI2011] 阿狸的打字机(AC自动机 fail树 dfs序 树状数组)
传送门一道比较模板的题,但是比较灵活。1.先对字符串建立trie树,同时维护每个节点父亲信息fa[now]。P表示改模式串结束B表示回退到父亲节点2.对trie树建立fail指针&fail树。3.对fail树处理出dfs序,以便用树状数组维护子树和。4.读入询问,按y关键字排序。(离线处理)5.在trie上遍历字符串,每到一个单词的结尾(‘P’)统一处理出所有询问。(第x个单词在这个单词中出现了几次)‘B’:撤销上一步操作‘*’:树状数组改位置+1,继续向下处理。我的写法相关
2021-07-28 20:19:07
145
原创 P3966 [TJOI2013]单词(AC自动机,Trie图)
传送门初学ac自动机。ac自动机相当于在trie上建立kmp中的ne指针(fail树)建树的函数build()比较固定;利用bfs+queue的特点还可以同时求出trie的拓扑序。匹配的时候就可以灵活操作了。。题意某人读论文,一篇论文是由许多单词组成的。但他发现一个单词会在论文中出现很多次,现在他想知道每个单词分别在论文中出现多少次。输入格式第一行一个整数 N,表示有多少个单词。接下来 N 行每行一个单词,单词中只包含小写字母。输出格式输出 N 个整数,每个整数占一行,第 i 行的数
2021-07-13 16:36:36
159
原创 c++ STL rope小结
rope是stl封装好的可持久平衡树(不支持kth)。基本操作(函数)比较少。下标从0开始。{1,2,5,4}.insert(1,10)=>{1,10,2,5,4}#include<ext/rope>///头文件using namespace __gnu_cxx;rope <int> x;int main(){ x.push_back(x); //在末尾加x x.insert(pos, x); //在pos位置加入x x.erase(pos
2021-07-10 20:06:55
1678
原创 splay板子整理
本质就是个平衡树。具体到一道题,无非就是要考虑如何1.每个节点维护什么信息。2.如何维护splay(top,bottom等splay特色操作)3.如何建树,建树规则如何实现。如何找到需要的节点。4.结合其他数据结构(难)#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef lo
2021-07-08 20:46:40
245
原创 2-SAT模板整理
给定 n 个还未赋值的布尔变量 x1∼xn。现在有 m 个条件,每个条件的形式为 “xi 为 0/1 或 xj 为 0/1 至少有一项成立”,例如 “x1 为 1 或 x3 为 0”、“x8 为 0 或 x4 为 0” 等。现在,请你对这 n 个布尔变量进行赋值(0 或 1),使得所有 m 个条件能够成立。输入格式第一行包含两个整数 n,m。接下来 m 行,每行包含四个整数 i,a,j,b,用来描述一个条件,表示 “xi 为 a 或 xj 为 b”。输出格式如果问题有解,则第一行输出 POSS
2021-06-01 17:56:51
246
1
原创 POJ-1733Parity game(并查集+2-SAT)
传送门1.题意小 A 和小 B 在玩一个游戏。首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。然后,小 B 向小 A 提出了 M 个问题。在每个问题中,小 B 指定两个数 l 和 r,小 A 回答 S[l∼r] 中有奇数个 1 还是偶数个 1。机智的小 B 发现小 A 有可能在撒谎。例如,小 A 曾经回答过 S[1∼3] 中有奇数个 1,S[4∼6] 中有偶数个 1,现在又回答 S[1∼6] 中有偶数个 1,显然这是自相矛盾的。请你帮助小 B 检查这 M 个答案,并指出在至
2021-05-26 12:30:11
131
原创 P5764 [CQOI2005]新年好(最短路+暴搜)
传送门因为只有5个点,可以dfs访问顺序。先预处理出一号起点+五个点的单源最短路,再暴搜。在语法上,二维数组作为函数参数的用法。。#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typ
2021-05-25 16:56:35
181
原创 点分治模板、例题整理
传送门1.题意求一个树中距离小于等于k的点对的个数。1≤N≤1041≤N≤10^41≤N≤1042.分析点分治算法:树的重心树的重心是指:删除该点后,最大子树(的点数)最小的点。关于重心的结论:删除重心之后,最大子树的点数小于等于总点数/2。于是:我们可以将一个树上问题删去重心点之后分解成若干个子树内部的问题和子树之间的问题。这样可以保证是log级的时间复杂度。(边分治则不行,会被菊花图卡成n)关于本题我们先将重心找出来,然后路径小于等于k的点对可以分成如下:1.两点在同一颗子树中。
2021-05-02 20:58:19
666
2
原创 CF38G Queue (区间splay)
传送门题意(摘自洛谷)【问题描述】 有n个人依次排队,每个人都有两个属性值 a[i] 、c[i] ,a[i]是重要性值,数值越大越重要,c[i]是良心值。假如前i-1人已经排好队后,第i个人来排队,初始时他在队尾,如果他的a[i]大于排在他前面那位的重要性值,那么两人可以交换位置,每次交换良心值减1,直到他前面的人的重要性值大于a[i]或者良心值为0的时候(即最多交换c[i]次),问最终n个人的队列次序。【输入描述】 第一行一个整数n,表示队列人数。 接下来n行,每行两个整数ai,ci,表示第i个人
2021-04-26 21:35:44
168
原创 Acwing.379 捉迷藏(最小路径重复点覆盖)
传送门1.前置知识1.最小路径点覆盖DAG中选出最小数量的不相交路径(无公共点),将所有点覆盖。求法:将DAG中的点拆成出点和入点,构成一个二分图。则原图的最小路径点覆盖转化到新图中:1.无公共点->每个点最多只有一个出度一个入度 ->…->新图中的任意两条边之间不相交-> 新图中的边都是匹配边。小结论:每个路径终点 对应 一个左侧非匹配点<=> 让左侧非匹配点最少 n-m<=> 让左侧匹配点最多 m<=> 找最大匹配边数 m
2021-04-22 20:32:35
2723
4
原创 P3850 [TJOI2007]书架 (splay维护序列)
传送门1.题意Knuth 先生家里有个精致的书架,书架上有 NN 本书,如今他想学到更多的知识,于是又买来了 MM 本不同的新书。现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们放好。由于 Knuth 年龄已大,过几天他已经记不清某些位置上放的到底是什么书了,请问你能帮助他吗?2.分析说白了,就是不停的向序列中插入元素(插队)。最后查询第i个位置是什么。splay可以很简单的进行插入操作。3.代码#include <bits/stdc++.h>
2021-04-08 20:45:19
252
原创 LUOGU P3586 [POI2015]LOG (splay)
传送门1.题意维护一个长度为 n 的序列,一开始都是 0,支持以下两种操作:1.U k a 将序列中第 k 个数修改为 a。2.Z c s 在这个序列上,每次选出 c 个正数,并将它们都减去 1,询问能否进行 s 次操作。每次询问独立,即每次询问不会对序列进行修改。2.分析操作的次数与 第 k 个数 无关。故只需要动态维护好第k个数的值cnt[k]就行了。当需要进行s次操作时:1.cnt[i]>=s:对结果的贡献为s。(和记为lim)2.cnt[i]<s:对结果的贡献为cnt
2021-04-07 20:40:32
181
原创 洛谷P2596 [ZJOI2006]书架(splay)
传送门1.题意第一行有两个整数,分别表示书的个数 n 以及命令条数 m。第二行有 n 个整数,第 i 个整数表示初始时从上向下书第 ii 本书的编号 p_i。接下来 m 行,每行表示一个操作。每行初始时有一个字符串 op。若 op 为 Top,则后有一个整数 s,表示把编号为 s 的书放在最上面。若 op 为 Bottom,则后有一个整数 s,表示把编号为 s 的书放在最下面。若 op 为 Insert,则后有两个整数 s,t,表示若编号为 s 的书上面有 x 本书,则放回这本书时他的上面有
2021-04-05 19:34:06
174
原创 左偏树总结
洛谷模板题左偏树的特点——可并堆本质上是一个二叉(最小)堆。const int N = 2e5 + 10;struct node{ int v, dist, lson, rson;} tr[N];通过维护dist(距离最近的“叶子节点”(并不严谨)的距离)来实现log级的合并题目需要的操作也大多数是合并两个集合+取集合最值进行操作核心函数merge:int merge(int x, int y)//将下x,y两颗子树合并,返回root{ if (!x || !y)
2021-03-27 17:40:53
154
原创 P1110 [ZJOI2007]报表统计(数据结构大杂烩+splay水题)
传送门题意先给定一个初始长度为n的初始数组,要求实现3个操作:1.INSERT i k:在原数列的第 i 个元素后面添加一个新元素 k;如果原数列的第 i 个元素已经添加了若干元素,则添加在这些元素的最后(见样例说明)。2.MIN_GAP:查询相邻两个元素的之间差值(绝对值)的最小值。3.MIN_SORT_GAP:查询所有元素中最接近的两个元素的差值(绝对值)。分析1.第3个操作需要用到平衡树,在每次插入一个数的时候找到其前驱&后继,统计全剧最小值即为答案。2.第2个操作,插入一个数
2021-03-22 20:07:17
264
3
原创 P1486 [NOI2004] 郁闷的出纳员(splay模板整理)
传送门花了好长时间#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 1e9;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<double, double>
2021-03-21 22:13:23
188
2
原创 splay模板复习
splay模板记得加哨兵!!!#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<doubl
2021-03-18 21:16:59
150
原创 P1412 经营与开发(DP 倒序)
传送门题意你驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过n个星球。星球笼统的分为2类:资源型和维修型。(p为钻头当前能力值)1.资源型:含矿物质量a[i],若选择开采,则得到a[i] * p的金钱,之后钻头损耗k%,即p=p * (1-0.01k)2.维修型:维护费用b[i],若选择维修,则支付b[i] * p的金钱,之后钻头修复c%,即p=p * (1+0.01c)注:维修后钻头的能力值可以超过初始值(你可以认为是翻修+升级)金钱可以透支。请作为舰长的你仔细抉择以最大化收入
2021-03-11 19:27:17
209
原创 P2486 [SDOI2011]染色 (树剖+线段树)
传送门题意给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种:1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c。2.询问节点 a 到节点 b 的路径上的颜色段数量。颜色段的定义是极长的连续相同颜色被认为是一段。例如 112221 由三段组成:11、222、1。分析树上路径问题,首先考虑树剖。用线段树维护区间颜色段信息线段树的维护的信息&&基本操作struct node{ int l, r, lz;//lz为懒标记
2021-03-07 20:34:22
1021
3
原创 NC201891 采蘑菇的克拉莉丝(树链剖分)
传送门分析先处理出重链,再用线段树维护区间和(单点更新)查询核心代码LL ans = 0;for (int i = h[root]; ~i; i = ne[i])//便利当前root所连的所有边{ int t = e[i];//与root直接相连的点 if (t == fa[root])//如果是父节点 { ans += (query_tree(1) - query_tree(root)) * w[i]; } else//如果是儿子节点 {
2021-03-06 19:46:41
1092
1
原创 知识点清单
第一章 - 算法基础1.1 算法复杂度计算1.2 神奇的兔子数列第二章 - 线性表2.1 链表2.2 链表实例第三章 - 栈与队列3.1 栈3.2 队列第四章 - 数组4.1 数组4.2 特殊矩阵的压缩存储第五章 - 字符串5.1 字符串5.2 KMP算法第六章 - 二叉树6.1 二叉树存储6.2 二叉树遍历第七章 - 树+贪心7.1 哈夫曼树7.2 哈夫曼编码第八章 - 图的存储8.1 邻接矩阵8.2 邻接表第九章 - 图搜索9.1 深度优先搜索9.2
2021-03-06 15:45:09
4423
11
原创 牛客13230 合并回文子串(区间dp)
传送门题意输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可。input:第一行一个整数T(T ≤ 50)。接下来2T行,每两行两个字符串分别代表A,B(|A|,|B| ≤ 50),A,B的字符集为全体小写字母。分析由数据
2021-03-05 20:53:14
157
原创 P3379 【模板】最近公共祖先(LCA,树链剖分)
传送门核心函数int lca(int u, int v){ while (top[u] != top[v])//如果u,v在不同的重链,向上跳 { if (dep[top[u]] < dep[top[v]]) swap(u, v); u = fa[top[u]]; } //u,v在同一条链上了(重链没有分叉&&此时的u,v不是最开始的u,v了) if (dep[u] < dep[
2021-03-04 12:31:22
188
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人