合集-模拟
摘要:原题链接 题解 细节很多的树形dp,请看代码 code #define ll long long #include<bits/stdc++.h> using namespace std; ll sit[100005]={0}; ll f[100005]={0}; vector<ll> G[10000
阅读全文
摘要:原题链接 题解 一开始我想的是每个节点要么建,要么不建,可是这样一来不好转移,因为有如下情况(黑色代表建站) 于是我们换一个角度思考,我们发现一个点要能通网,有三种情况: 1.自己建站 2.儿子建站 3.父亲建站 Code #define ll long long #include<bits/std
阅读全文
摘要:原题链接 题解 由于执行收获操作后所有数组清零,清零后的数组最快捷的加分方法是加一收获一,所以就是第一次加多少次 然后第一次加完最多收获 \(n\) 分,相当于清零后执行总共 \(2n\) 次 所以只需要判断第一次加 &[0,2n-1]& 次加后收获时能收获多少就行了 code,注意细节 #incl
阅读全文
摘要:原题链接 题解 这种让来让去让我想到了二分图!! 注意细节!!剩余的就是模拟了 code #include<bits/stdc++.h> using namespace std; int stu[55],gohome[55],know[55][55]; int n; int belong[55]={
阅读全文
摘要:原题链接 题解 请看清楚题目再下手!! 每次都可以且必须派 \([1,m]\) 条船,然后计算每次任务的最大值,最后求和 code #include<bits/stdc++.h> using namespace std; #define ll long long int main() { ll n,
阅读全文
摘要:原题链接 题解 一道搜索+模拟 搜索每一位可以放哪个值(\([0,9]\)),然后累加搜索下一位 注意细节 code #include<bits/stdc++.h> using namespace std; #define ll long long ll f[10][105]={0}; ll n,k
阅读全文
摘要:原题链接 题解 太巧妙了!! code #include<bits/stdc++.h> using namespace std; int main() { int n,w; cin>>n>>w; int score[605]={0}; for(int i=1;i<=n;i++) { int x; c
阅读全文
摘要:原题链接 题解 直接插在它后面,这种数据结构是链表 赛时明明想到了链表,但是写的一团糟。。 对于链表,最简单的就是用map了 code #include<bits/stdc++.h> using namespace std; int a[200005]; map<int,int> head,to;
阅读全文
摘要:原题链接 题解 话说dalao们是怎么做这么快的?? 问从含有字符串的背包中取出一些字符串(每个背包只能娶一个),问能拼凑出给定字符串的最小代价 由于这里的拼凑是有顺序的,即如果b能拼上的是中间一块,那么a一定拼的是前边一块,这种拼凑让人想到了背包 这里是字符串的背包,其实是一样的,先判断能不能放进
阅读全文
摘要:原题链接 题解 得分有哪些条件?颜色相同,下标同奇或同偶, 由此我们对数进行sort分类,把颜色相同的放一起,然后颜色内部按下标小到大排 然后就是很关键的分数计算公式 \((x + z) \times (\text{number}_x + \text{number}_z).\) 可以分解为 \(\t
阅读全文
摘要:原题链接 题解 把覆盖的区域变成黑色,然后在区域内划几条竖线,一定能分成若干个矩形左右拼接而成的图形 想象一条竖着的线,它的运动轨迹是不连续的,即他会从一个矩形的竖边跳到另一个矩形的竖边,每跳一条竖边都会对借着竖边归属的矩形的信息对这条竖边的激活块进行修改 当竖线的绝对位置发生移动时,计算激活区间产
阅读全文
摘要:原题链接 题解 原题可以理解为 \(\to\) 找出含有最小边权的边双连通分量,然后找出那个边对应的两个节点的第二条路 本题我学会了: 1.代码命名风格要含义清晰,不然很容易搞混,包括变量,自定义函数 2.建边的时候尽量用链表式,因为dalao都在用,看题解方便一点 code #define ll
阅读全文
摘要:原题链接 题解 已知对于一个长度为 \(n\) 的连续+1型上升序列而言,其满足要求的子序列有\(2^n\)个 若我们在该序列下标为 \(k\) 的右边插入一个绝对大于左边,绝对小于右边的数,满足要求的子序列会增加 \(2^k\) 个 由此想到极限构造加二进制,其中最高位的一不用管,其余的每一位生成
阅读全文
摘要:原题链接 题解 深搜带上 \(sum_a\) ,然后把经过的 \(sum_b\) 放入栈里, 二分查找 code #define ll long long #include<bits/stdc++.h> using namespace std; inline void read(ll &x) { x
阅读全文
摘要:原题链接 题解 最大值最小 \(\to\) 二分可行性判断: 二分间断值 \(len\ \to\) 如果原序列 \(a_i-a_{i-1}>len\) \(\to\) 双指针判断有没有 \(b+f\) 使得 \(a_i-len<=b+f<=a_{i-1}+len\) 由于只能使用一次,所以若使用两次
阅读全文
摘要:原题链接 题解 叉积的运用,scanf控制输入格式 code #include<bits/stdc++.h> using namespace std; struct node { int x,y; }a[100005]; int x[200005],y[200005]; int main() { f
阅读全文
摘要:原题链接 题解 考虑以下决策,绝对最优: 1.按巧克力块的大小排序,先把大的块分出来。 2.一开始完整的巧克力是块矩形,取出一个正方形后,可以分为下方和右侧两个矩形,然后把这两个矩形放入优先队列。 3.分割下一个矩形时,从队列中取出 最短边最长的那个矩形,在这个矩形上做步骤2一样的分割 为什么这样的
阅读全文
摘要:原题链接 题解 1.模拟+贪心,我们一个一个点添加,一层一层遍历,每个节点对当前层的接口数的贡献是-1 如果是节点2,对下一层接口数贡献为2,节点1贡献为1 如果当前层接口数用完了就下一层,初始值层0设为1 在时间复杂度合理的情况下无所不用其极 code #include<bits/stdc++.h
阅读全文
摘要:原题链接 题解 1.模拟题,注意细节 2.时间复杂度 \(O(n·sqrt(n))\) code #include<bits/stdc++.h> using namespace std; int n; string s; int check(int len) { int flag=0; for(in
阅读全文
摘要:原题链接 题解 1.最短路径一定可以表示成经过若干端点的线段,所以我们把端点单独提出来,这样就变成了计算几何形式的最短路 2.如果两个端点能相连,代表他们之间没有墙阻挡 code #include<bits/stdc++.h> using namespace std; int n; struct {
阅读全文
摘要:原题链接 题解 1.小模拟+树上差分+lca code #include<bits/stdc++.h> using namespace std; int a[300006]={0}; vector<int> G[300005]; int depth[500005]={0}; int fa[50000
阅读全文
摘要:原题链接 题解 模拟,遍历n个物品,一开始一个箱子不给,遍历到某个物品时,先把所有已经给了的箱子放进去试试,再创一个新箱子放进去试试 code #include<bits/stdc++.h> using namespace std; int n,w; int cnt,ans; int chongdi
阅读全文
摘要:原题链接 题解 朝合力方向位移一段距离,并逐渐减小这个位移距离,需要痛苦的调参 code #include<bits/stdc++.h> using namespace std; double x=0,y=0; struct node { double x,y,w; }pos[1005]; int
阅读全文
摘要:原题链接 题解 令 \(f(x)\) 代表所有课的发布时间都小于等于x时的不愉快值之和,x越小,AB消耗越大,x越大,C消耗越大,所以感性的想象 \(f(x)\) 是一个下凹函数 然后就可以快乐三分了 code #define ll unsigned long long #include<bits/
阅读全文
摘要:原题链接 题解 明确每个变量的意义 code #include<bits/stdc++.h> #define ll long long using namespace std; ll a[200005]; int main() { ll t; cin>>t; while(t--) { map<ll,
阅读全文
摘要:原题链接 题解 巧妙模拟题 1.\(n\leq 5000\) 所以可以暴力枚举k 2.把翻转的区间具象化,我们可以发现序列中值为 1 的地方覆盖了偶数个区间, 0 的地方覆盖率奇数个区间 所以我们遍历字符串的时候,在遇到的第一个0开始建立以其为左端点的区间,如果遇到 1 的区间覆盖数为奇数,那就再建
阅读全文
摘要:原题链接 题解 每一个任务都有一个最小起点能力值,和通过任务后获得的能力值,我们从最小起点开始遍历,如果遍历到某一点累加的能力值+最小起点能力值够不到当前任务的最小能力值,我们把最小起点向右移动直至够到当前任务的最小能力值。 code #include<bits/stdc++.h> using na
阅读全文
摘要:原题链接 题解 不仅要学会怎么打cf,还要学会怎么解决问题:把条件写下来,对着条件写,然后对着程序在脑海中充分模拟 code #include<bits/stdc++.h> using namespace std; char s[20005]; int main() { int t; cin>>t;
阅读全文
摘要:原题链接 题解 设 \(a,b,c,d\) 分别为 \(1,2,3,4\) 的个数 则对第一位贡献 \(a+c\) 个1 对第二位的贡献为 \(b+c\) 个1 对第三位的贡献为 \(d\) 个1 根据异或原理,奇数个一异或还是一,偶数个一异或是零 所以 \(a,b,c\) 同号, \(d\) 是偶
阅读全文
摘要:原题链接 题解 假如一开始是一个完全单调递增函数,那么没有任何链接,这时我们交换两个数 \(i,j\),则 \([i,j]\) 成了一个连通块,这时我们再取出 \([i+1,j]\) 内的元素与 \(l,l \in[j+1,n]\) 交换,则 \([j,l]\)成了一个连通块 所以 \([i,l]\
阅读全文
摘要:原题链接 题解 设想每一个 \(x,y\) 代表中控台,中控台颜色改变它控制的颜色也会跟着改变,我们倒过来求,这样就能确保每个中控台有没有控制的颜色 code #define ll long long #include<bits/stdc++.h> using namespace std; cons
阅读全文
摘要:原题链接 题解 具体想 \(a\) 是如何一步一步变成 \(b\) 是很复杂的,所以我们换个角度思考(比如贡献) 遍历每一个 \(a[i]\) 看看他们能帮助哪些 \(a[j]\) 变成 \(b[j]\) 而且不妨碍 \((i,j)\) 中 \(a\) 的元素,用数学语言表达就是 \(use[j]=
阅读全文
摘要:原题链接 题解 1.突然遇到新颖的题,我们可以采用逐步变难法、最简策略法、观察数据法 逐步变难法: 当 \(k=0\) 时, \(ans_0=min(a[i])\) \(k=1\) 时 \(ans_1=min(ans_0,a[i]-a[i+1](sort))\) 观察数据法: \(k=2\) 时 观
阅读全文
摘要:原题链接 题解 只需要存在两个叶子节点之间距离等于d就好了,于是我们构造一条链,令节点一为滑动变阻器,则根据d改变与节点n的距离即可 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while
阅读全文
摘要:原题链接 题解 1.最小数在操作之前是第一位,操作之后也必然是第一位,这就导致了如果原数组最小数后的数遍历不到,如果非有序就真的没法有序了,否则每个数都刚好大于前面一个数一定有序 code #include<bits/stdc++.h> using namespace std; int a[2000
阅读全文
摘要:原题链接 题解 本题虽然有思维题做法,但是我认为不具有普世意义,本题的特点在于分治法,即普通算法在平均条件下表现良好,但是在极端条件下极慢,这时候我们需要将极端条件拎出来另做判断 code #include<bits/stdc++.h> #define ll long long using name
阅读全文
摘要:原题链接 题解 本题的优化真的很重要!! 把所有元素出现的下标用map套vector存起来,然后二分查找 code #include<bits/stdc++.h> using namespace std; map<int,vector<int> > mp; int main() { ios::syn
阅读全文
摘要:原题链接 题解 找出右端点大于等于当前区间的左端点且左端点小于等于当前区间的右端点的所有区间,由于查询前这样的区间具有单调性,所以可以用二分,但是怎么快速删除呢? 欸stl大法来了,用set存储区间,查找和删除和添加都是 \(logn\) 级的 code #include<bits/stdc++.h
阅读全文
摘要:原题链接 题解 确定起点和终点,求救援人数最长,路径最短的路径,只需要集群算法中优先队列中重载比较符修改一下就就行,由于数据量很小,所以输出路径的时候搜索就行(最优解唯一) code #include<bits/stdc++.h> using namespace std; struct node {
阅读全文
摘要:原题链接 题解 把不需要删的放一边,需要删的放一边,大模拟题,注意结尾特判(为什么?想象极限条件) code #include<bits/stdc++.h> using namespace std; struct node { int val,next; }chain[100005]; int vi
阅读全文
摘要:原题链接 题解 复杂图论题做多了这种题不会做了 直接模拟即可,标记被摧毁的城市,然后遍历所有城市,能一次性搜索到的城市是一个城市群,累积有几个城市群 code #include<bits/stdc++.h> using namespace std; vector<int> G[505]; int v
阅读全文
摘要:原题链接 题解 1.后面的列车排到前面最小的比自己大的列车后面 code #include<bits/stdc++.h> using namespace std; int len=0; int a[100005]={0}; int main() { int n; cin>>n; fill(a, a
阅读全文
摘要:原题链接 题解 找到终点,然后终点往前移,起点往后移,奇数时输出终点所在位置..直到起点终点重合,这时输出尾节点是-1 code #include<bits/stdc++.h> using namespace std; struct node { int data,next,from; }a[100
阅读全文
摘要:原题链接 题解 说用k种颜色, 没说用少于k种 code #include<bits/stdc++.h> using namespace std; vector<int> G[505]; int vis[505]={0}; int color[505]={0}; int v,e,k,n; int s
阅读全文
摘要:原题链接 题解 1.把输出直接看成一个向量整体存在map里 2.如果两个向量 \(a>b\) 代表a的字典序比b大 code #include<bits/stdc++.h> using namespace std; int vis[100005]={0}; int dlx[100005]={0};
阅读全文
摘要:原题链接 题解 1.身份证号长度必须为18,且均为数字 2.如果申请人身份证合法,且身体状况为1,就把他放进ans2,(申请顺序) 3.身份证一定不同,姓名可能相同 4.得到口罩的输出是发放顺序 code #include<bits/stdc++.h> using namespace std; ma
阅读全文
摘要:原题链接 \(code\) #include<bits/stdc++.h> using namespace std; int dis[105][105]; int xx[4]={1,0,-1,0},yy[4]={0,1,0,-1}; int a[105][105]; int vis[105][105
阅读全文
摘要:原题链接 题解 被自己蠢哭了 没思路的时候先暴力想想看,暴力思路怎样?按输入顺序遍历仓库,然后再来一个循环,找到第一个大于自己的仓库,怎么找?循环找呗 时间复杂度 \(1e^7\) 貌似可以 code #include<bits/stdc++.h> using namespace std; stru
阅读全文
摘要:原题链接 题解 暴力。 知识点 : \(exp(x)\) 返回 \(e^x\) 如果这里先把所有的素数求出来的话,也要 \(n·\sqrt{n}\) 也就是 \(1e^{15}\) ,所以直接遍历就好了 code #include<bits/stdc++.h> #define ll long lon
阅读全文
摘要:原题链接 题解 1.题目对 \(i,j\) 没有限制,也就是说,i可以大于j,可以小于j,也可以等于j 2.找普适规律。不管谁和谁成功配对,要么两个数长度相等;要么前面的数长度大于后面的数,于是前面的数分后半部分出来;要么后面的数大于前面的数,于是后面的数分前半部分出来; code #include
阅读全文
摘要:原题链接 题解 从小正方形到大正方形,有四个变化方向,分别是左上、右上、右下、左上。 分类讨论模拟即可 code #include<bits/stdc++.h> using namespace std; int main() { int n,x,y; cin>>n>>x>>y; puts("Yes"
阅读全文
摘要:原题链接 题解 我一开始想着二位前缀和+模拟,但是看到ab发现空间不够 观察到nm的数据范围限制 也就是点和查询的数量限制,考虑用优先队列把各个方向的点存起来以表示各个点的使用顺序,再用map嵌套表示各个点的使用情况 空间复杂度 \(O(n)\) 时间复杂度 \(O(T(mlogn+nlogn))\
阅读全文
摘要:原题链接 题解 1.缺少一个前缀和,缺少在哪了? 如果缺少在 \(i<n\) 的地方,则会出现一个两个数之和,即缺少两个数 否则会只缺少一个数 2.两个数之和可能大于 \(n\),也可能不 3.虽然 \(a_i\) 达到了 \(1e18\) 但是 \(n \leq 2e5\) ,所以可以用数组记录出
阅读全文
摘要:原题链接 题解 先随便找一条直径,然后标记这些边,然后看看直径上的点有没有不需要经过标记边的路径,使得其长度等于该点到直径端点的路径长度 code #include<bits/stdc++.h> #define ll long long using namespace std; struct edg
阅读全文

浙公网安备 33010602011771号