摘要: https://blog.csdn.net/Patrickpwq 阅读全文
posted @ 2019-01-25 23:42 Patrickpwq 阅读(166) 评论(0) 推荐(1) 编辑
摘要: 蒟蒻好紧张啊 蒟蒻好紧张啊 蒟蒻好紧张啊 蒟蒻好紧张啊 一开始方向好像走错了 乱推了个拓扑的式子 然后FST了 然后还不肯放弃 挣扎了20分钟 又受到了刚上来都打完球了的ldx的diss "我靠,这么傻逼的题你还没A吗" 好吧的确是傻逼题 先缩点 设s是1所在的scc的编号 考虑逆行的使用姿势 对于 阅读全文
posted @ 2018-11-07 22:04 Patrickpwq 阅读(170) 评论(0) 推荐(2) 编辑
摘要: 听了教练的考前须知 蒟蒻紧张的要死 只想做信心题 同时满足:c或者d在x子树里 a或者b在y子树里 其中x=lca(a,b),y=lca(c,d) cpp include define N 100005 using namespace std; template inline void read(T 阅读全文
posted @ 2018-11-06 14:45 Patrickpwq 阅读(148) 评论(0) 推荐(1) 编辑
摘要: 设f[i][j][p]表示长度为i 最高位为j p出现的个数 显然 f[i][j][p]=sigma{f[i 1][k][p]} 其中k是次高位 但是最高位出现的那么多次都没有被我们算进去 但是很显然只需要加上(i 2)^10就阔以了 然后常规的分[1,b],[1,a 1]解决 常规的分成两部分 一 阅读全文
posted @ 2018-11-06 11:57 Patrickpwq 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 听了教练的考前须知 蒟蒻紧张的要死 只想做信心题 cpp include define N 50005 using namespace std; int n,k,tot,first[N]; struct Tree { int to,next; }edge[2 N]; inline void adde 阅读全文
posted @ 2018-11-06 10:30 Patrickpwq 阅读(185) 评论(0) 推荐(1) 编辑
摘要: 迟到的题解 昨天乱翻的时候感觉这道题挺有意思的 一眼看过去状态压缩乱搜 转移方程大概是 设f[i]表示从0转移到i的遗憾值之和 f[i]=sigma(f[j])+val[i] dis[i] dis[i]=sigma(dis[j]) 其中j是i的子集,dis[i]表示从0转移到i的方案数之和 妙啊有7 阅读全文
posted @ 2018-11-06 09:56 Patrickpwq 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 虽然转移方程可以一眼看出 但是烦就烦在为何要排序 有人说这是一个贪心,又有人说这是一个保障正确性的。 就按照贪心的想法好了:在保证正确性的情况下尽量多的挂钩。 cpp include define N 2005 define INF 0x3f3f3f3f using namespace std; i 阅读全文
posted @ 2018-11-05 22:10 Patrickpwq 阅读(100) 评论(0) 推荐(0) 编辑
摘要: 对于当前新加入的一条路径 他产生的贡献分为两种 1.另一条路径的LCA在当前路径上 2.当前路径的LCA在另一条上 对于情况1: 可以维护当前点到根节点有多少个LCA,查询只需查询u,v, 2 lca(u,v),修改需要对lca的子树+1 对于情况2: 显然的树上差分,查询就是lca子树的前缀和,修 阅读全文
posted @ 2018-11-05 20:30 Patrickpwq 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 可以先不管符合条件的 先统计出所有的可能走法(最短路条数 最短路条数) 然后减去会相遇的 会相遇的分为在点相遇和在边相遇 在点(设为p)相遇:先保证点在最短路上 然后从s到p的最短路等于从t到p的最短路 在边(设为(x,y,z))相遇:同样需要保证边在最短路上(需要判断三次 同样玄妙♂) 以及相遇的 阅读全文
posted @ 2018-11-05 16:50 Patrickpwq 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 很无奈 离正解就差一句话 简单的带权并查集 没啥好说的 也可以差分约束 cpp include define N 100005 define M 200005 define D 10005 using namespace std; template inline void read(T &x) { 阅读全文
posted @ 2018-11-05 13:58 Patrickpwq 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 我是菜鸡 我是蒟蒻 我好菜 ak一定是区间最小的值,且是所有数(包括自己)的最大公约数 我没看出来 没救了 noip爆零了 回家养猪了 没学上了 怎么办 gcd有单调性 gcd有单调性 gcd有单调性 gcd有单调性 gcd有单调性 可以二分 可以二分 可以二分 可以二分 要说多少遍才记得到 我没想 阅读全文
posted @ 2018-11-02 17:00 Patrickpwq 阅读(289) 评论(0) 推荐(0) 编辑
摘要: ~~啥玩意儿啊 题都没读懂~~ 飞船要飞过这个行星带 就必须穿过每个行星形成的瓶颈 于是我们把每个行星想象成一个点 形成的瓶颈就是与其他点相连的边 相当于一个最小生成树了 直到s t联通 当然 这样做有点难理解 还可以类似的二分+并查集做 cpp include define N 805 defin 阅读全文
posted @ 2018-11-02 15:48 Patrickpwq 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 肯定要先跑一次最短路 题目中的k 相当于允许我们走k距离的“冤枉路” 回想之前有些题是如何判断哪些边是属于最短路上的 当dis[now]+edge[u].val==dis[vis] 这条边就在最短路上 类似的 我们可以得出 dis[now]+edge[u].val dis[vis]就是这一次走的“冤 阅读全文
posted @ 2018-11-02 08:10 Patrickpwq 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 先找出Elaxia的最短路 重新建图 在此图上我们再标记同时也是w 的最短路的边 显然这是一个DAG 可以做dp 设f[i]表示以i点结尾的最长公共连续和(公共路径一定是一条链) 则f[vis]=max(f[now],f[now]+e[u].val e[u].flag)(flag表示是否也是w 的最 阅读全文
posted @ 2018-11-01 20:48 Patrickpwq 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 容易想到枚举所有起点 做最短路 然后枚举边统计次数 一条边(x,y)的贡献 肯定是 s到x最短路的方案数 乘上 s到其他点但经过了y的最短路 对于前者 每个点可以从前一个点递推过来 只要满足dis[vis]==dis[now]+edge[u].val 当一个点被所有入边都统计了一次后 就可以搜他了( 阅读全文
posted @ 2018-11-01 16:09 Patrickpwq 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 迭代加深搜索就是限制递归的层数,然后一层层地扩大限制的层数 我们记录当前深度,以及当前应该搜出几个数 设计剪枝: 1.当当前深度乘上2^r(r是还没有选的数)比m还小 那肯定是不行的 因为最大的扩展方式就是选两个最大的数 2.这一层比上一层数小 阅读全文
posted @ 2018-11-01 14:32 Patrickpwq 阅读(521) 评论(0) 推荐(0) 编辑
摘要: 当答案可以分为两半时 为了降低复杂度 可以使用折半搜索 对前半部分 搜出所有可能的和 用map记录 对后半部分 同样也是搜出可能的和 如果前半部分存在一个和 能拼起来 那ans++ cpp include define N 45 define ll long long using namespace 阅读全文
posted @ 2018-11-01 13:36 Patrickpwq 阅读(214) 评论(0) 推荐(0) 编辑
摘要: n个集合的容斥其实就是 总的 减去两两相交的 加上三个相交 减去四个相交 加上五个.....(奇加偶减) 这道题就是一个lcm的容斥 我们用搜索来实现 枚举选的数 需要加个剪枝 当前lcm已经超过了m cpp include define N 35 define int long long usin 阅读全文
posted @ 2018-11-01 12:16 Patrickpwq 阅读(146) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2018-10-31 22:27 Patrickpwq 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 当覆盖两点的最小矩形不同时,一定不可达 这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询 对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号 对于操墙操作 我们可以反着减去这个编号 对于查询 就查询这两个点的值是否相同 编号的累积不影响 因为只有在同一个墙内才会累积 注意 如果只 阅读全文
posted @ 2018-10-31 17:33 Patrickpwq 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 关键是那些两个数相乘拼成了立方数的 一个数分解质因数后,指数%3是不影响的 我们可以这样想——我们通过一个数,反推出能够和他凑成立方数的数 但有可能这个数在原序列里不存在 不过没关系 我们开两个桶 每次比较下大小 只往一边放 这样就不会多统计了 cpp include define N 100005 阅读全文
posted @ 2018-10-31 16:16 Patrickpwq 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 总的来说 从v通往1的道路 分为了步行和开车 也就是说 一个点u 他能作为分界点 当且仅当存在一条路径(u,v)的海拔全部高于当天水位线 且(u,1)是最短路 很显然 这是一个与瓶颈有关的问题 不难想到Kruskal重构树 由于瓶颈是海拔 所以我们先建出以海拔为关键字的重构树 由于是个小根堆 所以一 阅读全文
posted @ 2018-10-31 15:00 Patrickpwq 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 假设当前区间为[l,r] 中间点为mid 那么最近点对 要么在[1,l]中,要么在[l+1,r]中,要么两边各有一个 我们递归处理出左区间的 最近点对距离d1 右区间d2 取d=min(d1,d2) 然后有两个剪枝来处理情况3 1.按x为关键字排个序,枚举[l,r]的点,假如一个点的x与中间点的x差 阅读全文
posted @ 2018-10-30 22:41 Patrickpwq 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 暴力做法:(30pts) 把每条无向边拆成两条有向边.把每条边看成一个点,对于两条从一个点出去的边 建两条有向边 边权为较大值 这样是m^2的 优化: 可以用类似差分的思想来 然后出边之间做差分 对出边的边权排序 然后相邻边之间连边(小边向大边连权值为两边权值之差的边,大边向小边连权值为0的边) 这 阅读全文
posted @ 2018-10-30 20:55 Patrickpwq 阅读(147) 评论(0) 推荐(0) 编辑
摘要: %%%%%%%%%%%lst神仙 这是他的做法 吊了标算 对于这种有多少区间满足要求的 我们套路的用分治做 每次都统计左端点在左半边 右端点在右半边的个数 设f(i) 表示当前点到中间分割点的最大值,g(i)表示当前点到中间分割点的或和 我们发现 g(i)≥f(i) 所以只需找到g[i]=f[i]的 阅读全文
posted @ 2018-10-30 16:48 Patrickpwq 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 假设当前节点now的子树大小为size now的方案数是他的所有儿子内部如何分配的方案数相乘得到的 这个可以递归计算 不过对于那么多儿子之间 他们分配走的标号可能是不同的 比如now将把2,3,4,5分配给他的子树,那有可能是2,3;4,5 也有可能是2,4; 3,5这样分 所以还得套个组合数 C( 阅读全文
posted @ 2018-10-30 15:39 Patrickpwq 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 容易想到如果两个“交叉”的车车的宽度加起来比停车场还宽了那肯定是不合法的 也就是说 一个车子移动过程中只要前面存在一个位置,经过了他,而且和他的和大于w就是不合法的 然后我们从大到小枚举终点位置 这样保证了树状数组里维护的一定是经过了当前点的 阅读全文
posted @ 2018-10-29 17:07 Patrickpwq 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 都快忘了割点怎么搞了 对所有点分两类 1.根节点 2.非根节点 显然根节点是很好做的 只需要数一下有没有两个子树以上 对于非根节点 利用tarjan算法 回忆到dfn的定义:时间戳,即在dfs中第几个被访问到 low:经过最多一条后向边/栈中横叉边能到达的最小的节点时间戳 对于当前节点now来说,把 阅读全文
posted @ 2018-10-29 14:47 Patrickpwq 阅读(120) 评论(0) 推荐(0) 编辑
摘要: (谁告诉我是状压的????) 一行/列最多能放三个炮 30分是让你爆搜的 50分是让你状压的 假设有8列 dp[i][j]表示到第i行且前面列的状态为j (没有/有一个/有两个炮) 然后刷表 100分其实就是在50分的基础上修改了一点 因为发现 并不需要准确的知道之前摆放情况到底是什么样子的 于是d 阅读全文
posted @ 2018-10-29 14:36 Patrickpwq 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 一开始在往平均数那方面想 但是好像是错的 我们这样想 每当加入一个数 如果他与之前构成的是上升的就不管 如果是下降的 那肯定要折中 变成中间值才能最小 即答案就是最大的逆序对差值/2 cpp include define ll long long define N 5000000 using nam 阅读全文
posted @ 2018-10-29 10:42 Patrickpwq 阅读(128) 评论(0) 推荐(0) 编辑
摘要: (谁告诉我这是个分层最短路来着的???) 进入一个城市必须要这个城市所有结界都打破才能进 那我们可以边炸边走 也就是说 我们可以维护d1数组:走到的时间(结界可能没炸完) d2数组:可进入的时间(结界都被炸完了) d数组:真实的到达时间 容易发现d[i]=max(d1[i],d2[2]) 那我们就用 阅读全文
posted @ 2018-10-29 09:54 Patrickpwq 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 拿到这道题一开始有两个naive的想法 想法1:对于每个位置 向右扩展 直到不能取了为之 但是又觉得复杂度不对就放弃了...... 想法2:离散化坐标 二分仓库的位置 每次往左右两边数量较多的一边靠(这是什么口胡玩意儿???) 正解: 事实证明我是被ioi2011吓到了 其实就是想法1加了一丢丢东西 阅读全文
posted @ 2018-10-28 22:39 Patrickpwq 阅读(129) 评论(0) 推荐(1) 编辑
摘要: 有一种显然错误的做法:每次从堆里取最大的,更新链表 比如 19,20,19 这样的话会先选20。但是很显然,选两个19带来的贡献可能是更好的 这时我们就要想一种能做到“反悔”的方法 其实只需要做一点点修改,每次再push一个“19+19 20”进去,一样是对的 那这个“19+19 20”的放在哪儿呢 阅读全文
posted @ 2018-10-28 17:07 Patrickpwq 阅读(124) 评论(0) 推荐(0) 编辑
摘要: ~~这是一道毒瘤题。~~ 首先题目中给的是边权而不是点权,但是我们把边权移到点上就行了 但是要注意,之后我们修改u,v两点之间的路径时,就不要修改他们的lca,以及当要修改单边的时候,把边的编号 2(因为是双向边),然后挑深度大的那个点来修改 重点是区间覆盖tag和区间加tag。首先注意,进行区间覆 阅读全文
posted @ 2018-10-28 16:08 Patrickpwq 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 不难发现 题目中给出的f函数 其实就是一个数分解质因数后好素数和坏素数的个数之差 也就是说 数x带来的贡献 与x的质因数的种类有关系 又联想到gcd[1~x]一定是这个数的因子 也就是说一个数的贡献可以表示成:f(gcd[1~x])+f(....) 容易想到贪心做法:我们从后往前枚举 如果当前gcd 阅读全文
posted @ 2018-10-27 21:49 Patrickpwq 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 发现我还naive的不会Kruskal重构树 所谓Kruskal重构树 就是在做Kruskal的时候 构造一颗树 对两个即将合并的联通块 新建一个节点 作为这两个联通块的父亲 且这个节点的权值就是那条相连两个联通块的权值 而且这棵树很明显是一个堆 那么对于最初的最小生成树 两个节点路径上的最大/小值 阅读全文
posted @ 2018-10-26 17:44 Patrickpwq 阅读(117) 评论(0) 推荐(0) 编辑
摘要: vis是一个三维数组 vis[x][y][0]代表第一次搜到原图坐标(x,y)的x"虚"坐标,vis[x][y][1]代表第一次搜到原图坐标(x,y)的y"虚"坐标,vis[x][y][2]代表是否搜过 这样既可以判断什么时候进入了无限走状态,又可以判断是否死循环了(往前走一步又退回一步) 阅读全文
posted @ 2018-10-26 16:45 Patrickpwq 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 贪心策略:每加入一个数,如果之前已经存在它了,就直接交换 因此我们需要维护距离 就用树状数组好了 注意是2n cpp include define N 100005 using namespace std; int n,tree[N],pre[N],ans; inline int lowbit(in 阅读全文
posted @ 2018-10-25 22:15 Patrickpwq 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 对于这类棋盘问题 要关注的是这一行与前一行的关系 设dp[i][j][state]表示前i行,已经放了j个国王,状态为state的方案数 然后枚举i,枚举j,再枚举state,再枚举上一行last 先判断state,last各自是否合法,再判断他们俩合起来会不会冲突 最后答案就是最后一行所有状态的方 阅读全文
posted @ 2018-10-25 21:26 Patrickpwq 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和。因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和 我们考虑对式子变一下形 Qi =S1+S2+S3+...+Si =a1+a1+a2+a1+a2+a3+...+ai =a1 i+a2 (i 1)+a3 (i 2)+...+ai =(a 阅读全文
posted @ 2018-10-25 15:57 Patrickpwq 阅读(115) 评论(0) 推荐(0) 编辑