自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2021牛客多校6

把所有点都平移到0 ~ d-1 的矩形内,然后用扫描线去看矩形内有没有点没被占。#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N = 100010;int n, d, l1, r1, xx;bool flag = 0;struct tree{ int len, cnt;} a[N * 4];struct xian{

2021-08-15 12:18:12 131

原创 2021牛客暑期多校训练营8

D解题思路:由b数组和c数组我们可以由a[1]直接确定a数组,所以只需枚举a[1]即可,如果直接枚举值会超时。所以我们可以枚举a[1]的每一位二进制位能有几种情况然后相乘即可。只是c数组它表示a[i-1]+a[i],这一位的可能情况与前一位有关,所以我们得想办法换一个。而加法运算有一个等式:a+b = a|b + a&b所以我们可以让d数组表示为a[i-1]&a[i],那么d[i] = c[i]-b[i]。然后就可以根据b、d数组确定出a[1]的方案。如何确定呢?b[i]、d[i

2021-08-11 21:53:17 111

原创 2021杭电多校(6)

1001解题思路:打个表发现一段区间的和为素数,这段区间的长度一定小于3,且相邻的区间很近,又可以通过加负数来改变区间,所以可以直接暴力找。1005首先我们把被m个中位数分割开的数字分成一段一段的:假设 n = 6 , m = 2 , b1 = 3 , b2 = 5 ,那么 1 , 2 , ⋅ ⋅ ⋅ , n 这些数会被 { 1 , 2 } { 4 } { 6 }三段,然后我们会发现任意两段中的任意一对数字一定可以配对消掉如果长度最大的段的数字个数小于等于其它段的数字个数之和,那么最终要么全部消掉

2021-08-11 13:44:04 173

原创 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)

1003被精度卡了几小时,以后做这种题一定多动笔。。。#include <bits/stdc++.h>#define endl "\n"using namespace std;typedef long long ll;typedef pair<int,int> pii;const ll INF = 0x3f3f3f3f3f3f3f3f;const int inf = 0x3f3f3f3f;const int N = 2e5+10;const int mod =

2021-08-10 22:32:30 134

原创 2021杭电多校(4)1004

解题思路:当权值越来越大,那么小于这个权值子串的数量也越来越多,所以可以二分答案。如何统计子串的数量呢?可以用后缀数组或者后缀树。不同的子串的数量为子串的权值呢?可以用一个前缀和数组就能o(1)时间内算出权值。下面是后缀数组的代码。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e6 + 10;int rk[N], temp[N], sa[N], height[N];

2021-08-08 10:40:20 200

原创 2021牛客暑期多校训练营5

D解题思路:dp{i,j}表示遍历到s1的前i位s2的前j位时,公共子序列的个数。然后遍历如果s1[i] < s1[j] 这时候已经知道了前面的子序列个数,因为后面的可以为任意字母且两字序列长度要相等,假设两串右边剩余的个数为n,m。那么一共有这么多种情况,又可以证明(范德蒙等式)枚举贡献即可#include <bits/stdc++.h>#define endl "\n"using namespace std;#define int long longtypedef

2021-08-06 15:33:39 88

原创 莫队算法(凑出5个字)

问题描述给定一个大小为N的数组,数组中所有元素的大小<=N。你需要回答M个查询。每个查询的形式是L,R。你需要回答在范围[ L,R ]中至少重复3次的数字的个数。 例如:数组为{ 1,2,3,1,1,2,1,2,3,1 }(索引从0开始) 查询:L = 0,R = 4。答案= 1。在范围[L,R]中的值 = { 1,2,3,1,1 },只有1是至少重复3次的。 查询:L = 1, R = 8。答案= 2。在范围[L,R]中的值 = { 2,3,1,1,2,1,2,3 }, 1重复3遍并且2重复3次。

2021-07-28 15:45:30 91

原创 2021牛客暑期多校训练营3

B解题思路:把行与列看作数组a,b,行看成ai,列看成bi。w[i, j]的值看成把ai、bj连起来所需要的代价,题目所给定的才能就是如果a与b相连且a与c相连且b与d相连那么,c与d就可以不用代价的相连,即做一遍最小生成树即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int bi[N];vector<pair<int, int>

2021-07-27 21:00:44 86

原创 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)

