07 2018 档案
摘要:Link: BZOJ 3196 传送门 Solution: 最直观的的思路是用线段树套平衡树 不过一看到区间第$k$大就又忍不住去写最近刚练的带修改主席树了 感觉自己数据结构题灵活变通的能力还不够强啊,一开始$naive$得觉得不好算排名…… 区间第$k$大和修改的操作和$Dynamic Ranki
阅读全文
摘要:Link: BZOJ 1058 传送门 Solution: 为了这道题今天下午一直都在和常数大战…… 1、对于询问1,我们记录每个数末位置的数$T[i]$和初始位置$S[i]$ 用平衡树维护所有差值,对于操作$i,k$:删除$S[i+1]-T[i]$,增加$x-T[i]$和$x-S[i+1]$ 2、
阅读全文
摘要:Link: P3709 传送门 Solution: lxl出的语文题 其实转化一下就是求将当前区间最少拆分成多少个严格单调上升序列(可不连续) 再转化一下就是求区间内的众数个数 本来求众数的套路是主席树+二分 但此题不要求在线,用莫队同时维护$i$的出现次数$cnt[i]$和出现次数为$i$的数的个
阅读全文
摘要:Link: BZOJ 3781 传送门 Solution: 莫队裸题,只不过把维护的值改成了$\sum cnt[i]^2$ Code:
阅读全文
摘要:Link: BZOJ 1878 传送门 Solution: 很久以前这道题我是用$BIT$过的 思路非常简单:离线将询问排序,记录每个点同一颜色的后继节点 随着询问左边界的递增,将处于两次左边界间的节点从$BIT$中删去,而加入其后继节点的位置 接下来统计处于$[l,r]$间的数的个数就好了 同时这
阅读全文
摘要:Link: BZOJ 3932 传送门 Solution: 一道比较基础的数据结构题吧,然而一开始我想的还是两个$log$…… 明显看出我们是要对每一个时刻$x$维护各个权值区间内数的个数及数的和,主席树的经典模型 在一开始建树时可以使用前缀数组差分的方式: 对于任务$(l,r,x)$,修改$<l,
阅读全文
摘要:Link: BZOJ 3123 传送门 Solution: 主席树+启发式合并 以前好像做的主席树都是在序列上的……在树上的主席树这样处理: 每个节点的主席树维护其到根节点的路径上的值,以其父节点为模板构造 那么为了取出$(u,v)$路径上的值用$seg[x]+seg[y]-seg[lca]-seg
阅读全文
摘要:Link: BZOJ 3295 传送门 Solution: 虽说这是道$cdq$分治的基础题,但既然在练数据结构就用主席树写吧 (其实是我$cdq$分治没学好) 首先可以通过树状数组求出总的逆序对对数和每个数能组成的对数$cnt[i]=pre[i]+suf[i]$ 接下来如果删除了第$i$位,最多删
阅读全文
摘要:Link: BZOJ 1901 传送门 Solution: 带修改主席树的模板题 对于静态区间第$k$大直接上主席树就行了 但加上修改后会发现修改时复杂度不满足要求了: 去掉/增加第$i$位上的值时要更新$i...n$间所有的主席树,使得单次修改的复杂度达到$n*log(n)$ 可以将原来的主席树看
阅读全文
摘要:Link: BZOJ 3140 传送门 Solution: 挺好的一道暴力题 首先发现可以每次贪心选择宽度为1的一面,即$1*x*y,1*x*z,1*y*z$ 那么对于与该面垂直的面,相当于解决了一行/一列 于是我们可以先考虑一个二维问题: 每次选取一行/一列要耗费一个代价,询问要覆盖所有染色点需要
阅读全文
摘要:Link: P1273 传送门 Solution: 比较裸的树形$dp$ 令$dp[i][j]$表示以$i$为根的子树中选$j$个叶子的最小代价 最后找到使得$dp[1][k]\ge 0$的最大$k$即可 Code:
阅读全文
摘要:Link: BZOJ 1562 传送门 Solution: 一道比较考对$Hungry$算法理解的题目 首先可以轻松看出原序列和答案序列的对应关系,从而建出二分图匹配模型 下面的关键在于如何保证字典序最小 第一种方式是暴力逐位确定: 对于$1....n$每一位都先贪心选取字典序小的节点,判断将该边除
阅读全文
摘要:Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能连几条边 接下来将合法边连上跑二分图匹配就好了 Tip:二分图匹配时分清$X,Y$集合以及$matc
阅读全文
摘要:Link: BZOJ 1059 传送门 Solution: 可以发现其实只要保证每行每列刚好只有一个就能确保构造出解 于是建立列集合与行集合的对应直接跑二分图匹配即可 Code:
阅读全文
摘要:Link: P1640 传送门 Solution: 可以发现这道题其实是属性值集合和装备集合的对应,且每个点只能用一次 那么就能想到二分图最大匹配,一旦不可行直接退出就行了 Tip: 1、$Hungry$算法连有向边就行了…… 2、注意左右两个集合范围不同! Code:
阅读全文
摘要:Link: P2219 传送门 Solution: 先对每个点算出以$(i,j)$为矩形右下角时的权值和 问题就转化为对于以$(i,j)$为右下角的$a*b$的矩形中的最小值 这时模型和 [BZOJ 1047]理想的正方形 就基本相同了,做两次单调队列就好了 Tip: 1、$c*d$处于$a*b$边
阅读全文
摘要:Link: BZOJ 1861 传送门 Solution: 一道平衡树裸题调了两小时真是** 操作都比较常规: 1、$Top,Bottom$操作 先将$x$转到根节点,分情况讨论将其左/右子树合并到另一边去 2、$Insert$操作 其实完全没有必要先删除再插入,直接将$x$与其前驱/后继的信息交换
阅读全文
摘要:记录下一开始写错的两道水题 E: 先建出直径,然后在保证直径不变的情况下按照最大度数贪心就好了 注意一下一开始的特判 #include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef pair
阅读全文
摘要:Link: BZOJ 3223 传送门 Solution: $Splay$对序列操作的模板题 核心思想就是将$L-1$移到根,$R+1$移至$L-1$的下方,从而约束出区间$[L,R]$进行操作 对于此题仅要求将区间翻转,因此只要将左右子树交换即可 但同时类似于线段树要打上懒惰标记来保证复杂度,每次
阅读全文
摘要:Link: P2698 传送门 Solution: 对于可行区间$[L,R]$,随着$L$的递增$R$不会递减 因此可以使用尺取法来解决此题:不断向右移动左右指针,复杂度保持线性 同时为了维护区间内的最值,要设立两个单调队列来维护最大/最小值 每次当$L$增加时,要从队列头部删去小于$L$的节点(如
阅读全文
摘要:Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,res=0; int dgt[15],cnt; void dfs(int dep,ll su
阅读全文
摘要:Link: BZOJ 1855 传送门 Solution: 比较明显的$dp$模型 令$dp[i][j]$为第$i$天持有$j$支股票时的最大利润 对其购买股票和售出股票分别$dp$,这里以购买为例: $dp[i][j]=max\{ dp[lst][k]-ap*(j-k)\}$ 发现可以将递归式转化
阅读全文
摘要:Link: BZOJ 1076 传送门 Solution: 数据范围就是题解 能比较明显看出是一道期望+状压的题目 一开始想正向推公式,结果发现每一阶段的答案并不符合后项无关性…… 其实在题面中就有所提示,当前的最优解并不一定是总的最优解 这种情况下可以考虑反向$dp$来保证最优解 其中$dp[i]
阅读全文
摘要:Link: BZOJ 2298 传送门 Solution: 可以将每个人的话转化为$[l[i],r[i]]$的人得分相同 用$map$记录认为$[i,j]$相同的人数,$pos[i][j]$记录以$i$为右边界的左边界的可能取值 令$dp[i]$表示前$i$名中说真话的最多人数, 那么$dp[i]=
阅读全文
摘要:Link: BZOJ 3326 传送门 Solution: 明显是一道数位$dp$的题目,就是递推式复杂了点 先要求出一个数$\bar{n}$向添加一位后的$\bar{np}$的转化关系 令$res[\bar{n}]$为数$n$的权值和, 则$res[\bar{np}]=res[\bar{n}]+\
阅读全文
摘要:1、Splay (Tyvj1728) #include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10,INF=1<<30; int n,op,x,root,ch[MAXN][2],sz[MAXN],cnt[MAXN],val[M
阅读全文
摘要:Link: BZOJ 2427 传送门 Solution: 只看样例的话会以为是裸的树形$dp$…… 但实际上题目并没有说明恰好仅有一个物品没有依赖项 因此原图可能由是由多棵树与多个图组成的 先跑一遍$tarjan$求出每个图中的$SCC$,缩点将原图转化为森林 再设置一个根,将森林转换成一棵树$d
阅读全文
摘要:Link: BZOJ 3675 传送门 Solution: 首先要注意到结果与分割的顺序无关,只与最终状态有关 实际上$res=\sum_{i,j\le k+1} a[i]*a[j]$ 可再转化为$res=\sum_{i=1}^n a[i]*sum[i-1]$ 令$dp[i][j]$表示将前$j$个
阅读全文
摘要:Link: AGC004 传送门 A: …… #include <bits/stdc++.h> using namespace std; long long a,b,c; int main() { scanf("%lld%lld%lld",&a,&b,&c); if(a%2==0||b%2==0||
阅读全文
摘要:Link: P2831 传送门 Solution: 其实是一道裸爆搜都能过的题目…… 看到$n\le 18$想到状压$dp$ 令$dp[i]$,表示达到当前状态的最小代价 可以发现只要两个点就能确定一条从原点出发的抛物线 因此每次对于一个特定的状态枚举两点确定抛物线转移就好了 $O(n^3)$预处理
阅读全文
摘要:Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/"eraser"的前缀) #include <bits/stdc++.h> using namespace std; string s; i
阅读全文
摘要:Link: P3806 传送门 Solution: 询问树上是否存在两点间的距离为$k$,共有$m$次询问($m\le 100,k\le 1e7$) 预处理出所有距离的可能性再$O(1)$出解的复杂度为$O(n^2*log(n))$,明显TLE(但好像并不会) 而如果直接在线处理要分治$m$次,找$
阅读全文
摘要:Link: POJ 1741 传送门 Solution: 此题的难点在于点分治上的统计 如果依然采取每棵子树的结果与之前所有子树的结果合并的方式会比较麻烦 同时复杂度可能超过$O(n*log(n))$的限制 其实可以用一个简单的容斥来在$O(n*log(n))$统计结果: 先将所有点到重心的距离排序
阅读全文
摘要:Link: BZOJ 2152 传送门 Solution: 直接上点分治就行了(其实也可以树形$dp$) 其中对于穿过重心的边的统计类似于树形$dp$的计算方式: 将当前子树中模3分别为0/1/2的边与之前所有子树产生的边进行组合 Code:
阅读全文
摘要:Link: ARC064 传送门 C: 贪心+对边界的特殊处理 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; ll res=0; int n,x,dat[MAXN]
阅读全文
摘要:Link: BZOJ 4034 传送门 Solution: 树剖模板题…… Code:
阅读全文
摘要:Link: BZOJ 2111 传送门 Solution: 小根堆的模型还是很容易能看出来的 利用树形$dp$统计方案数:$dp[i]=dp[lc]*dp[rc]*C[sz[i]-1][sz[lc]]$ (小根堆的个数只受序列中数的大小关系影响,与其差值无关,因此每一个组合产生相同的个数) 其中组合
阅读全文
摘要:Link: BZOJ 2425 传送门 Solution: 其实就是利用数位$dp$的思想来暴力计数的一道题目 如果答案有$dgt$位,可以类似 [BZOJ 1833] 先计算出1至$dgt-1$位的情况再根据上界逐位枚举 不过实际上可以通过添补前导0的方式将所有情况都补为$dgt$位统一计算 其中
阅读全文
摘要:Link: ARC063 传送门 C: 将每种颜色的连续出现称为一段,寻找总段数即可 #include <bits/stdc++.h> using namespace std; int cnt=0,len; char s[100005]; int main() { scanf("%s",s+1);l
阅读全文
摘要:Link: P2397 传送门 Solution: (1)在这里记录一个小小的黑科技:摩尔投票法 (线性时间复杂度,$O(1)$的空间复杂度求众数) 从数组的第一个元素开始,假定它代表的群体的人数是最多的 设置一个计数器,在遍历时遇到不同于这个群体的人时就将计数器-1,遇到同个群体的人时就+1 只要
阅读全文
摘要:Link: P1580 传送门 Solution: 拿来练练字符串的读入: 1、$gets()$相当于$c++$中的$getline()$,但返回值为指针!(无数据时为NULL) (都读入换行符,并将其舍弃) 2、$sscanf(起始指针,.....,......)$可以实现从另一个字符串读入 3、
阅读全文
摘要:Link: AGC003 传送门 A: 判断如果一个方向有,其相反方向有没有即可 #include <bits/stdc++.h> using namespace std; char s[1005]; map<char,bool> mp; int main() { scanf("%s",s); fo
阅读全文
摘要:Link: P2396 传送门 Solution: 一眼能看出$O(n*2^n)$的状压$dp$ 但此题是个卡常题,$n=23/24$的时候就别想过了 这题算是提供了一种对状压$dp$的优化思路吧 原来我们要用$n$的时间来查找当前有哪些位为1,然后从这些位来转移 但实际上可以通过树状数组中$low
阅读全文
摘要:Link: BZOJ 2752 传送门 Solution: 虽然有期望,但实际上就是除了个总数…… 此题计算总代价明显还是要使用对每个$w_i$计算贡献的方式: $w_i的贡献为w_i*(i-l+1)*(r-i)$(左端点的方案数乘上右端点的方案数) 为了能使维护的数据符合$RMQ$的性质,我们要将
阅读全文
摘要:Link: BZOJ 1293 传送门 Solution: 这题直接上尺取法就行了吧 先将每种颜色第一个放入优先队列,用$mx$维护当前的末尾位置 每次取出第一个颜色,更新答案。将其下一个放入队列中去,更新$mx$ Tip:此题BZOJ无故TLE,本机和Luogu都能AC Code:
阅读全文
摘要:Link: BZOJ 1047 传送门 Solution: (1)先横向用单调队列求出每个数左边$n$个数中的最值 (2)再纵向利用横向的结果用单调队列进行相同的操作 通过以上操作将$a*b$的矩阵转化为了$(a-n+1)*(b-n+1)$的矩阵 相当于每个正方形被缩成了一个点,而每个点的最值就代表
阅读全文
摘要:Link: SHPC2018 传送门 C: 一道看上去有些吓人的题目,不过$1e9$规模下的$n^m$代表肯定是可以约分的 可以发现能提供贡献的数对只有$2*(n-d)$种,那么总贡献为$2*(n-d)*(m-1)*n^{m-2}$ 除去$n^m$后就是$\frac{2*(n-d)*(m-1)}{n
阅读全文
摘要:Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,a,b,x,y; in
阅读全文
摘要:在Luogu分类中看到的有关精度问题的题目: P2393 传送门 P2394 传送门 以前没有遇见过考这样知识点的题目…… 1、浮点数的有效位数不满足要求时化为整型计算 一般来说$double$的有效位数为15~16位,$long double$的有效位数为18~19位 (注意,达到上界16/19位
阅读全文
摘要:Link: BZOJ 1057 传送门 Solution: 一道求最大子矩阵的裸题 一般求最大子矩阵的方法为单调栈(BZOJ 3039 玉蟾宫 )/ 垂线法 两者的思想其实完全相同,不过以前没写过垂线法,这次来练一练 垂线法要记录3个状态: $h[i][j]$记录当前点能向上合法走的步数 $l[i]
阅读全文
摘要:Link: BZOJ 1060 传送门 Solution: 直接上树形$dp$统计当前节点到叶子的最长距离 在返回前统计答案,这样就保证每棵子树已经平衡,相当于只调整$w(i,son[i])$ 可以发现每条边对答案的贡献为$dp[i]-dp[son[i]]-w(i,son[i])$ Code:
阅读全文
摘要:Link: BZOJ 4720 传送门 Solution: 2016年$NOIP$考的一道语文题 题面虽长,但思路并不难想 对于这类期望问题,大多数时候都用期望$dp$来解决 根据询问:在$n$个时间段中有$m$段可以申请调换时的最小期望值 我们可以设$dp[i][j][0/1]$表示前$i$段中有
阅读全文
摘要:Link: AGC002 传送门 A: …… #include <bits/stdc++.h> using namespace std; int a,b; int main() { scanf("%d%d",&a,&b); if(a>0) puts("Positive"); else if(a<=0
阅读全文
摘要:Link: BZOJ 1801 传送门 Solution: 一眼看过去又像是状压$dp$的经典模型…… 但此题$n,m\le 100$ ,直接跑状压只有50分 此时要发现这道题的特点:每行/列不能放置超过2个 既然每一列只可能有 不选/选1个/选2个 这三种状态,直接记录这三种状态的个数即可 于是设
阅读全文
摘要:Link: BZOJ 1725 传送门 Solution: 事实证明,POJ 1185 炮兵阵地 一道顶十三道! 注意每个状态维护的值要灵活变通! 此题仅要求总次数,因此只要记录末行状态,不用记录当前总个数 Code:
阅读全文
摘要:Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$sum$的个数 最后统计$dp[n][k][k*a]$即可 这样就得到了$O(n^4)$的解法 #inclu
阅读全文
摘要:Link: AGC001 传送门 A: …… #include <bits/stdc++.h> using namespace std; long long res=0; int n,dat[500]; int main() { scanf("%d",&n); for(int i=1;i<=2*n;
阅读全文
摘要:Link: BZOJ 1053 传送门 Solution: 关键要看出几个性质: 1、虽然$2e9$很大,但最多也只能由前12个素数组成 2、对于每一个“反素数”,随着质因数的增大,系数必然减小 (否则可将两质因数交换,得到的值必然更小) 接下来直接$dfs$即可 Code:
阅读全文
摘要:Link: BZOJ 1087 传送门 Solution: 思路基本上和 POJ 1185 炮兵阵地 完全相同 都是先对每一行的可能状态进行预处理,只不过一个记录最大值一个记录方案数 不过再一次写的时候还是犯了几个**错误调了一会…… 1、对$k$的枚举要从0开始! $dp$时很多时候为0的状态都有
阅读全文
摘要:Link: BZOJ 3668 传送门 Solution: 怎么回事啊,难道好好学贪心就能在NOI上切题了? 位运算相关题型的思路: 由于位运算以位为单位,因此每一位一般都是独立的,分别统计即可 因此对于此题我们对每一位都进行贪心策略: 1、如果该位在$m$之内,只要能最终变为1就计算贡献 2、如果
阅读全文

浙公网安备 33010602011771号