首页 > TAG信息列表 > MaxM
【题解】「JOI 2015 Final」JOI 公园
Description Solution Code #include <cstdio> #include <algorithm> #include <queue> #define int long long using namespace std; const int MAXN = 1e5 + 10, MAXM = 4e5 + 5, INF = 1e18; int n, m, C; int head[MAXN], nxt[MAXM], ver[MAXM], edge[P1821 [USACO07FEB] Cow Party S
https://www.luogu.com.cn/problem/P1821图论,最短路黄色题 思路: 主要就是比模板多了一个反向建图 我们首先想到的是从每个点都求一遍到终点的最短路,这样会加大时间复杂度。 所以,我们可以反向建图,直接把单终点最短路转为单源最短路,只需要跑两次最短路算法,显然是稳过的。(可以自[CF446B]DZY Loves Modification 题解
传送门QAQ Preface 很不错的一道题,学到了遇到瓶颈时思考的方法。 Analysis 首先要发现一个东西:行上的操作对所有列的影响是等效的,列同理。 那么就有了一个朴素的贪心思路:用优先队列求出当前和最大的行或列,处理一下答案。 但稍微想一下就能发现,如果有大小相同的行和列,那就相当不好洛谷 P6822 - [PA2012]Tax(点转边+最短路)
洛谷题面传送门 套路题一道。 首先直接抛出建图方式: 边化点,点转边。将每一条无向边 \(e=(u,v,w)\) 拆成一正一反两条有向边 \(e_1,e_2\),然后在 \(e_1,e_2\) 之间连权值为 \(w\) 的边。 对于每个点,将所有与其相连的边按权值从小到大排序,然后对于权值相邻的两条边 \((e_1,w_1),(CF292D Connected Components 题解
这道题给各位一种与之前不一样的做法。 首先显然可以使用并查集维护连通块个数,但是我们知道并查集 不支持删除,而题目是 区间询问,所以: 不支持删除+区间询问=回滚莫队! 所以这道题可以用回滚莫队通过,没学过的可以看看 这篇博文。 那么对于这题,取块长 \(block = n^{\frac{2}{3}}\),对所3.30省选模拟
开局\(MTT\)优化\(dp,\)跳,\(dp\)计数,跳,虚树\(dp,QAQ,\)昨天是数学场,今天搁这\(dp\)场呢 看题解都能看自闭... \(T1\) 考场上很容易转化到取石子,转化成阶梯博弈就好了,然后至于优化\(dp,\)使用\(MTT\)就好了 于是乎,我前几天看的一个博客,讲了除了阶梯博弈的所有博弈,看了一第62期:图论-最小生成树-Boruvka算法
参考: Boruvka算法 - lher - 博客园 Boruvka算法_weixin_30527323的博客-CSDN博客 最小生成树的Boruvka算法__shivering_的博客-CSDN博客_boruvka算法 【模板】最小生成树题解 - 洛谷 1.【模板】最小生成树 - 洛谷 #include<bits/stdc++.h> using namespace std; const int MAXNLuogu P5897 [IOI2013]wombats
Luogu P5897 [IOI2013]wombats 为了统一记号,下文设矩形的行数为 \(n(\le 5000)\),列数为 \(m(\le 200)\),更新次数为 \(U(\le 500)\),查询次数为 \(Q(\le 2\times 10^5)\)。 最暴力的想法是每一次查询时直接DP,时间复杂度为 \(\mathcal O(Qnm^2)\)。这显然过不去,考虑优化。 CF817D Imbalanced Array/Namomo Camp 每日一题 Day 1子串的最大差
Namomo Spring Camp 每日一题Day 1 子串的最大差 Problem Statement 给你一个长度为\(n\)的数组\(a_{1,\dots,n}\)求:\(\sum_{l=1}^n\sum_{r=l}^n\max\limits_{l\leq i\leq r}\{a_i\}-\min\limits_{l\leq i\leq j}\{a_i\}\). Solution 我们考虑拆贡献分别计算: \(\sum_{l=1}^n\sumdsu on tree
算法简介 \(\quad\)前置知识:树链剖分 \(\quad\)dsu on tree 利用了树链剖分将重儿子先剖出来,然后在查询的时候先遍历轻儿子,然后将轻儿子所求的值删去(以免影响它的兄弟),最后求出重儿子,重儿子的贡献值因为是最后一个,所以不用清空,最后如果本节点是轻儿子,则清空自己,本节点是重儿子,则保[HAOI2010]计数题解
题目ABC222 D - Between Two Arrays(dp,差分优化)
题意: 解法: d[i][j]表示前i个数,c[]末尾为j的方案数. 设l=a[i],r=b[i]. 发现每次转移需要将d[i][j]加到d[i+1][]的一个区间, 那么复杂度就变成O(n^3)的了. 但是由于是连续区间,所以可以用差分优化以下, 复杂度就降为O(n^2)了 code: #include<bits/stdc++.h> // #define MULTNFLSOJ #10319. -「2020联考北附2」碎梦(NTT+对角化)
题面传送门 一个奇怪的解法,时间复杂度比标算少一个 \(k^2m\) 所以建议把数据范围加强到 \(k=300,m=3\times 10^4\),8s 时限把标算卡掉(bushi) 首先考虑部分分解法。对于 \(m=100\),注意到转移可以写成矩阵的形式,具体来说记 \(A=\begin{bmatrix}0&1&0&0&\cdots&0&0\\0&1&1&0&\cdots&0&0CF2800 722F Cyclic Cipher 题解
令当前时间为 \(t\),则序列 \(i\) 取的到 \(j\) 需满足的条件为:\(t\equiv j \pmod {len_i}\)。 多个同余方程要一起考虑,不难想到 excrt(扩展中国剩余定理)。 考虑枚举具体的数字(\(1\sim m\)),遍历 \(1\sim n\),肯定不可能把 excrt 跑完。(这样优化空间很小) 那就只能对于一段序列,元素两两【缩点 动态规划】JZOJ_4253. 【五校联考7day2】QYQ在艾泽拉斯
题意 给出一个图,上面有若干连通块。 对于每个连通块,为有向边组成的图,每个点上有点权。 最多在\(K+1\)个连通块操作,使得遍历这个连通块获得的点权之和最大。 思路 将每个连通块上的环缩点,变成一个DAG然后dp即可。 代码 #include <queue> #include <stack> #include <cstdio> #inclunoip模拟32
\(\color{white}{\mathbb{山高而青云冷,池深而蛟穴昏,行以慎步,援以轻身,名之以:落石}}\) 开题发现 \(t1\) 80分特别好写,于是先写了 但是这个做法没有任何扩展性,导致一直没有往正解的方向想 \(t3\) 看见有点的坐标,以为是计算几何,于是写完 \(t1\) 打了个暴力就看 \(t2\) 了 但事实证明Codeforces1555 D. Say No to Palindromes(思维,前缀和)
题意: 解法: 根据题目要求,aa不能出现,aba也不能出现, 那么任意三个连续字符,一定两两不同, 此时只需要确定前三个字符,那么后面的所有字符都是确定的. 枚举前三个字符的变化组合, 对于第num种组合,计算出sum[num][i]表示 [1,i]变化了多少次. 对于每组询问,枚举组合i,那么mi【POJ2195】Going Home
题目 解析: 本质是个二分图带权匹配问题,建图后用费用流实现即可。 code: #include <iostream> #include <algorithm> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int Maxn=205; const int Maxm=10205; const int inf=1e9; int n,mHH去散步
题目link:https://www.luogu.com.cn/problem/P2151 Part0: 注意题目有重边。 Part1: 首先这道题的题目限制为走过一条边不能按原边返回,这就导致了这个图的有向性,从而得出需要拆边的结论。 Part2: 拆完边后,容易看出如果要想满足题目限制,那么相当于走过第 $i$ 条边后,除了 $i$ 的反向浅谈dsu on tree
前言:dsu on tree利用了树链剖分将重儿子先剖出来,然后在查询的时候先遍历轻儿子,然后将轻儿子所求的值删去(以免影响它的兄弟),最后求出重儿子,重儿子的贡献值因为是最后一个,所以不用清空,最后如果本节点是轻儿子,则清空自己,本节点是重儿子,则保留,依次。 dsu on tree利用了重儿子的性质,尽量分块
此博客仅供分块思想入门使用,如果需要进一步地了解分块,请前往笔者的 这篇博文 基本概念 分块是一种经过优化的暴力算法,它将一个长度为 \(n\) 的数组分成尽量平均的若干块,每块的长度称为块长。因为通常情况下把区间分成块长为 \(\sqrt{n}\) 的块,所以分块算法的时间复杂度通常为 \(AtCoder Beginner Contest 210
A-Cabbages # include "iostream" # include "cstdio" using namespace std; int N,A,X,Y; int main(){ scanf("%d%d%d%d",&N,&A,&X,&Y); printf("%d",N>=A?A*X+(N-A)*Y:N*X); return 0; } B-BCodeforces1536 C. Diluc and Kaeya(思维)
题意: 解法: 首先对于前缀[1,i],计算D的数量d和K的数量k,当前d和k的数量比为d/k. 由于每个部分d/k相同,那么你拆分出一段之后,剩下数量中d/k是不变的,那么就变为了一个子问题. 我们要令子问题递归的次数尽可能多, 用map标记d/k的位置有多少个,这里d/k要化为最简分数,d/k的最NOIP 模拟5 T3 big
题面:你需要在[0,2^n)中选一个整数 x,接着把 x 依次异或 m 个整数a1~am 在你选出 x 后,你的对手需要选择恰好一个时刻(刚选完数时、异或一些数后或是最后),将 x 变为你想使 x 最后尽量大,而你的对手会使 x 最后尽量小。 你需要求出 x 最后的最大值,以及得到最大值的初值[CF1137E] Train Car Selection
传送门 解答 注意到\(b, s > 0\):在前面的“更有成为最小值的可能”。 操作1:相当于将原数列清0。(没什么用) 若没有操作2:只保留第一个数即可。 若有操作2:考虑操作3相当于加上一条直线。又因要维护最小值,联想到凸包(在这个操作后仍为凸包) 那么维护凸包就可以了~本题只需要使用栈维护即