11 2020 档案
摘要:经典套路,离线枚举右端点计算左端点。感觉这种题都已经出烂了 首先我们观察到,对于一个右端点i来说,合法的一定是一段区间,也就是最大值是k-k+1的区间,因此我们对每个种类维护一个队列 这样可以计算到达k和k+1的信息,并维护合法区间。 之后就是线段树插入和查询了,插入就是对于我们枚举的右端点,去插入
阅读全文
摘要:挺有意思的一道概率题 首先总方案数是已知的,因此就是求取合法方案 我们分析题目,发现1-n要被覆盖,且每个点只能被覆盖一次 这说明这题就是把整条线段分成奇数和的种类数 这种题一般都是dp题,要不就是组合数学大佬秒的 考虑一下暴力的dp,就是枚举前面合法状态去更新,并且要-1,-3这种因为我们要保证最
阅读全文
摘要:强制在线,那就看看能不能套一些数据结构上去,发现这是个分段函数 我们要求的又是一段区间内的值,因此分两点考虑 区间值是否可以通过前缀和查询,在这个基础上,如何维护前缀和信息。 考虑使用主席树来维护区间,那么在做每个点的时候,我们发现这是一段分段函数,也就是对于值域来说,可以差分的维护信息,这样只要求
阅读全文
摘要:经典套路题,发现l,r都在变,因此枚举r,找到最小的l即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,int> pll; typedef pair<int,int> plll;
阅读全文
摘要:首先我们发现每两个点会构成一对,他们公用一条边,且边集不能共用任何一个点 如果我们可以找到这样的边集使得所有点都被选中,那么bob是必赢的,否则是必输的 原因是,我们对于每个点都能找到一个对应匹配的点,不论alice选什么,bob都有的选,直到alice选不到 那么反之alice必胜,因为alice
阅读全文
摘要:观察到询问的个数还能接受,我们考虑使用分块办法来维护答案 对于每次更新,边界块暴力,中间块维护整块信息,我们对每个块维护一个mi,表示对整块取min的值 更新的时候,整块只用维护min值,边界块需要更新并且重新排序,因为并不是所有的点都被改变。 询问的时候采取二分check,check的方法也是如此
阅读全文
摘要:暴力二分答案即可获得正解,注意边界问题 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,int> pll; const int N=1e6+10; ll n,m,k; ll a[N]
阅读全文
摘要:这种题一般都是算贡献,对于这题,我们显然发现,每个点作为最大值肯定是有一定范围的。 因此我们考虑将点排序,计算每个点作为最大值的答案。 枚举每个点,之后遍历他的邻边,如果有之前被标记过的点,说明他是最大值,因此用并查集维护后,计算集合乘积即可 #include<bits/stdc++.h> usin
阅读全文
摘要:本题因为设计到区间到区间的连边,因此使用线段树优化建图 原理就是用out树和in树,一棵儿子向父亲连边,一棵父亲向儿子连边,然后叶子和叶子连边,对于两个区间的连边,用一个附加节点来表示连接。 建树使用动态开点,但是本题的内存需要计算,不然就会出现开大mle,小则re的尴尬情况 建完图后就是跑一下最短
阅读全文
摘要:类似的贪心思路,肯定找是通过这个点能到的最远的点,这样是最优的。 但是询问次数很多,因此考虑用倍增思想,直接求出每个点通过2^i个边能到的最远点。 这是因为最后的答案一定是最小通过x条边,并且这个x一定能被二进制表示出来 #include<bits/stdc++.h> using namespace
阅读全文
摘要:因为存在凹形,因此枚举点的时候注意一下内部是否有点,如果有点则不可分割,其他就是多边形的分割 #include <bits/stdc++.h> #define LL long long using namespace std; double f[105][105]; struct point{ do
阅读全文
摘要:园方树+树链剖分 这题首先容易得到的性质是,一个点双内的所有点互相到达,这就说明这个点双的答案就是他们中的最小值,因此建立园方树。方点就维护了最值 现在有修改问题,对于一个圆点的修改,势必要影响到方点,我们对每个方点维护一个multiset,这样对于每个圆点的修改,都是对他的父亲方点进行修改,这样可
阅读全文
摘要:本来是一道最小生成树的问题,但是因为边数过多,因此考虑优化 观察到这是区间信息,可以联想到使用倍增算法,将区间变成2进制,从大长度不断往下,每一层做一下最小生成树,目的是排除一些不需要的连边。用队列保存有用的 这样到0的时候做的最小生成树就是答案。这样的复杂度保证是,我们只会做log层,并且每层的队
阅读全文
摘要:对于每个帮派求他们的lca,对于每个询问,先将所含的所有帮派求lca,将这个和当前首都比较,如果首都不在最高点的lca的子树当中,那么他的答案就是这个最高点lca和首都的距离 如果在这个子树下,那么只需要求取dfs序在首都前后的两个点求一个min即可。 分析这道题目,我们想到lca的原因是,这里有树
阅读全文
摘要:有一些常见的模型转换,对于求恰好类型的题目 可以通过转化成不大于的形式。 对于这题,我们转化成不大于的情况后,可以利用容斥原理求出答案 我们定义为用不大于k种颜色染色 这样通过容斥原理就能求出恰好是k的答案。 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:有很多模式串,请求构造一个长度为n的串,使得给定的串不是构造串的子串。 如何判断是否为子串,可以考虑建立ac自动机,这样在跑ac自动机的时候就知道是否构造出现子串情况。 在构造的时候,我们最希望的就是遇到环,这样只要循环走就行。 因此我们考虑记忆化预处理从每个点能走的最长距离,如果遇到环直接将长度置
阅读全文
摘要:对于询问离线,我们询问的是数对,并且所有的数字都是不同的,因此可以将数对的贡献放在位置靠前的位置 这样就是按照r排序,之后遍历每个位置计算答案,为了避免之后当前r之后的信息干扰到目前答案的计算,我们枚举倍数的时候,如果这个数在当前位置i之后,那么就先将他保存 如果在之前,就直接用树状数组维护。这样我
阅读全文
摘要:因为区间修改,可以联想到差分上面去。 因为都是从前往后的一段和从后往前的一段,如果当前位置比前面位置要大,那么一定要从后往前操作差值大小次数 这样我们计算出必须要操作的次数后,不断在过程中判断是否非法,也就是操作次数是否超过当前值的大小 最后如果符合那就是yes #include<bits/stdc
阅读全文
摘要:因为是dag,所以常规做法就是dfs,从出度为0的点不断返回 我们设计f[i],表示从i开始到终点的期望天数 刚开始到i需要一天,在i需要游玩一天,再游玩一天有(du[i]+1)的可能性,这是初始化的情况 之后就是从他的后继节点更新过来。 #include<bits/stdc++.h> using
阅读全文
摘要:一般的博弈论都有必败态和必胜态,都是遇到某个状态发现是已经被决定的。 对于这题,先观察特殊状态,因为题目是个有向图,所以所有出度为0的点都是有特定状态的,因为他没有路可以走 我们设状态为f[i][j],表示在i这个点,是j行动,我们假定初始态是-1,表示平局,0表示A赢,1表示B赢,b[i]表示某人
阅读全文
摘要:这题就是每次维护一条链上的信息,如果普通暴力,那么复杂度会超,但是我们观察到m只有2e3,每次只有两个点,因此我们把所有可能操作的点以及他们的lca全部保留下来 新建成一棵虚树,就能维护所有的信息,并且所有的点不会超过8000,也就是说每次最多操作8e3的点,最多有2e3次的操作,所以相乘不会超时。
阅读全文
摘要:B题 暴力题,通过维护数组表示在i位置能够取到数的大小 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; int l[N]; vector<int> num[N]; int a
阅读全文

浙公网安备 33010602011771号