自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2021-04-07

原题链接DP做法#include <iostream>#include <cstring>using namespace std;const int N = 1010, p = 4000, M = 10010;typedef long long LL;LL f[5][M], w[5][N], n, m;int main() { cin >> n; for (int i = 1; i <= 4; i ++) {

2023-06-25 23:19:04 52

原创 ACM_数学

同余ax≡b(modm)ax\equiv b(mod m)ax≡b(modm)   其中d=gcd(a,m)∣bd=gcd(a,m)|bd=gcd(a,m)∣b xxx有ddd个模mmm不同余的解

2023-06-25 23:18:58 79

原创 对拍

2022-10-29 23:24:29 87 1

原创 HDU5955 Guessing the Dice Roll(AC自动机+高斯消元)

题目链接n个人每人选择一个长度为m的序列,序列中每个元素是1到6中的整数。每次投骰子等概率的得到1到6的的一个点数。当点数序列最后m位与任何一个人的序列匹配时停止,且该人获胜,问每个人获胜的概率。以所有个人的序列构造fail树,那么每个节点有一个编号,且从该点走下一步共有6中情况,每种情况的概率是1/6。当走到终点时,没有下一步,因为游戏已经结束。假设一共有idx+1(虚拟源点)个点。设走到i的总概率为xi,则a0x0+a1x1+...+aidxxidx=xia_0x_0+a_1x_1+...+a_{

2021-11-11 16:23:14 297

原创 带修改主席树(树状数组套主席树)

原题链接:Yuuki and a problem 查询与2021icpc昆明M相同:[l,r]区间内无法最小无法合成的数,相比昆明加入了修改。2021ICPC昆明M对以root[i]为根的树进行修改会影响以root[i+1…n]为根的树。修改的时间代价太大。采用树状数组维护主席树的每个版本。每次修改为O(logN)O(logN)O(logN),因此修改的时间复杂度最坏为O(Nlog2N)O(Nlog^2N)O(Nlog2N).今天第一次做踩了一个坑: 每次修改时若还未对某个节点分配一个idx才分配

2021-10-27 15:14:31 173

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

题目链接D.JourneytoUn′GoroD.Journey to Un'GoroD.JourneytoUn′Goro题意题意题意构造长度为n的字符串,每个点是b或r。之后选两个点L,R(1≤L≤R≤n),使得[L,R]中有奇数个r,问(L,R)点对的最大数量。按字典序输出构造的序列,如果数量>100只输出前100个构造长度为n的字符串,每个点是b或r。之后选两个点L,R(1 \leq L \leq R \leq n),使得[L,R]中有奇数个r,问(L,R)点对的最大数量。按字典序输出构造的

2021-10-12 09:44:40 1068 3

原创 CodeForces - 707C Pythagorean Triples (判断勾股数)

原题链接原博客链接题意:给一个数nnn,判断nnn是否是一个勾股数(勾股数定义:对一个正整数xxx,若存在两个数yyy,zzz使得 x2+y2=z2x^2+y^2=z^2x2+y2=z2或x2=y2+z2x^2=y^2+z^2x2=y2+z2,则称xxx为勾股数 )思路:设nnn为直角边,令a2+n2=c2a^2+n^2=c^2a2+n2=c2⟹\Longrightarrow⟹c2−a2=n2c^2-a^2=n^2c2−a2=n2⟹\Longrightarrow⟹(c+a)(c−a)=n2(c

2021-08-23 08:41:57 147

原创 poj 2104

原题链接主席树,本题在查询前可以不用建树,每个版本加log(2e9)个节点,空间复杂度不会超过1e5 * log(2e9) 不会超过1e5 * 32,可以不用离散化直接做。#include <iostream>using namespace std;typedef long long LL;const int N = 100010;struct Node { int l, r, s;}tr[N * 32];int n, m, idx, a[N], root[N];

2021-06-16 20:12:22 72

原创 D - RGB Coloring 2

原题链接暴力枚举:3^20 一定超时可以对暴力进行优化:对于有n个点的连通块块,只需最多枚举3 * 2 ^ (n - 1),因为只有第一个点3种颜色都可以染,后续的点都受之前枚举过且与自己相连的点的约束,最多只能染两种颜色。而连通块之间的染色方案互不干扰,因此答案为各连通块染色方案的乘积。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 30;int tem[N],

2021-04-26 17:24:14 583 2

原创 L2-004 这是二叉搜索树吗?

原题链接思路:因为是前序遍历,所以对于区间[l, r],a[l]一定是根节点,[l + 1, r]是这棵数的左右子树的所有元素。找到分界点后递归即可。用vector存后续遍历的结果。#include <bits/stdc++.h>using namespace std;const int N = 1010;vector<int> v;int n, m;int a[N];int type;void build(int l, int r) { if (l

2021-04-23 10:41:22 183

原创 Spread of Information

原题链接#include <iostream>#include <cstring>using namespace std;const int N = 200010, M = 2 * N, INF = 0x3f3f3f3f;int h[N], e[M], ne[M], idx, n, m, k;int f[N], g[N], cnt; //f[u]:u的子孙结点中,最近的特殊点距离u点的距离 //g[u]:u的子孙

2021-04-13 16:01:56 215

原创 AtCoder Regular Contest 116D I Wanna Win The Game

原题链接知识点:DP, 二进制将N个数看成二进制数,第i位看成2^(i - 1)1.总和不大于M <== > N个二进制数中为1的权值的和 <= m2.异或和为0 <==> 每一位都有偶数个1f[i][j]:表示N个数的二进制的后i位的和代码:#include <iostream>#include <cstring>using namespace std;typedef long long LL;const int N =

2021-04-10 21:18:52 57

原创 AtCoder Beginner Contest 196 E - Filters

原题链接进行N次迭代的f操作前,把x看成f(x) = x,对应图像是一条完全的斜线t = 1的操作:斜线上下平移t = 2的操作:斜线左端点沿着斜线向右上方平移,mind向上平移t = 3的操作:斜线右端点沿着斜线向左下方平移,maxd向下平移期间记录偏移量AC代码#include <iostream>using namespace std;const int N = 200010;typedef long long LL;int n, m;LL a, t, x;

2021-04-09 20:06:33 117

原创 AtCoder Beginner Contest 196 D Hanjo

原题链接用dfs爆搜即可#include <iostream>using namespace std;const int N = 20;int ans = 0;bool st[N][N];int n, m, a, b;int dir[2][2] = {0, 1, 1, 0};void dfs(int u, int x, int y) { if (u == a + 1) { ans ++; return ; }

2021-04-09 18:09:16 119

原创 AtCoder Regular Contest 115 C - ℕ Coloring

原题链接结论:第i 个数染上 i的约数个数+1 种颜色首先,这种染色方法一定是满足题意的:这个数的约数的约数个数一定小于这个数的约数个数,因此这样这个数的颜色编号一定大于(满足题目的不等于)它的所有约数的颜色编号,而1的颜色编号是1,因此颜色编号在约数个数的基础上+1显而易见,这种染色方法的到的序列中的最大数一定是最小的用试除法计算每个数的约数个数用到调和级数时间复杂度约为O(N lonN)#include <iostream>using namespace std;const

2021-04-09 10:48:56 174

原创 F - Construct a Palindrome

原题链接#include <bits/stdc++.h>#define x first#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 1010, M = 4010;int h1[N], h2[N], e[M], ne[M], w[M], n, m, idx;int f[N][N];PII q[N * N];int ans = 1e9;void a

2021-04-08 22:23:12 112

原创 2021昆明 J Parallel Sort

原题链接不在自己位置上的数才需要换位置若两个数刚好站在对方的位置,在第一轮就能换到自己的位置第三种情况构成一个环。结论:交换两轮即可得到答案序列换位置的方案:按环的顺序得到数组后进行下图的交换第一轮:将区间[1,n - 1]翻转第二轮:将区间[0, n - 1]翻转t图中每个点代表数而不是下标#include <bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N

2021-04-08 19:55:36 157

原创 2021-04-07

原题链接知识点:主席树设某个区间内所有<=sum的数的和为sum要合成sum+1,则必须在区间中找到sum + 1,若不能找到,答案就是sum + 1若能找到:则1 ~ sum + s也能被表示(s 为区间中所有值为sum + 1 的数的和)#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 1000010;struct Node { int ls,

2021-04-07 20:32:46 48

原创 2021-03-25

原题链接知识点:期望DP划重点:期望DP要从后往前推,终点的期望为0设选出x个点的的期望是X则

2021-03-25 22:04:50 74

原创 2021-03-21

原题链接注意输出时要写上小数的位数#include <iostream>#include <cstdio>using namespace std;const int N = 1000010;int n, m;double a[N], pre[N], suf[N];double ans = 0;int main() { cin >> n; for (int i = 1; i <= n; i ++) cin >&

2021-03-21 16:19:45 54

原创 2021-03-20

原题链接题意:给你n个可删除的文件(夹)和m个不吭删除的文件(夹),问你最少需要删除几个文件(夹)使的所有要删除的文件(夹)被删掉,而不用删除的文件(夹)不会被删掉思路:按字典树的方法建图,将要所有n个删除的文件插入标记所有m个不能删除的文件路径上的所有节点随后dfs一遍即可#include <iostream>#include <cstring>#include <sstream>#include <map>using namesp

2021-03-20 20:45:29 76

原创 2021-03-20

原题链接题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少总体分为3种:1、由某一个人走完全程。2、两人对着走,直到两人都走到头。(若先走到头的人往回走想在另一个人走到他的终点前走到那个点,则就是第一种情况)3、二分p1和p2之间的中间点,中间点左边的由p1走完,中间点右边的由p2走完。代码#include <iostream>#include <cstdio>#include <cstdlib>

2021-03-20 16:02:10 64

转载 2021-03-19

原题链接题意:扫雷游戏,X表示雷,.表示无雷区,每个无雷区上面有一个数字,记录该位置处周围8个位置有多少个雷。现在给出A矩阵雷区和B矩阵雷区,它们无雷区数字之和为suma,sumb,要求(int)(nm/2)次将B矩阵雷区变化成sumb=suma解题思路:首先要找到一个规律就是,将一个矩阵的雷区全部变成无雷区,无雷区全部变为雷区,最后得到的sum相同。然后去找A矩阵与B矩阵每一个位置处不同的数量cnt,如果cnt<=(int)(nm/2),则直接输出A矩阵即可。如果cnt>(in

2021-03-19 16:51:42 36

原创 最近公共祖先

原题链接题意:找最小公共祖先(离两个点最近的公共祖先)把每个节点看成二进制数,以1为根的完全二叉树,每个节点的父节点的编号等于自己的编号除以2。二进制数除2 <=> 二进制数右移1位解题思路:用string读入16进制字符串,转化为二进制字符串,找到两个二进制字符串的最长前缀,将该前缀转化为16进制字符串即为答案做题时进入的误区:找两个二进制字符串的最长前缀,为了方便,找了16进制的前缀。当2进制右移的位数%4 = 0 时是等价的,反之,二进制位的权值发生变化,4个二进制位对应的

2021-03-14 21:26:07 844

原创 2021-03-13

I Full Depth Morning Show(树形dp)思路:1:dfs1自底向上用下图①②的公式求出每个点的stu和stdu,最终求出stup[1]和stdu[1]2:dfs2由上向下用公式2,从1开始更新sdu[i]和stdu[i],递归的过程中用sdu[i]和stdu[i]算出ans[i]#include <iostream>#include <cstring>using namespace std;const int N = 100010, M =

2021-03-13 16:40:29 56

转载 2021-03-12

题意m个人,n组生日(可能这一天就一个人过生日,也可能多个人过生日),一年365天,问给定的这种情况的概率思路答案概率 = 符合题意的情况数 / 总情况数设 m 是总人数,那么总的情况数是 365 ^ m符合题意的情况数:1、选出 n 天生日的情况数:2、 m 人分成 n 组的情况数(排除组内重复)3、 n 个日期与 n 个组一一对应的情况数(因为每个组的人数可能相同,所以用记录每组人数出现的次数的数组 d 来计算,相当于 n 组分成 k 块( k 是数组 d 的长度 )),情况数为:

2021-03-12 10:40:40 74

原创 2021-03-09

我们按顺序从前往后在这 n 个数之中选 k 个数出来,一个自然的想法就是每次尽量选取字典序最小的数,让较大的数在答案序列中尽量靠后。我们可以用类似单调队列的思想去实现: 用 ans[] 存储答案,当枚举到第 i 个数 ai 的时候,当 ans[] 之中没有 ai 时,将其与 ans[] 的最后一位 b 做比较,如果 ai < b 且 ai 之后还有b,那么删去 b,接着比较,直到在 ans[] 中找到不满足条件的数为止,此时插入 ai,枚举下一个数。涉及知识点:单调栈#include &...

2021-03-09 16:11:10 97

原创 2021-03-09

原题连接打草稿可知,一个数n平方后个位数为一个给定值,n只有最多只要两种情况,可用dfs#include <iostream>using namespace std;const int N = 20;int a[N], n, m;//a数组存答案string s;bool flag;int len;bool check(int k) { //判断数组的第k位填写是否合法 int l = max(0, k - len + 1), r = min(len -

2021-03-09 16:08:03 40

原创 2021-03-07

原题链接灰太狼养了一群羊,一共有N只羊,每只羊体重为Ai,小羊的生长周期为N,也就是每过N天小羊会长胖一公斤,恰好,每只羊的生长周期错开了,具体来说,第一天第一只羊长胖一公斤,第二天第二只羊长胖一公斤,第n+1天又轮到第一只羊长胖一公斤,但是红太狼有严重的强迫症!!她想看到所有小羊都是一样重,这样她才能安心挑选羊,所以灰太狼发明了羊羊体重变化器,这个机器每天可以使用一次,效果为:使任意一只小羊,体重增加或者减少一公斤。(当然啦。也可以不进行操作)问:最短多少天,可以使所有小羊达到相同的体重。输入:

2021-03-07 09:28:03 88

原创 2021_HUASACM_周测_4 题解

Problem A: 小羊快长胖!!!Problem B: 最大硬币数3堆硬币的选法第一堆:显然,为了让自己尽可能得到更多的硬币,每次选3 堆硬币出来时要从未被选择的硬币中选择最小的那堆给Bob第二堆:Alice 获得3堆硬币中数量最大的那堆,因此最大的那堆(无论现在还是以后选)一定是给Alice 的,因此第二堆最大的那堆要选出来给Alice。第三堆:已经为AIice选了最大的那一堆,如果我这次不选次大的那堆,下次选3堆硬币出来时,次大堆的硬币选出来后只能给Alice(因为没有比它更大的)。因此选

2021-03-06 16:26:31 260

原创 2021-03-06

题目链接本题主要是对数组中是否存在一个数与其他所有数互质的判断枚举求最大公约数时间复杂度是O(N * N * logN)会超时。解法:对每个数分解质因数,记录数组中每个质因数的个数之和,再用一个数组存每个质因数在某个数中出现的次数再次遍历数组中的每一个数,若这个数有这个质因数且数组中的质因数个数 > 该数的质因数个数,说明数组中的另一个数存在该质因数,即存在一个数与这个数不互质。#include <iostream>#include <cstring>#inclu

2021-03-06 14:44:53 83

原创 2021-03-06

题目链接当某个数在数组a,b内出现的次数>n时,一定无解,反之,一定能找到一个满足条件的数组b将数组b按降序排列,若有有重复的区间,则这个区间的数一定相同。定义一个指针it初始位置指向b[0],对于重复位置的b[i],swap(b[i], b[it])需保证交换后a[it] != b[it] && a[i] != b[i]。由于重复区间的数相同,因此it无需回溯,即it最多只会遍历b数组一次#include <iostream>#include <algo

2021-03-06 11:52:19 50

原创 2021-03-06

Dist Max题解传送门做题时我只考虑了两个点分别在左上和右下角的特殊情况,当点在左下和右上角时答案错误#include <iostream>using namespace std;const int N = 200010;int dist[N];int main() { int n; cin >> n; for (int i = 0; i < n; i ++) { int a, b; cin &

2021-03-06 11:14:05 43

原创 2021-03-06

Ubiquity正难则反全排列有长度为 N 的数组,每个位置的取值为 0 ~ 9,因此,数量为 种。不包含 0 的排列有长度为 N 的数组,每个位置的取值为 1 ~ 9,因此,数量为 种。不包含 9 的排列有长度为 N 的数组,每个位置的取值为 0 ~ 8,因此,数量为 种。同时不包含 0 和 9 的排列有长度为 N 的数组,每个位置的取值为 1 ~ 8,因此,数量为 种。最终答案这样,我们根据容斥原理可得,最终的答案为 。————————————————版权声明:本文为C

2021-03-06 10:13:47 41

原创 2021-03-04

Through Path有题意,需要用到差分的知识以任意一个节点为根节点,假设a,b两点分别是+x,-x的点当a能够不通过b点到达根节点时:w[a] += x,w[b] -= x否则:w[b] += xQ次操作若每次操作都要判断a能否到达根节点,也会超时。建完树后求出每个点的深度,可在O(1)的时间复杂度判定#include <iostream>#include <cstring>#include <cstdio>#include <algor

2021-03-04 18:04:16 139 1

原创 2021-03-04

Choose Me排序时不能按照城市人口的总人数(T进行演讲后,该城市支持T的人增加,同时支持A的人减少)#include <iostream>#include <algorithm>#include <cstdio>using namespace std;typedef long long LL;typedef pair<LL, LL> PLL;const int N = 200010;PLL p[N];int main

2021-03-04 16:04:02 246 1

原创 Come Back Quickly

Come Back Quickly用堆优化的dijkstra为每个点求得最短回路可过(时间复杂度O(N * N * logM))dijkstra算法中将与起点相连的点入小根堆,起点距离仍为∞,同时将这些点的距离了初始化(注意连个点之间可能有多条边,因此距离每次都要取min),之后相当于求多源最短路,起点第一次出队时返回(第一次入队时不一定是最小值)。另外注意点之间是单向边#include <iostream>#include <cstdio>#include <cs

2021-02-08 15:51:38 208

原创 Strange Birthday Party

1.Strange Birthday Party看题不仔细,做题两行泪。一开始以为给每个朋友的礼物是小于等于手上数字的商品序号或等量钱。虽然每件商品都只有一件,但都可选的价值最小的商品的钱就行。看案例解释没看懂,也没回去看题。正确题意:给每个人小于等于手上数字序号的任意一件商品(每个商品用一次),或者给手上序号对应商品的钱。做题思路:商品价值已经是按非降序排列。朋友手上的数字没有规律,将这个数组按非升序排列,朋友对于每一件商品,如果有一个朋友的数字≥该商品的序号并且还没给他送礼物,那么给他送这件商品

2021-01-29 08:53:27 39

原创 Codeforces Round #696 (Div. 2)...

1.矩阵距离先将所有1入队,再进行BFS#include <iostream>#include <cstdio>using namespace std;const int N = 1010;typedef pair<int, int> PII;PII q[N * N];char g[N][N];int dist[N][N], dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};bool st[N][N];int n,

2021-01-20 21:37:42 88

空空如也

空空如也

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

TA关注的人

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