自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 Remove Extra one 维护前缀最大最小值

题意:去除一个数让所有前缀的最后一个数最大的个数最多。 思路:对于 任意j<i 如果去除j能让i成为最大值,那么 在a[j]是1~i的最大值且a[i]是次大值,那么启发我们从前往后扫描的时候维护最大和次大这两个变量,如果当前的x比最大值大,那么去除x对答案贡献为-1,如果x比次大值大,去除最大值对答案贡献为1,因为x是除去最大值的最大值。 #include<bits/stdc++.h> using namespace std; const int mod=1e9+7; #define i.

2020-11-29 21:49:06 449

原创 ac自动机(求每个单词在单词所组成的论文中出现的次数)

思路:其实就是求每个单词的前缀中有多少后缀出现过某个单词,如果正向通过单词来枚举每个后缀,复杂度过高,那么我们反着枚举,然后惊奇的发现,这不就是next数组吗!那么就是把原题转化成了一个dag图,只需要把某个后继点的值累加到每个前缀就可以了,最后在插入的时候记录下每个单词的的位置,由于是dag图,我们将bfs的序列反着遍历,把f数组的当前值累加到前驱即可,这样就等价于把他的值给了所有前驱节点。最后查询f[位置]即可。 #include<bits/stdc++.h> using namespace

2020-11-28 23:46:35 311

原创 AC自动机

给定 n 个长度不超过 50 的由小写英文字母组成的单词,以及一篇长为 m 的文章。 请问,有多少个单词在文章中出现了。 #include<bits/stdc++.h> using namespace std; const int N=10010,S=55,M=1000010; char str[M]; int tr[N*S][26],q[N*S],idx; int cnt[N*S]; int ne[N*S]; void add() { int p=0; for(int i

2020-11-28 19:50:26 262

原创 天梯废物我是

给定一棵完美二叉树的后序遍历,求完美二叉树的层次遍历。 只需要求出该树的左右儿子的数量即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; int n; struct node{ int lnum; int rnum; int sz; int val; }tr[N]; int a[N]; vector<int>dep[N]; void build(int u) { tr[u].sz=1;

2020-11-28 19:33:36 2818 7

原创 2-sat模板

给定n个变量 给定m对关系 例如 aVb !aVb 让你构造出一组布尔值解满足题目要求 就是2sat的模板 把拓扑序后面的点当做可行解 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define debug printf("---\n"); const int N=2000010,M=2000010; int h[N],ne[M],e[M],idx,top,id[N],dfn[N],low[N],stk[N

2020-11-24 17:26:54 240

原创 善意的投票(最大流最小割,建图技巧)

题意:有m对好朋友关系 每个人有不同的想法, 每个人可以改变自己的想法,如果改变的话会让答案值+1 问好朋友之间冲突的个数最小值。 思路: 把不同的想法的点,分别与S和T连边,如果两个人之间是好朋友就代表可能会有冲突,那么就连双向边。 #include<bits/stdc++.h> using namespace std; const int N=5510,M=N*100*2; int h[N],ne[M],e[M],idx,d[N],cur[N],q[N],f[M]; void add(in

2020-11-22 22:39:35 278 3

原创 路痴是不可能路痴的,这辈子都不可能路痴的。(可达矩阵 快速幂 拆点)

题意 : 给定一个带权有向图 问从1到n的路径中恰好为w的方案数。 思路: 拆点 由于边权<=9 那么我们拆成9个点, 记得将每相邻的两个点从前面一个点连向后一个点,都边权为k的时候 将第k个点连向对应的点,然后矩阵快速幂。 ac代码: #include<bits/stdc++.h> using namespace std; const int N=110; const int mod=2009; int g[N][N]; int e[N][N]; int n,m; void mul(.

2020-11-21 15:44:59 301

原创 树链剖分板子

#include<bits/stdc++.h> using namespace std; #define x first #define y second #define int long long typedef long long ll; const int N=100010; struct node{ int l; int r; int sum; int maxv; }tr[N*20]; int n; int w[N],col[N],dfn[N],h[N],ne[N*2],id

2020-11-20 23:12:24 189 1

原创 odt 珂朵莉树

要保证数据随机化 操作1 :区间加 操作2 :区间赋值 操作3 :区间和 操作4 : 区间幂次和 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<string> #include<math.h> #include<vector> #include<queue> #include<stack>

2020-11-20 23:09:03 225 2

原创 (可持久化线段树)主席树

上面就是我的丑图hh,一般主席树开40倍空间就可以了,每次插入的时候只需要比较前一个版本和这一个版本就行了,然后每个版本是区间可减的,比如询问l到r之间的第k大,只需要处理r-(l-1)版本的数量即可。 #include<bits/stdc++.h> using namespace std; const int N=200010; struct node{ int l; int r; int sum; }tr[N*40]; int cnt; int a[N]; int root[N]; v

2020-11-06 12:24:25 269

原创 CCPC 绵阳Lottery

题意 有n个值为2^a[i]数量为k的物品,问最多能组成多少种不同的数。 结论:先将每一段尽量扩展连续的一段,如 1 3 1 扩展成 1 1 2 ,最后答案就是每一段的方案数相乘(ps:经过尝试包含至少一个零的任意两段之间的任意两个数组合都能组合出来不同的数,太tm神奇了。 ),然而每一段可以从后往前递推, 前一项+=后一项*2,然后答案就是第一项个数+1. #include<bits/stdc++.h> using namespace std; #define int long long .

2020-11-06 10:30:37 454

原创 对拍代码1

#include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> #include<windows.h> using namespace std; int main() { int ok=0; int n=1000; for(int i=1; i<=n; ++i) { system("make.exe > make.txt");

2020-11-05 18:50:39 291

原创 7-7 Game of Cards 找规律

思路:找出必败态 打出sg函数的表 硬找规律! #include<bits/stdc++.h> using namespace std; #define x first #define y second typedef long long ll; int qsm(int a,int b,int c) { int res=1; while(b) { if(b&1) res=res*a%c; b>>=1; a=a*a%c; } return res; }

2020-11-05 18:46:18 259

原创 Extreme Subtraction

题意: 每次可以将前缀减1或者后缀减1,问是否存在一种方法使得全部构成0. 思路: 构建差分序列,然后操作就可以变成将d[1]-1 d[X],Xϵ\epsilonϵ(2,n+1)加上1 另外一种操作就是将d[X],Xϵ\epsilonϵ(1,n)减去1 将 n+1 + 1 然后我们将题目所给的差分数组算出来,关于正数的我们可以不管,因为有操作2,最后操作完满足1~n的差分值都是0,关于负数的只有操作1可以,我们只需要讨论∑\sum∑|负数之和|<=d[1]就行了。 AC代码: #include&lt

2020-11-05 14:38:43 403

原创 E - Transformable Teacher

题意:从1~m中选一个数插入到a中,然后把这n+1个数,分成(n+1)/2组,每一组权值和最小。 思路:先将a数组排个序,然后枚举要放的数,二分找到大于等于b的位置,如果该位置是奇数就选择该位置,如果是偶数,–pos,然后加上这个点的权值差加上不算该点的前缀和 加 后缀和。更新一下答案就可以了。简单的贪心都做不出,凭什么拿铜牌啊。。 代码: #include<bits/stdc++.h> using namespace std; const int N=200010; #define int .

2020-11-05 12:35:19 284

空空如也

空空如也

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

TA关注的人

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