1011解题思路:对于i&j>=k,可以得到i>=k,j>=k。如果k=1001,那么k可以从1011、1101、1111经过与运算得到,所以我们设4个数组A[],B[],a[],b[], 其中A[i]表示可以经过与运算得到i的全部数的集合中的最大值,对于k=1001,则有A[1001] = max(A[1011], A[1101]), 而A[1011] = max(A[1011], A[1111])。a[]为最小值,B、b数组同理。然后从后往前更新答案即可。#include

2021-07-26 16:47:08 125

原创 Codeforces Round #734 (Div. 3)

D1解题思路:分奇偶讨论,如果n,m都为偶数,则只需满足k为偶数即可,如果n为奇数,需要把奇数行先填为偶数行,然后k为偶数即可。如果m为奇数,需要满足k<=(m/2)*n,且k为偶数。#include <bits/stdc++.h>using namespace std;const int N = 2e3 + 10;void solve(){ int n, m, k; cin >> n >> m >> k; if(

2021-07-24 21:10:11 72

原创 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)(重现赛)

D题目大意:

2021-07-24 11:56:52 753

原创 2021“MINIEYE杯”中国大学生算法设计超级联赛(1)

1006题目大意:给一个数组,找出一个最短的子序列,他们的异或和不小于k。解题思路:由于xor具有自反性,那么对于一段异或前缀和s[j]和s[i],s[i]^s[j] = a[i +1]^a[i + 2]^… ^a[j];考虑01字典树,将前缀和数组加入字典树的同时标记出能走到这个节点的最大的i,然后枚举右端点,找出最小的大于等于k的子序列。#include <bits/stdc++.h>using namespace std;const int N = 1e5+10, M =

2021-07-22 21:12:06 237

原创 2021牛客暑期多校训练营2

K题目大意:给出N和M,有M个输入,每次输入两个数p,x,表示有一个数组b,从a[1]开始到a[p],这p个数的最长上升子序列为x,即b[p] = x。输出符合b数组的a数组,不存在就输出01。解题思路:显然对于每一个 b[i],必须满足 b[i]≤i,那么对于未给出数值的 b[i],可以考虑先给它们填充上数值,不妨令 b[i] = b[i - 1] + 1,这样构造能够满足b[i]≤i的条件,随后只需要从后往前构造即可。填充完b数组,我们借助栈来从后往前构造a数组即可。#include <bi

2021-07-21 13:35:13 175

原创 2021牛客暑期多校训练营1

题目大意:给定两堆石头,两个人A和B,从A开始,每次可以从其中一堆拿走x,然后从另一堆拿走kx,最终不能拿的人输,问谁能胜。解题思路:从 0 0 开始打表,0 0 A输,i+x j+kx A胜。#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 10;map<int, int> m;bool v[5005][5005];void init(){ for (int x = 0;

2021-07-17 19:50:39 100

原创 湖南大学第十六届程序设计竞赛

