- 博客(45)
- 收藏
- 关注
原创 2021 icpc 南京 h 树形dp
代码中第55行那个位置我没想到,导致wa了几发。这个题被卡在了t=3的讨论上面,其实把式子推出来发现只和最大值有关系,最大值必选。子节点的选择和子节点为头节点的子树的选择无关。#include <bits/stdc++.h>using namespace std;#define ll long longconst int N = 1e5+10, M = 2*N;int n;int h[N], ne[M], e[M], idx;ll a[N], t[N];ll sum[N]
2022-01-09 16:06:51 655
原创 2019 icpc ecfinal H.King 思维 模拟 随机数
一个思维题,切入点是n/2写代码后交疯狂wa18,然后发现rand函数的上限是32767,太小了,换了一个随机数就过了。#include <bits/stdc++.h>using namespace std;#define ll long longconst int N = 200020;int n, mod;std::mt19937 rnd(time(0));int a[N];ll qmi(ll a, int k) { ll res = 1; while
2022-01-09 16:05:25 497
原创 2018 ccpc final
B. Balance of the Force上来不难想到如何判impossible 以及划分成多个连通块可跨连通块之间的选法如何选择呢 比赛的时候没想出来其实是对于每个连通块来说 最大值进行排序 实时模拟最小值都有谁 如果符合题目中给出的连通块个数 那么更新答案即可#include <bits/stdc++.h>using namespace std;const int N = 200020, M = 2 * N;#define lson l, m, rt<<1#
2021-11-05 20:53:29 209
原创 2020ccpc秦皇岛 K - Kingdom‘s Power
K - Kingdom’s Power比赛的时候思路出了 但不会证。赛后敲了就过了。#include <bits/stdc++.h>using namespace std;const int N = 1000010;#define ll long longint n;vector <pair<int, int>> tr[N];int depth[N];int val[N];int dfs1(int u, int dep) { if(tr
2021-11-04 15:55:15 177
原创 CF 700 (Div.2) C 二分
Searching Local Minimum非常有意思的一个二分题#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int N = 100010;int n;int a[N];void er(){ int ml, mL; int l = 1, r = n; while(l < r) { int
2021-11-02 15:49:05 93
原创 2021ccpc网络赛重赛题解
B Kanade Doesn’t Want to Learn CG比赛的时候是别人写的,想了一种其他的判法,就写了一下直接判断点和抛物线的关系就行这个题得注意一点 球可以碰到篮板的上沿#include <bits/stdc++.h>using namespace std;#define ll long longstruct point{ ll x, y;};struct line{ ll a, b, c; int num(point P){
2021-10-25 19:09:43 347
原创 2021牛客多校第七场 F trees 主席树维护dfs序 每个节点都是一个图
dfs树1是想到了,也想到了dfs过程中需用记录每一个历史节点的图,感觉空间复杂度太高了就没细想。dfs树1,假设该节点为u。维护树2以u为根的子树中 为u树1的祖先的节点 中深度最深的,记为h[u]该节点为树1中链底部的答案是dep[u] - h[u]。主席树按照树2的dfs序维护每个节点的h。dfs回退节点的时候直接用主席树中的历史节点即可。主席树上使用懒标记,能不下放时就不下放。#include <cstdio>#include <cstring>#includ
2021-08-11 09:01:51 146
原创 2021牛客多校第八场 F 离线求值+bitset存图+滚动数组
F在线复杂度高就离线每个点都是由下或右去转移的,只用记录两层节点即可,相当于是一个滚动数组。对于每个节点来说,用一个bitset存图,用来记录当前点是否可以到达地图上的某个点。更新完该点的bitset后更新从该点出发的答案。#include <bits/stdc++.h>using namespace std;const int N = 510, M = 500050;#define node(x, y) x * m + yint n, m, k;char z[N][N
2021-08-11 09:00:28 107
原创 2021牛客多校第八场 D
赛场上有一个公式没推出来。a + b = (a | b) + (a & b)有了这个公式后直接对于每一个数字来说按位枚举情况,然后找方案数即可。过程中会有回溯去修改历史情况的值。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int N = 100010;#define ll long longint n;int b[N], c[
2021-08-11 08:59:17 104
原创 Research Productivity Index
一道dp,比赛场上看出来是一个dp,可是只会暴力,后来发现转移方程很简单,还是太菜了#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 200;int n;double d[N];double dp[N][N];double c
2021-03-22 08:50:55 78
原创 2015沈阳网络赛 C
树上差分 用到了树链剖分的方法求 lca。这题数据有点弱呀,#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 20020, M = 2 * 200020;int n, m;int h[N], e[M], ne[M], idx;int dfs[N], cha[N], d[N]
2021-03-03 14:55:46 101 1
原创 CF Global Round 13 D
二进制永远的神题干题解:如果 u 到 u + v 中有一条边,那么 u & v = v,那么证明二进制 v 为 1 的位 u 也为 1。u + v 的时候, 如果两位全为 1 的话,高位进位,该位变0。不全为1的时候,该位为1。总结一下: u中1的位置 一定比 u+v中1的位置 低或相等,照着这个规律去判断两个数字之间有没有边即可。还有就是别忘了 只能向比自己大的值连边。#include <cstdio>#include <cstring>#includ
2021-03-01 16:33:37 184
原创 CF Global Round 13 C
题干模拟这个过程,对于每个点来说记录他的入度。入度数组为 in高度为 d如果 in[i] >= (d - 1) 该点能由之前点来转化,而且多的可以更新下一个值 in[i + 1] += in[i] - (d - 1)如果 in[i] < (d - 1) 那么他无法完全有之前的转换,得从该点开始, ans += (d - 1) - in[i]然后对于该点来说更新他后面的点 j = (i + 2 ~ min(n, i + d[i])) 这个区间内的 in[j] ++#include &
2021-03-01 14:32:32 190
原创 2020南京站 F-Fireworks
还是得学率论 T_T sad.jpg题解:这个题用到了概率论的知识,伯努利实验的期望公式期望为 E(x)=(n∗x+m)(1−(1−p)x)E(x)=\frac{(n*x +m)}{(1-(1−p)^x)}E(x)=(1−(1−p)x)(n∗x+m)求导后发现有零点,三分即可#include <cmath>#include <cstdio>#include <iostream>using namespace std;double p, q, n, m
2021-02-28 22:38:15 370
原创 CF 704 (Div. 2) D
Codeforces Round #704 (Div. 2) D题意:a个0,b个1,组成两个数字。两个数进行相减后二进制1的个数为k。题解:二进制加法,细节还是得多想。k!=0k!=0k!=0时,如果 k≤(a+b−2),2≤b,1≤ak≤(a+b-2),2≤b,1≤ak≤(a+b−2),2≤b,1≤a 即有答案,#include <bits/stdc++.h>using namespace std;#define ll long long const int N = 2
2021-02-28 18:40:46 126 1
原创 CF 704 (Div. 2) E
Codeforces Round #704 (Div. 2) E题解:把第一个数组当成初始序列,查看其它序列,进行修改,最终求出答案先分析直接有答案的:如果初始序列和其他序列进行对比不同项 不超过2个,初始序列即为答案。如果初始序列和其他序列进行对比不同项 超过4个,不可能有答案。然后分析如何进行修改,对于 除了初始序列剩下的序列 与 初始序列进行对比:不同项有四个,那么必然得修改其中的任意两个,共6中情况,修改后查看其他序列是否符合要求。不同项最大为三个,任意选出不同项为三个的序列进
2021-02-28 18:40:16 104
原创 刷题记录
标 * 的为有价值的题,标 ^ 的为欺诈题,标 - 的为知识点待填坑,标 ? 的表示看别人是这样做的但是没懂为什么标 $ 的表示现在还不会的,或者没学过,但很有用的题组队训练的题,如果是队友过的板刷题,题面又很长,就会标个“队友说是沙雕题”21.2.28Codeforces Round #704 (Div. 2)A 取余B 规律C 双指针双向贪心D 二进制加法E 构造,暴力情况讨论...
2021-02-28 18:39:50 81
原创 2019 ICPC 南昌站 And and Pair
2019 ICPC 南昌站 And and Pair个人感觉是一个分类讨论的题目首先题目要求 :给出一个n,求(i, j)的个数0 <= j <= i <= ni & n = ii & j = 0从低位向高位访问,如果出现1的话,并有x个1,y个0。那么进行分类讨论,除最高位的1之外所有位来说如果 i = 1,j 可以为 0(对于i和j的同一位来说)如果 i = 0,j 可以为 0 。如果 i = 0,j 可以为 1 的前提为 i 的最高位为 1
2021-01-15 09:19:43 122
原创 CF代码出错点
600 div2A for(int i = 0;i < n;i ++){ if(b[i] < 0) ans = 1; else if(b[i] > 0 && t == 0){ t = b[i]; while(b[i] == t && i < n) i ++; i --;//外层每次就++,这里得减一次 } else if(b[i] > 0) a
2021-01-01 21:29:18 244 1
原创 单调栈与单调队列
单调栈题意:对于一个数组中每一个数来说,找到其左面第一个小于该点的值。很容易想到是单调栈,可是为什么用单调栈呢?证明:我们对[a b] c {d0, d1, d2 ...}来说,已知a < b & b > c,对于c后面数字进行分析。c后数字如果大于c,有可能答案是c,但答案不可能是b。那么对于c后的数字来说b是没必要存在的,可以由c来代替。对于{}也就是待分析数字前,应该是单调递增的, 且可支持单侧(挨着{}的方向)动态更新递增数组,即把b用c代替。抽象完模型后为单调
2021-01-01 21:27:26 93
原创 Codeforces Round #685 (Div. 2)
A. Subtract or Divide题意就是给一个数n,通过两种操作把他变成 1, 问最少操作的次数操作一,n 除以 除自己以外的因子操作二,n 减一上来以为和素数有关系,想的是n - > (n的最小质因子)|| (n - 1)然后交了两发wa,发现和质数没关系12 -> 13 -> 2 -> 1剩下的偶数 -> 2 -> 1剩下的奇数 -> 该奇数减一(偶数) -> 2 -> 1就这几种情况,就没了,还是得从题目本身去开
2020-11-22 08:03:08 266
原创 Educational Codeforces Round 98 (Rated for Div. 2)
Educational Codeforces Round 98 (Rated for Div. 2)B. Toy Blocks题意就不说了目标状态是一个最大值,剩下的值都相等,我们把最大值设为max,剩下的值设为min要满足一下的条件找到答案min / (n-2) = max - min && max % (n-1) == 0如果拿出min,那么min能弥补剩下的min和max之间的差距如果拿出max, 那么max补min后得让所有的min都相等比赛的时候到这步就结束了,
2020-11-20 16:33:18 238
原创 数论板子
线性筛void get_primes(int n){ for (int i = 2; i <= n; i ++ ) { if (!st[i]) primes[cnt ++ ] = i; for (int j = 0; primes[j] <= n / i; j ++ ) { st[primes[j] * i] = true; if (i % primes[j] == 0) brea
2020-10-16 10:13:12 198 1
原创 线性DP
放格取数先找到最大值后进行路径标记,然后再找一遍最大值这种方法是不对的,问的是两个路径没有重复点的时候,总共的最大值同一时间点时不能出现相同的点,如何判断同一时间呢,因为该点只会向右或者向下,所以判断时间相同的标准为两点的xy相同两个相同的时候也是有可能出现的,因为可能是出发的节点或者是结束节点for (int k = 2; k <= n + n; k ++ ) for (int i1 = 1; i1 <= n; i1 ++ ) for (int i2
2020-10-02 19:48:23 86
原创 区间DP
石子合并区间DP的状态表示一般是一个区间f [ i , j ] 为 从 i 到 j 的区间合并成一个的代价,其中每次是把两个相邻区间进行合并,那么i~j合并成一个区间那就是[i, k]和[k+1, j]合并成一个区间,还得把k遍历一遍 for(int i = 1; i <= n; i ++) s[i] += s[i-1]; for(int len = 2; len <= n; len ++){ for(int l = 1; l + len - 1
2020-10-02 19:41:20 96
原创 背包问题
01背包二维数组代码#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 1010, M = 1010;int n, m;int dp[N][M];int v[N], w[N];int main(){ cin >> n >> m;
2020-10-02 11:26:43 83
原创 Codeforces Round #672 (Div. 2)
C1最后要的 ans 是争取 加的多,减的少上来找规律是找到山峰相加,找到山谷相减如果最后一个位置是山谷的话就不用在减去该值了,因为后面不可能在加上一个值用差分数组去找到山峰和山谷的位置一个贪心,昨天最后没力气打代码了,#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define LL long longconst int N = 300
2020-09-25 11:35:40 311
原创 线段树
线段树区间的性质是可以进行分解的,大的区间的性质可以由小的区间的性质进行转换最大数建树(build) 利用最大长度进行建树,利用数组或者结构体的编号去建树,标明左右节点的编号访问(query) 利用递归去访问以该节点为根节点的子树修改(modify) 递归继续修改,从底向上,当每一次进行完递归操作后进行一次pushup操作更新该点的值pushup 用该节点的 子节点 去更新该节点的值( a << 1) + 1 == a << 1 | 1a << 1 +
2020-09-23 14:29:20 81
原创 哈希表
拉链法就是链式前向星,或者是单链表直接用一种方法进行映射,如果出现重复的值,用链式前向星去存储#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 100010, mod = 100003;int h[N], e[N], ne[N], idx;void add(int a)
2020-09-18 08:05:40 134
原创 欧拉路径
欧拉路径:欧拉路是指从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边通过的且只通过一次。欧拉回路:欧拉回路是指起点和终点相同的欧拉路。对于无向图,所有边都是连通的(1)存在欧拉路径的充分必要条件:度数为奇数的点只能是0个或者2个(2)存在欧拉回路的充分必要条件:度数为奇数的只能是0个2对于有向图,所有边都是连通的(1)存在欧拉路径的充分必要条件:要么所有点的出度均等于入度, 要么除了两个点之外,其余所有点的出度等于入度,剩余的两个点:一个满足出度比入度多1(起点),另一个满足入度比
2020-09-17 22:40:24 3508
原创 无向图的双连通分量
边的双连通分量 e-DCC 桥 极大的不存在桥的连通块点的双连通分量 v-DCC 割点 极大的不包含割点的连通块每个割点至少属于两个连通分量任何两个割点之间的边不一定是桥任何一条桥的两个端点不一定是割点这就证明了割点和桥是没有关系的点双连通分量 和 边双连通分量也是没有关系的边双连通分量,时间戳,dfn(u) low(u)1.如何找到桥(假设x->y是一个桥)那么 桥 <=> dfn(u) <low(y) 无法形成环2.如何找到所有的边的双连
2020-09-17 22:40:15 150
原创 差分约束
解不等式组xi <= yj + ck就比如x1 <= x2 + 1x2 <= x3 + 2x3 <= x1 - 2x1 = 0x2 = -1x3 = -2这就是其中一个可行解那么就可以把 不等式组 变成 可行解xi <= xj + ck表示有一条 j -> i 权值为 ck 的边,根据不等式组,可以建图,求不等式组的可行解 源点需要满足的条件:从源点出发,一定可以走到所有的边 如果不能遍历所有的边,就是说并不是所有的不等式是满足条件的,那
2020-09-17 22:40:07 109
原创 拓扑排序
拓扑图 即为 有向无环图拓扑序 满足 对于任何有子节点的节点来说,该节点的子节点在该节点的后面拓扑排序#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 110, M = N * N;int n;int h[N], e[M], ne[M], idx;int q[N];i
2020-09-17 22:39:33 140
原创 Educational Codeforces Round 95 [Rated for Div. 2]
Educational Codeforces Round 95 (Rated for Div. 2)A数学题输入 a b k题目上来只给你 一个s两个操作一个 s 可以换成 a 个 sb 个 s 可以换 一个 c一个 t = 一个 s + 一个 c(该步骤不算操作)问要 k 个 t 需要 多少 次操作有点像进制转化,昨天一直wa是因为 k * b 个 s 变成 k 个 c 是 k 步,而不是 b 步,还有就是不是每次 + a, 是每次 + (a - 1),最后虽然说看出来了,可是太慢了
2020-09-15 18:24:08 154
原创 【题解】牛客2020年七夕节比赛
D题 bfs + 剪枝题解说 : 因子最多只有240个左右#include<iostream>#include<cstdio>#include<cstring>#include<map>#include<algorithm>using namespace std;int n, all;map<int, int>m;void dfs(int x, int y) { if(x == 1){ all = min(
2020-08-25 22:31:23 206
原创 ACM International Collegiate Programming Contest, Asia Regional 2019, Japan
A一个硬模拟,第一次操作最早在 timestamp = 1 时才能进行,题目中没有标注,图倒是标注了,wa了一发#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define ll long long#define inf 0x3f3f3f3f#define debug(x) cerr << #x << x <&l
2020-08-22 19:29:25 303
原创 20.8.22
昨天熬夜cf今天下午又一个ACM International Collegiate Programming Contest, Asia Regional 2019, Japan累吐了,感觉补题都是一个大工程9.20 就ccpc的网络赛了,还是得努力啊
2020-08-22 19:18:03 132
原创 Codeforces Round #665 (Div. 2)
A找规律,上来差点找吐了#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define inf 0x3f3f3f3f#define debug(x) cerr << #x << x << '\n'using namespace std; int main(){ int l; int n,k;
2020-08-22 08:45:34 126
原创 强连通分量
tarjan板子const int N = 10010, M = 100010;int n, m;int h[N], e[M], ne[M], idx;int dfn[N], low[N], timestamp;int stk[N], top;bool in_stk[N];int id[N], scc_cnt, Size[N];void tarjan(int u){ dfn[u] = low[u] = ++ timestamp; stk[ ++ top] = u, in
2020-08-21 10:20:34 123
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人