- 博客(103)
- 收藏
- 关注
原创 三分查找
找极值的算法,用于单峰函数,有一个极大值或者极小值的。通过l 和 r找到mid,再通过mid和r找到midr,以凸函数为例,要找极大值,如果y(mid) > y(midr),那么让r = midr,否则让l = mid,直到找到极大值为止。#include <bits/stdc++.h>using namespace std;const double eps = 1e-8;double y(double x){ }double sf(double l, doub
2021-02-24 17:01:49
85
原创 A - Alehouse(思维 + 模拟)
A - Alehouse(思维 + 模拟)题目链接先存好数据,然后排序,如果在范围内就加进去,如果出去了,人的数量就减1。#include <bits/stdc++.h>using namespace std;const double PI = acos(-1.0);using PII = pair<int, int>;using ll = long long;int main() { ios::sync_with_stdio(false); cin
2021-02-06 00:44:24
221
原创 2021年2月4日组队赛补题
A - Alchemy 101 (打表 + 规律)通过打表发现从一开始一直往后异或会有规律。然后发现要取最长的,发现(x - 3) % 4 = 3的时候从2开始异或是最长的(刚开始漏掉了从2开始的情况,一直wa,然后后来发现从2开始也有规律)#include <bits/stdc++.h>using namespace std;int main(){ int num, x; cin >> num; while(num --) {
2021-02-06 00:35:01
187
原创 C - Climbing Stairs
C - Climbing Stairs题目链接看代码就能懂#include <bits/stdc++.h>using namespace std;const double PI = acos(-1.0);const int N = 1e5 + 10;string s;int main(){ int a, b, c; cin >> a >> b >> c; if(b > c) { if(b
2021-02-04 10:07:32
182
原创 2021-1-31日个人赛补题
C - Save the Queen! (二分枚举 + 精度)#include <bits/stdc++.h>using namespace std;int n, k;double a[20004];bool check(double mid) { double ans = 0; for (int i = 0; i < k; i++) ans += min(a[i], mid); return ans + 0.00001 >= mid * n;
2021-02-01 13:26:48
85
原创 2021-1-30组队赛补题
Xu Xiake in Henan Province签到题。直接看有几个数是非零。#include <bits/stdc++.h>using namespace std;int main(){ int t; cin >> t; for(int i = 0; i < t; i ++) { int sum = 0; for(int j = 0; j < 4; j ++) {
2021-01-31 15:09:22
154
1
原创 动态规划之六:数位dp(未完)
数位dp要求区间[l,r]之间符合某种性质的个数时,用f[k]表示0~k之间满足某种性质的个数,那么区间[l,r]即可表示为f[r] - f[l - 1]。例题一求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:17=24+20,18=24+21,20=24+22输入格式第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。输出格式只包含一个整数,表示
2021-01-30 17:48:55
143
原创 动态规划之五 :区间dp
区间dp合并石子设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合并 1,2堆,代价为9,得到9 2 ,再合并得到11,总代价为4+9+11=24;如果第二步是先合并2,3堆,则代
2021-01-29 21:56:57
129
原创 Gym - 101669部分题题解
A - Concerts(动规)题意是给你一个子串b和一个主串a,问在满足条件下a串可以有多少种b的规划方式。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 100;const int mod = 1e9 + 7;ll f[2][N]; int k, n; int num[30]; char a[10010], b[N];int ma
2021-01-29 10:34:49
349
原创 动态规划之四 状压dp
状压dp棋盘式(八个方向限制)给出一个n*n型的方格棋盘。一个棋子放在其中一个格子里,那么他的8个方向都不能放棋子,限制最多摆放的棋子个数为m,问最多有多少种放法。可以用一个三维数组来表示一个状态,表示所有前i行,已经摆了j个棋子,并且第i行摆放的状态是s的所有方案。判断约束条件,一行内不能有两个棋子相邻,第i - 1行和第i行不能相互攻击到。即:(a & b) = 0, (a | b)不能有两个相邻的1#include <bits/stdc++.h>using names
2021-01-28 17:20:37
138
原创 F - Dragon Ball I
题目链接还没懂,粘个代码#include <bitsdc++.h>using namespace std;typedef long long ll;const int maxn = 5e3 + 10;const ll inf = 0x3f3f3f3f3f3f3f3f;ll dis[25][maxn];ll vis[maxn];ll n, m;ll head[maxn], cnt, tot;struct edge { ll to, w, nxt;} e[maxn];
2021-01-27 22:53:19
245
原创 状态机模型
状态机初次听到这个名字以为是多么高大上的难的东西,其实就是把一个物品或者一个活动分成不同的状态,这几个状态可以相互转换。模型一:挑数字有一串数字,你要从中挑几个数字,让其总和最大,但是不能连续挑数字。比如 1 2 3 4 5,如果挑了1,那么不能挑2,可以挑3或者是4。且数列是无序的。1.首先思考可以分成什么样的状态。2.然后发现状态可分为每个数字挑或者不挑。那么用一个二维数组来表示状态,f[i][0]和f[i][1],0代表不挑选,1代表挑选。3.那么这两种状态是如何转化的呢?首先思考一个问题
2021-01-27 22:51:42
181
原创 C - Convoy(整数二分)
这道题我直接好家伙,方法就是二分时间,看看最短时间符不符合。坑在于:1.需要判断a[i]是否等于0,不然有时候会RE!2.需要注意司机无论多少趟只能带一个。因为回来的时候也需要一个人开车。3.左右边界尽量开到1e12。而且变量以防万一都开long long,不然会超时。#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;long long a[N];int n, m;bool judge(lo
2021-01-27 10:12:33
271
原创 树状数组
树状数组单点修改,区间查询区间修改,单点查询#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 100010;int n, m;//n是区间长度。m是操作个数int a[N];ll tr[N];int lowbit(int x){ return x & -x;}void add(int x, int c){ for(int i = x
2021-01-26 15:21:22
69
原创 八皇后问题
对于暴搜的问题一直不太行(虽然很简单八皇后问题最重要在于暴搜什么,先暴搜行,然后判断列和对角线是否成立。其次就是回溯问题,搜完每一次,要把状态还原到最开始,然后进行下一轮搜索。这是极其重要的。下面看个代码就懂了。可能需要自己多敲几遍,不然过后…一敲就各种GG。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 15;int col[N], dg[N * 2], udg[N *
2021-01-25 15:24:53
54
原创 AcWing 1341. 十三号星期五
(处理日期问题)AcWing 1341. 十三号星期五处理日期问题一直是短板,不敢做这种题,其实就是模拟。比如这道题:十三号星期五真的很不常见吗?每个月的十三号是星期五的频率是否比一周中的其他几天低?请编写一个程序,计算 N 年内每个月的 13 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。测试的时间段将会开始于 1900 年 1 月 1 日,结束于 1900+N−1 年 12 月 31日。一些有助于你解题的额外信息:1900 年 1 月 1 日是星期一。在一年中,4 月
2021-01-25 11:40:25
102
原创 L - Carry Cam Failure
Carry Cam Failure补这道题用了我很长时间,其实还是菜,没想到这道题用暴搜解决的。其实就是模拟乘法的过程,但提前要打好非进位九九乘法表。如:数字: 5 6 7 4 3下标: 1 2 3 4 5下标12345一式66743二式234448628812922486下标表示⑤* ①+④* ② + ③ * ③⑤*②+④
2021-01-25 10:30:44
142
原创 C-Coloring Contention
Coloring Contention这道题大致意思是Alice和Bob在玩一个游戏,在一个图中,有n个点和m条边,Alice想要让Bob尽可能多的走颜色不同的边,所以她把相邻的边都涂成了,不同的颜色。而Bob要走最少颜色不同的边,问Bob走这个图,最少需要转换多少次颜色。这仔细一想,就是最短路 - 1,因为走哪条路,都是走一条路换一种颜色,所以Bob就走最短路咯~为什么要补这个题呢,因为比赛的时候没来得及看,一直在看万恶的E题,至于E题是什么:E题传送门一是比赛的时候没打,二是想复习一下最短路。
2021-01-25 00:52:56
260
原创 E-Rainbow Strings
Rainbow Strings这道题是名副其实的签到题,但是我没做出来,原因在于,我总是把问题想的很麻烦,刚看这道题时,我觉得是把所有情况先算出来然后再减去不成立的情况,但是很麻烦,而且所有情况的数值会超long long,果断放弃,然后想用组合数来做,但是做了一半,做不下去了,真想不明白了。然后自己在纸上写了一大篇,还是找不出规律。直到比赛结束(学校组织的模拟赛)。之后补题的时候,也就是现在 ???? ,发现我在比赛的时候脑袋好像被驴踢了…这道题,题目中说的很明确,下标不同的也是不同的彩虹字符串。所
2021-01-25 00:21:35
241
原创 区间合并
区间合并将区间按左端点从小到大的顺序排序。如果下一个线段的左端点的大小小于目前最大的右端点,则更新目前的右端点,如果下一个线段的左端点的大小大于目前最大的右端点,则把目前的区间存储,再记录新的区间。存储区间左右端点用结构体和pair均可。#include <bits/stdc++.h>using namespace std;const int N = 110;int m, n;struct Segment{ int l, r; bool operator<
2021-01-23 17:18:32
81
原创 倍增
倍增法找最接近T的值#include <bits/stdc++.h>using namespace std;const int N = 105;int sum[N], a[N];int main(){ int n; cin >> n; for(int i = 1; i <= n; i ++) { cin >> a[i]; sum[i] = sum[i - 1] + a[i]; }
2021-01-23 11:56:18
71
原创 判断连通块的个数
dfs判断连通块个数#include<bits/stdc++.h> const int N=1005;using namespace std;vector<int> mp[N]; int vis[N]={0};void dfs(int k){ for(int i=0;i<mp[k].size();i++) if(vis[mp[k][i]]==0){ vis[mp[k][i]]=1; dfs(mp
2021-01-22 17:40:24
578
原创 CF 1467 C. Three Bags
C. Three Bags(贪心+思维)左看右看的这题算是看懂了,题意就是给三个背包,将其中一个背包物品x变成负的加在另一个背包的y上,然后这个背包里的x就没了。所以如果对一个物品操作奇数次一定是负的,操作偶数次一定是正的,所以就尽可能将小的变成负的,加在最后的值中。那么会出现两种情况:一是保留A背包里面的所有物品,将其他两个背包都留一个最小的,将其余的都加到A背包中。同理B和C也是。二是将A和B全部保留,C都是负的。同理B都是负的和A都是负的。最终再取一个最大值,输出即可。...
2021-01-22 17:22:19
134
原创 CF 1467 B. Hills And Valleys
B. Hills And Valleys(思维,模拟)一道水题,但是没做出来,仔细想想是自己想的不全。改一个数,让新的序列的谷和峰最少。遍历1到n的所有位置,将初始威胁记录下来,改变位于i的位置的大小。改变大小的方法无非就是以下5种情况:1.a[i]改成a[i - 1]和a[i + 1]中的最小值。2.a[i]改成a[i - 1]和a[i + 1]中的最大值。3.a[i]改成比a[i - 1]和a[i + 1]小。4.a[i]改成比a[i - 1]和a[i + 1]大。5.a[i]改成在a
2021-01-22 16:08:49
162
原创 Gym - 102423J
J - One of Each(贪心,栈)大佬的代码,tql。打比赛的时候没想出来,过后看了看这个代码。用桶排序的思想,记录每个数字出现的个数,然后用栈实现最小的字典序输出。桶的作用就是判断这个数是不是最后一个数字,如果是最后一个数字就不得不去选了,然后栈的作用就是尽可能将前面的数字变小,如果栈顶的数后面还有,且要插入的数字比这个数小的话,就将栈顶出栈,然后将更小的数入栈。具体代码如下:#include <bits/stdc++.h>#define LL long longusing
2021-01-22 11:03:23
112
原创 Gym 102423I
Maze Connect题意是判断最少将多少条边去掉之后,该图变成全部连通,其实就是找有多少个连通块,用dfs跑一下就过了。难点在于把\ /变成2 * 2的方格对应的形状,因为这两个符号带有方向。dfs找连通块的方法就是遍历所有位置,找到不是墙的就dfs进去,将所有不是墙的都标记上,避免下次重复记录,这样就可以保证每一个连通块都有一个空地被记录一次,求出来的再减去1。#include <algorithm>#include <bitset>#include <cm
2021-01-22 10:32:11
96
1
原创 二分查找
二分查找二分查找查找值k如果找到返回该值,如果未找到返回-1。int binary_search(int l, int r, int k){ while(l <= r){ int mid = l + r >> 1; if(a[mid] < k) l = mid + 1; else if(a[mid] > k) r = mid - 1; else return mid; } return -1;}二分查找查找大于等于k的最小值int bi
2021-01-21 15:19:18
236
原创 凸包
凸包凸包就是将一堆点,用一根线将这一堆点紧紧的围上。这里用到了叉积的知识:不会请点我开始时要找最下面的点,设它为p0,并将它和下标为0的坐标交换,并将除下标为0之外的所有坐标以极角大小从小到大排序,如果极角相等,那么将和原点的距离从小到大的顺序排序。每次都找向左转的点,如果是向右转的点那么就将栈顶元素拿出去,然后放进新的点。直到回到第一个点。关于左转右转,如果刚开始的边是p0p1,这时有一个p2,如果p0p1在p0p2的顺时针方向,则从p1走到p2是向左转,反之则向右转。由叉积的性质可知如果 p
2021-01-21 00:51:53
76
原创 线段交、点积、叉积
线段交给几条线段的两点坐标,判输出两条线段交点的个数。条件1:第一条线段完全在第二条线段之上(之下),则可以判断无交点。条件2:假如AB与CD相交,那么A和B一定在CD的两侧,所以(CD×CA)(CD×CB) < 0。C和D一定在AB的两侧,所以(AC×AB)(AD×AB) < 0。假设A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4)。CA = (x1 - x3, y1 - y3),CB = (x2 - x3, y2 - y3)。CD = (x4 - x3,
2021-01-20 19:52:06
360
1
原创 数论
数论快速幂求逆元b * x ≡ 1(mod p)根据费马定理:b^(p - 1) ≡ 1(mod p)(其中b和p互质)可以推出 b * b ^ (p - 2) ≡ 1(mod p)所以 x = b ^ (p - 2)所以可以用快速幂来实现。扩展欧几里得算法ax + by = c,如果c能够整除gcd(a, b),那么此方程有解,否则无解。#include <iostream>#include <vector>using namespace std;cons
2021-01-20 17:27:49
93
原创 单调栈,单调队列
单调栈,单调队列单调栈常用题型:给定一个序列,在这个序列,每一个序列左边,离它最近的比它大或者比它小的数在什么地方。#include <iostream>#include <vector>using namespace std;const int N = 1e5 + 10;int n;int stk[N], tt;int main(){ cin >> n; for(int i = 0; i < n; i ++) {
2021-01-20 15:09:14
59
原创 字典树
字典树#include <iostream>#include <vector>using namespace std;const int N = 1e5 + 10;int son[N][26], cnt[N], idx;//下标是0的点,即是空节点,又是根节点char str[N];void insert(char str[])//存储操作{ int p = 0;//初始化p = 0 for(int i = 0; str[i]; i ++)
2021-01-20 10:07:10
62
原创 Gym - 101341M(简单模拟)
Gym - 101341M(简单模拟)这道题想麻烦了,最开始的方法就是对的,没敢敲可还行hhh#include <iostream>#include <vector>using namespace std;const int N = 200000 + 10;typedef long long ll;ll sum = 0;int a[N], n;vector<int> v1, v2;int main(){ scanf("%d", &n)
2021-01-20 00:53:16
77
原创 Gym - 101341D 裴蜀定理
Gym - 101341D 裴蜀定理裴蜀定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍。#include <iostream>using namespace std;typedef long long LL;LL gcd(LL a, LL b){ return b==0?a:gcd(b, a%b);}int n;LL x, ans, k;int main(){ cin >> n >> k;
2021-01-20 00:30:03
97
原创 容斥原理
容斥原理题目:给出一个数n,给出m个质数,问1~n中有多少个数是这m个质数的倍数。#include <bits/stdc++.h>using namespace std;typedef unsigned long long ULL;const int N = 110;int n, m;int p[N];int main(){ cin >> n >> m; for(int i = 0; i < m; i ++) cin >&g
2021-01-19 17:43:50
68
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人