A题目大意:给三个点坐标,判断三角形的类型(有可能构成不了三角形)解题思路:先用向量法判断三个点是否共线,然后求出三条边a,b,c(从小到大排好序),如果a^2 + b^2 == c^2 就是直角三角形,如果大于就是锐角三角形,否则就是钝角三角形。void solve(){ ll x1,y1,x2,y2,x3,y3; cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; if(

2021-07-16 14:10:13 138

原创 2020-10-11

尹帝的新衣尹帝很喜欢买衣服,因为他非常有钱,所以他想买最贵的衣服。这天,商店里新进的一批服装包括:a 领带 b 围巾 c 背心 d 夹克。该商店只出售两种组合的衣服,分别是领带和夹克花费e,围巾、背心和夹克花费f。尹帝想把店里的衣服都尽数买完(如果不能组合了可以剩下),你能帮她算出他可以用出的最大费用吗?Input第一行包含一个整数a(1≤a≤100000)–领带的数量。第二行包含一个整数b(1≤b≤100000)–围巾的数量。第三行包含一个整数c(1≤c≤100000)–背心的数量。第四行

2020-10-11 18:29:26 169

原创 dp题

Milking TimeBessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0…N-1) so that she produces as much milk as possible.Farmer J

2020-06-04 15:17:33 192

原创 割草...(维护数据)

做到一个维护时间的,看到别人的代码感觉太神奇了,写个blog记录一下…题目链接:割草题意: 生草题。n × m 网格图,每个格子内的草每秒增加 ai,j,接下来 k 个操作,每个操作会在某个时间把某一列或某一行的草割光,求最终割掉的草的总和。#include <bits/stdc++.h>using namespace std;#define endl "\n"typedef long long ll;const long long inf= 0x3f3f3f3f3f3f;c

2020-06-01 22:04:48 433 1

原创 数位dp

简介数位dp一般解决的是对于一个区间 [ l,r ],求出满足要求的数的个数,所谓数位dp,就是对每个位的数进行dp。数位dp的实质就是换一种暴力枚举的方式,使得新的枚举方式满足dp的性质,然后记忆化就可以了。例题不要62就是数位上不能有4也不能有连续的62,没有4的话在枚举的时候判断一下,不枚举4就可以保证状态合法了,所以这个约束没有记忆化的必要,而对于62的话,涉及到两位,当前一位是6或者不是6这两种不同情况我计数是不相同的,所以要用状态来记录不同的方案数。dp[pos][sta]表示当前第

2020-06-01 12:14:02 247

原创 区间dp

概念区间dp,顾名思义,在区间上dp,大多数题目的状态都是由区间(类似于dp[l][r]这种形式)构成的,就是我们可以把大区间转化成小区间来处理,然后对小区间处理后再回溯的求出大区间的值,主要的方法有两种,记忆化搜索和递推。区间dp的问题在我看来,其实就是从小的区间开始枚举,然后以小区间为基础逐渐地腿出大区间的最优解。直接给出板子memset(dp,0,sizeof(dp))//初始dp数组for(int len=2;len<=n;len++){//枚举区间长度 for(int

2020-05-26 15:17:57 135

原创 拓扑排序

先来看看下面这个图这个图的箭头表示,只有先学会箭头前的东西才能学箭头后的例如:只有先学会java才能学servlet,只有先学会java和html才能学jsp拓扑排序就是将这些先后关系用一个线性顺序表示出来先来看看定义int in[N];//用来存每个科目的前驱节点个数vertor<int> v[N];//用来学科之间的前驱后继的关系vector<int> ans;//用来存拓扑排序priority_queue< int,vector<int&gt

2020-05-25 10:53:50 159

原创 数据离散化

数据离散化是一个非常重要的思想。为什么要离散化?当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。数据离散化分为下面三个步骤1、排序2、去重3、索引这里需要用到两个stl函数unique的作用是“去掉”容器中相邻元素的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址;函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或

2020-05-23 21:19:08 710

原创 扩展欧几里得与同余方程

额…晚上听学长讲了扩展欧几里得,听得迷迷糊糊的,还是要怪自己没有提前去预习,甚至不知道这个算法能干啥…学长讲完之后自己去翻了将近两个小时的博客才稍微能理解一点。欧几里得算法gcd(a,b)可以算出a,b的最大公因数(后面就把这个最大公因数用g来表示吧),扩展欧几里得就是在算出g的同时算出x,y满足:ax+by=g这里其实有个贝祖定理:即如果a、b是整数,那么一定存在整数x、y使得ax+by=g。换句话说,如果ax+by=m有解,那么m一定是g的若干倍。(可以来判断一个这样的式子有没有解)先看看欧

2020-05-19 22:39:35 257

原创 AC自动机

前置技能1.Trie树(必备)2.KMP算法(了解思想即可)Fail指针的含义及求法AC自动机就是在trie树的基础上再加一个fail指针,相信暴力寻找的方法大家都会,就是不断的回溯指针,而这个算法的目的就是寻找一个正确的地方来转移指针,从而达到缩短时间复杂度的目的。那么这个fail指针又是什么东西呢?举个栗子:上面的树中有str1:ABCstr2:BCD那么str1(B)的fail指针指向str2(B),str1(C)的fail指针指向str2(C)对于第一层的树节点,我们只需将他们

2020-05-18 13:46:10 195

原创 Trie树(字典树,单词查找树)

简介Trie 树, 又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。复杂度分析Trie树其实是一种用空间换时间的算法,前面也提到过,它占用的空间一般很大,但时间是非常高效的,插入和查询的时间复杂度都是O(l)的,总体来说还是很优秀的先来看看这个树的样子简单的说就是把字符串的每个字符存在树中,插入字符串时相同的字符可以不再输入,只需从不同的字符开始重新创建新的树节点。查询字符串时只需遍

2020-05-17 15:57:02 389

原创 KMP算法

简介KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。next数组上面说道 KMP 算法主要是通过消除主串指针的回溯来提高匹配的效率的,那么,它是则呢样来消除回溯的呢?就是因为它提取并运用了加速匹配的信息!这种信息就是对于每模式串 t 的每个元素 t j

2020-05-17 10:13:02 377

空空如也

空空如也

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

TA关注的人

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