ICPC
文章平均质量分 68
ICPC题目的整理和题解
中二病没有蛀牙
这个作者很懒,什么都没留下…
展开
-
模拟退火
玄学算法get√模拟退火是一种通用的优化算法,其实学一下完全是因为数学建模也能用,在icpc中可以用于求一个毫无规律的函数最优解。当一个问题的方案数量极大(甚至是无穷的)而且不是一个单峰函数时,我们常使用模拟退火求解。简单地说,就是将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。演算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的原创 2021-05-01 22:42:29 · 384 阅读 · 0 评论 -
牛客练习赛80题解
掉分大场,坐等明天紫名了B 卷积思路:傻逼题,但是没看直接去怼C了orz代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 998244353;const int maxn = 2e5+5;ll a[maxn],b[maxn],c[maxn];int main (){ ios::sync_with_stdio(false); int n;原创 2021-04-09 22:48:42 · 227 阅读 · 0 评论 -
ICPC2020济南站 A Matrix Equation 高斯消元 + bitset优化
希望后天能有好运手速快的话这场,铜牌4银牌5,银牌题高斯消元,金牌6,金牌数位dpA Matrix Equation题意:求有多少个C可以满足A×C=B⋅CA\times C=B\cdot CA×C=B⋅C思路:高斯消元根据线代叉乘的规律,拆成对于C的每一列求解。一个性质是mod2下的加法就是异或。于是就变成了一个高斯消元异或方程组求解,对于C的每一列答案就是2自由元个数2^{自由元个数}2自由元个数,所有列直接根据乘法原理相乘。n的数据是200,时间复杂度是O(n4)O(n^4)O原创 2021-04-06 21:43:52 · 275 阅读 · 1 评论 -
ICPC基础数学知识点整理
非数学选手,记录一下碰到的各种数学相关的知识点。组合数学二项式定理组合公式:C(n, m) = n!/(m!(n - m)!)递推关系:C(n, m) = C(n - 1,m) + C(n - 1, m - 1)原创 2021-03-30 20:22:23 · 2338 阅读 · 2 评论 -
Codeforces 709 div2 DPlaylist 双端队列+链表
链接:https://codeforces.com/contest/1484/problem/D题意:给你一个数组,每次找到一对互质的数时,删去其中第二个,不能连续删除,求最终删除的顺序。思路:按照题目模拟就好了,需要用数据结构优化。每次取出队首的数,判断是否和它的下一位互质,如果是的话将下一位删去,用数组模拟链表,就只需要将nex[x]指向nex[nex[x]],再将队首的数放回队尾。直到队列为空。这个题一开始我只用了双端队列来写,按上述思路模拟,也是对的,不过最后一个点会超时。就很神奇,加了原创 2021-03-30 11:57:02 · 177 阅读 · 0 评论 -
Codeforces 709 C Basic Diplomacy 贪心/网络流二分图匹配
链接:https://codeforces.com/contest/1484/problem/C题意:有m天和n个朋友,给出每一天哪些朋友是空闲的,每天邀请一个朋友,不能有朋友的出现次数超过m2\frac{m}{2}2m,输出任一答案,如果没有答案输出NO。思路一:贪心优先选择空闲朋友少的天,对于每一天选择出现次数最少的朋友。代码:#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3fconst i原创 2021-03-29 18:06:07 · 288 阅读 · 0 评论 -
运输计划 lca+树上差分/前缀和+二分
链接:https://www.acwing.com/problem/content/description/523/思路:一个涉及了一堆知识点的老复杂的题目了。lca+树上差分+二分首先看数据范围是3e5,那么想一下怎么可以把复杂度降到 log(n)log(n)log(n)题目中要求的是完成m个运输计划所需的最短的时间。即m条路径中的最大值最小,那么就需要在出m个要求的路径中,找出两个点间重复的那段权值最大。然后发现这个时间是满足单调性的,可以想到对答案二分。设时间为mid,其实这里的时间就是路径原创 2021-03-28 11:34:21 · 220 阅读 · 0 评论 -
旅行 基环树+dfs序
链接:https://www.acwing.com/problem/content/536/分析:n是5000,可以搞个O(n2)O(n^2)O(n2)的做法。要求字典序最小,可以先预处理一下,对每一层排个序,让每一层的节点被从小到大遍历。n=mn =mn=m时,就是一棵树,题目中的字典序就是dfs序,直接每一层按从小到大搜索就可以。n=m+1n=m+1n=m+1时,这棵树中就形成了环,是一颗基环树。在有环的时候搜就会重复,那就每次删除一条边,删除后再搜索当前树的dfs序,如果发现dfs序比已经原创 2021-03-27 19:48:46 · 158 阅读 · 0 评论 -
2020ICPC上海站补题题解
M Gitignore去年比赛的时候还没用过git,被题意整懵了硬是看了巨久。然后场上的思路是模拟,结果码力太差没写出来,tcl。题意:gitignore,上传文件,n个路径是要删的,m个路径是不能删的,问最小删几个文件。思路:对于m个不能删的,把他所有的父目录都标注为1保护起来。然后再去遍历n个要删的,令ans=n,如果目录vis为0,说明没有被保护,并第一次出现,标注为2,碰到标注为2的,说明没被保护,且前面出现过,就可以合并,那么ans-1代码:#include<bits/stdc原创 2021-03-24 20:15:32 · 377 阅读 · 0 评论 -
美丽的路径 并查集,搜索,二分
链接:https://ac.nowcoder.com/acm/contest/9985/A思路:第k2+1\frac{k}{2}+12k+1小的数,那就是中位数,需要注意的是题目中没有说要是最短路,所以为了让美丽值最大,可以让这条路径在两个权值大的点之间反复行走。那么可以发现会有很多个美丽值,那么可以对答案进行二分,去找最大的那个。设当前美丽值为x,...原创 2021-03-22 20:28:58 · 136 阅读 · 1 评论 -
树形dp
总结一般来说树形dp在设状态转移方程时都可以用f[i][]f[i][]f[i][]表示i这颗子树怎么怎么样的最优解,实现时一般都是用子树更新父亲(即从下向上更新)。一般来说有两种情况:1.需要把所有子树的信息都掌握之后再更新子树的就需要把所有子树都算完了在更新父亲。2.像树上背包这样的问题就需要一个一个的更新,每次都用一个子树更新已经更新完的子树+父亲,最后就可以将这一部分的子树更新完了,再继续往上更新,最后根节点就是答案。第二种速度明显更快一点,但是第一种写法适合更多的情况,思维难度也要小不少。原创 2021-03-18 21:27:34 · 228 阅读 · 0 评论 -
2020ICPC南京站补题题解
菜鸡只写银牌以下的题铜牌4,银牌5K Co-prime Permutation题意:构造一个n长的1到n不重复序列p,其中pip_ipi和iii互质的个数有k个思路:已知:nnn和n−1n-1n−1互质,1和任何数互质,任何数和它本身不互质k要是奇数,1不变,后面的k−12\frac{k-1}{2}2k−1对数,两两换位k要是偶数,从1开始所有的k2\frac{k}{2}2k对数,两两换位代码:#include<bits/stdc++.h>#include<io原创 2021-03-15 21:02:46 · 1834 阅读 · 3 评论 -
2016ACM ECfinal补题题解
Problem E. Bet题意:赌钱,每个队都有对应的赔率,求最多能对多少个队下注,使得只要有一个队赢了就可以保证总是赚钱的。思路:这个题目中钱是未知的,所以设变量不能用钱,因为最后消不掉,设我对第iii队下注了一份钱,占下注总额的比例为pip_ipi,只有该队胜利,有1+BiAi∗1>1pi1+\frac{B_i}{A_i}*1 > \frac{1}{p_i}1+AiBi∗1>pi1,最后推出AiAi+Bi>pi\frac{A_i}{A_i+B_i} > p原创 2021-03-14 15:50:27 · 290 阅读 · 0 评论 -
codeforces 706 div2题解
A Split it!思路:翻转后看前k个连续是否相等,并且满足k∗2+1<=nk*2+1 <= nk∗2+1<=n代码:#include<bits/stdc++.h>#include<iostream>#include <stdio.h>using namespace std;const int maxn=200005;const int base=131;typedef long long ll;#define pi acos(原创 2021-03-11 20:31:50 · 388 阅读 · 0 评论 -
2017ACM EC Final 补题题解
M World Cup傻逼签到不多说代码#include<bits/stdc++.h>#include<iostream>#include <stdio.h>using namespace std;const int maxn=100005;const int base=131;typedef long long ll;#define pi acos(-1)#define INF 0x3f3f3f3f#define mod 998244353co原创 2021-03-08 16:01:47 · 428 阅读 · 2 评论 -
最短路
https://ac.nowcoder.com/acm/contest/12606/Hspfa时间复杂度O(ke), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2。优点:1.时间复杂度比普通的Dijkstra和Ford低。2.能够计算负权图问题。3.能够判断是否有负环 (即:每跑一圈,路径会减小,所以会一直循环跑下去)。算法思想:1.设立一个先进先出的队列用来保存待优化的结点。2.优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果原创 2021-03-07 22:32:49 · 508 阅读 · 2 评论 -
牛客寒假算法集训营第六场补题题解
第六场G机器人状压dp+__int128__int128精度比unsigned longlong 大,但是对于cin,cout,printf,scanf都不支持,输入输出模板如下:inline __int128 read(){//输入模板 __int128 x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }原创 2021-03-04 15:40:27 · 573 阅读 · 0 评论 -
离散化——unordered_map
学习一下unordered_map的用法,上海区域赛前才第一次见这个东西,看到和map用法一样自信觉得能用,然而场上卡住了,现在滚过来学一下orz【虽然事后发现G题根本不需要用这个东西例题:https://ac.nowcoder.com/acm/contest/5158/H明显并查集,但是1e9,这么大肯定离散化,那就用一下这个unordered_map代替并查集中的pre数组就ok#include<bits/stdc++.h>using namespace std;unordere原创 2021-01-04 22:19:40 · 622 阅读 · 0 评论 -
黑白树 牛客每日一题 树 dfs
链接:https://ac.nowcoder.com/acm/problem/13249一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1。树上每个节点i对应一个值k[i]。每个点都有一个颜色,初始的时候所有点都是白色的。你需要通过一系列操作使得最终每个点变成黑色。每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点都会变黑,已经是黑的点保持为黑。问最少使用几次操作能把整棵树变黑。输入描述:第一行一个整数n (1 ≤ n ≤ 10^原创 2020-10-08 17:59:03 · 711 阅读 · 0 评论 -
cf教育场69 D. Yet Another Subarray Problem dp
题目https://codeforces.com/gym/297792/problem/D题意:规定子序列【l,r】的花费为求出这个数组的最大花费。最初的思路:一开始采用的方法是定义一个node保存区间,求出每一个长度为l的区间的相加最大值,以及对应的左右端点,并保存到add数组中。用尺取的方法更新每一个add【i】。最后对于add中的每一个长度求出它的花费,取最大值即可。这种思路是正确的,但是很遗憾尺取的时间开销太大了,直接超时。错误代码如下:#include <bits/stdc++.原创 2020-10-04 21:04:30 · 230 阅读 · 0 评论 -
贪吃的大嘴 多重背包 dp
7-4 贪吃的大嘴 (15分)有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕.输入格式:先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数输出格式:输出一行包含一个整数表示大嘴最少需要原创 2020-10-03 15:46:01 · 270 阅读 · 1 评论 -
旅游 树形dp
题目:https://ac.nowcoder.com/acm/problem/15748Cwbc和XHRlyb生活在s市,这天他们打算一起出去旅游。旅行地图上有n个城市,它们之间通过n-1条道路联通。Cwbc和XHRlyb第一天会在s市住宿,并游览与它距离不超过1的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过1的所有城市。他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。XHRlyb想知道她与Cwbc最多能度过多少天的时光呢?聪明的你在仔细阅读题目后,一定可以顺利的原创 2020-09-17 13:37:42 · 507 阅读 · 0 评论 -
cf670 div2ABC题解
A Subset MexmexA和mexB的最大,其中必有一个原数组中第一个缺失的数,另一个数是剩下中第一个缺失的数。代码:#include <bits/stdc++.h>#include <algorithm>#include<iostream> using namespace std;typedef long long ll;int a[105];int vis[105]; int main(){ int t,n; cin>原创 2020-09-13 17:16:45 · 322 阅读 · 0 评论 -
比赛 每日一题 dfs dp
题目:https://ac.nowcoder.com/acm/problem/14734你在打比赛,这场比赛总共有12个题对于第i个题,你的队伍有a[i]的几率解决她如果解决不了她呢?由于所有人讨论的都很大声所以你有b[i]的概率从左边那个队那里听会这个题的做法有c[i]的概率从右边那个队那里听会这个题的做法请问最终你们队伍解出0-12题的概率分别是多少输入描述:第一行12个数表示a[1] -> a[12]第二行12个数表示b[1] -> b[12]第三行12个数表示c[1原创 2020-09-12 19:29:00 · 267 阅读 · 0 评论 -
每日一题 购物 dp
题目:https://ac.nowcoder.com/acm/problem/14526题目描述在遥远的东方,有一家糖果专卖店。这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元。现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖果,也可以选择不买糖果,但是最多买m个。(因为最多只生产m个)买来糖果以后,你可以选择吃掉糖果或者留着之后再吃。糖果不会过期,你需要保证这n天中每天你都能吃到至少一个糖果。这家店的老板看你经常去光顾这家店,感到原创 2020-09-06 19:00:02 · 273 阅读 · 0 评论 -
简单瞎搞题(状压dp bitset)
题目地址:https://ac.nowcoder.com/acm/problem/17193闲话:这个题目是一个状压dp,不过我的dp一向很垃圾,状压也没怎么练过,做的时候属实看不出来,看了别人的题解才会做。不过我现在也有了一些思考:当只有存在或不存在两种状态时我就可以联想到状态压缩了。对于这个题目其实到现在也不是特别懂了,还是有些不太明白的先记录下来。题解这个题目中最重要的就是bitset的运用。首先我们需要知道bitset是什么。bitset本质上可以看作是一个数组,不过每一位只能是0或1,即原创 2020-05-21 00:26:03 · 367 阅读 · 0 评论 -
HDU 2068 RPG的错排
HDU 2068 RPG的错排#include &lt;stdio.h&gt;#include &lt;iostream&gt;#include &lt;string.h&gt;#include &lt;math.h&gt;#include &lt;stdlib.h&gt;#include &lt;algori原创 2018-11-19 22:01:20 · 193 阅读 · 0 评论 -
二分法相关
浮点数的二分例题:题目描述告诉你圆台的高h,下地面半径R,和上底面半径r;你需要平行于地面切割圆台,使切割后的圆台上下两部分相等,输出切割平面的高度H(切割平面与“上”底面的距离)输入第一行一个t表示t组数据,每组数据三个整数h,R,r(t<=10;1<=r,R,h<=100)输出如题所述输出一个浮点数H(保留3位小数)样例输入27 17 912 13 10...原创 2018-11-20 16:54:17 · 214 阅读 · 0 评论 -
打表的一些操作
例题题目描述李浩杰大晚上不睡觉,问了我一个问题: N!是多少?我想了想,感觉和上周周赛的斐波那契有点像,于是就有了这个题目.输入输入一个T,表示T组数据 (1<=T<=100)接下来T行,每行输入一个整数N(0<=N<=1000000000)输出输出T行,每行输出一个正整数 N!的结果 (由于这个数比较大,所以输出N!对1e9+7取模的结果).样例输入...原创 2018-11-21 22:23:54 · 276 阅读 · 0 评论 -
dp m段连续区间和
【问题描述】----最大M子段和问题给定由 n个整数(可能为负整数)组成的序列a1,a2,a3,……,an,以及一个正整数 m,要求确定序列 a1,a2,a3,……,an的 m个不相交子段,使这m个子段的总和达到最大,求出最大和。用dp[i][j]来表示在前j个数中,以a[j]结尾并分为i段的最大和。dp[i][j]=max(dp[i-1][k]+a[j],dp[i][j-1]+a[j]) ...原创 2019-02-15 18:48:57 · 484 阅读 · 0 评论 -
PAT甲级1013
题目翻译:1013 城市之间的战争在战争中,所有的城市都通过高速公路连接在一起,这一点是至关重要的。如果一个城市被敌人占领了,那么所有连接这个城市的高速公路都会被封闭。我们必须马上知道为了使得余下的城市保持连接状态,我们是否需要修建其他的高速公路。给你一张城市地图,上面标识出了所有余下的高速公路,你需要快速说出需要修建的高速公路的数量。举个例子,如果我们有3座城市,2条高速公路分别连接ci...原创 2019-11-29 21:45:14 · 246 阅读 · 0 评论 -
状压dp入门 hdu1565
思路:将数字转化为2进制,表示每一行被选的数字的情况,首先预处理哪些数字是可以取得的合法状态,因为上下行之间没有公共边,可以通过这一条件知道合法状态满足右移或左移以为后&运算的和为0,将所有哥发的存入数组中。然后直接暴力三重循环,用数组f[i][j]表示前i行的第i行选取状态用j的二进制的表示的最大值,通过dp更新数组,最后得到结果。#include <bits/stdc++...原创 2020-01-11 20:59:55 · 259 阅读 · 0 评论 -
牛客练习赛58 矩阵消除游戏(贪心 01串枚举)
题目:https://ac.nowcoder.com/acm/contest/4090/Chttps://ac.nowcoder.com/acm/problem/blogs/200190雨巨的一篇题解,非常详细有用了这个题目是一个贪心不过它比一般的贪心稍微复杂一点,这个题目看到它的数据范围比较小,可以用暴力点的方法。首先一个知识点是:01串枚举所谓01串枚举,就是我们在每个个体都面对两种...原创 2020-03-02 22:20:26 · 418 阅读 · 0 评论 -
牛客寒假算法基础集训营5 牛牛战队的训练地(三分)
题目:https://ac.nowcoder.com/acm/contest/3006/B参考题解:https://ac.nowcoder.com/acm/problem/blogs/201956三分法参考博客:https://blog.csdn.net/beiyouyu/article/details/7875480?depth_1-utm_source=distribute.pc_rele...原创 2020-03-10 11:39:18 · 301 阅读 · 0 评论