Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N 的整点坐标上都种着一棵果树.((0, 0) 这个点没有果树) 小 D 先站在 (0, 0) 处,正对着 (1, 0) 的方向. 每次摘果实时,小 D 会逆时针选择他能看到的第 K 棵还未摘取果实的果树,然后向着这个方向走去,在行走的过程中摘下沿路的所有的果树上的果树果实,直到走到果树林的边缘. 接…
题目 题目大意 给你一个由整点组成的矩形,坐标绝对值范围小于等于\(n\),你在\((0,0)\),一开始面向\((1,0)\),每次转到后面第\(k\)个你能看到的点,然后将这条线上的点全部标记删除. 问最后一个被标记删除的点的坐标. 正解 先吐槽一句,原来删除的点是一条线上的,而不是一个点-- 害得我以为是一道神题--更可恨的是,我看不出我的暴力有什么错! 既然一次删除的点是在一条线上的,那不妨将整条线上的东西看成一个点. 那就变成了一个约瑟夫问题(也就是猴子选大王). 共有\(8\sum_…
题目描述 题解 随便bb 详细题解见 https://www.cnblogs.com/coldchair/p/11624979.html https://blog.csdn.net/alan_cty/article/details/84557477 https://www.cnblogs.com/Iking123/p/11626041.html 这里讲讲自己发现的东西和一些细节 f[i][p][a]表示第i位以后(包括第i位)的最大值,a表示个位,在第i为进1的个位会变成什么 为什么要包括第i位…
题目描述 题解 吼题但题解怎么这么迷 考虑一种和题解不同的做法(理解) 先把僵尸离散化,h相同的钦(ying)点一个大小 (可以发现这样每种情况只会被算正好一次) 计算完全被占领的方案,然后1-方案/概率 由于大小确定了,所以最后会被分成若干不相连的块,且块中至少有一只僵尸,大的僵尸能占领小的僵尸的块,所以相邻两块之间一定会断开 那么一种占领的方案对应的是一类高度情况,考虑所有的占领方案即可求出所有的高度情况 定义一个块的编号为所占领的最大僵尸的编号 设f[i][x](x>0)表示以i为根的子树…
题目描述 题解 之前做过一次 假设图建好了,设g[i]表示i->j(i<j)的个数 那么ans=∏(n-g[i]),因为连出去的必定会构成一个完全图,颜色互不相同 从n~1染色,点i的方案数是(n-g[i]) 用线段树合并维护集合即可 code #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio>…
题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就是直径. 接下来考虑删去的边在直径上的情况. 自己连的边应该要是两棵树的直径的中点(中点就是直径上到端点最大距离最小的点). 答案就是两棵树的直径的一半(当然这是粗略的说法)加上边权,和两棵树内部的直径长度的最大值. 设直径端点为\(S\)和\(T\),现在想象直径是横过来的一条线,有一堆树挂在上面…
题目 题目大意 给你一个数列,每次可以选择任意两个相邻的数\(x\)和\(y\),将其删去,并在原来位置插入\(x+2y\). 每次询问一个区间,对这个区间进行上述操作.求最后剩下的数最大是多少. 答案需要取模. 思考历程 看到这题,第一个想法是:这题既要搞个最大值,又要取模,所以肯定是贪心. 然而不会-- \(O(n^3)\)的暴力是可以打的,直接区间\(DP\).然而我没有打. 其实最大的瓶颈是,我需要比大小,然而数太大,会炸掉-- 这题题面本身就对暴力不友好-- 正解 其实我比赛的时候就发…
今天偶遇一道算法题 "约瑟夫环"是一个数学的应用问题:一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去-,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n, 输出最后那个大王的编号. 方法一:递归算法   1 function killMonkey($monkeys , $m , $current = 0){ 2 $number = count($m…
题目链接 先说一下什么是约瑟夫环,转自:传送门 关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的.我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程.因此如果要追求效率,就要打破常规,实施一点数学策略. 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(…
什么是约瑟夫环呢? 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列. 我们用程序说话,实现约瑟夫环:eclipse jdk1.6 package code; import java.awt.PointerInfo; import java.util.Random; import java.util.Scanner…
最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推,n个人中最终存活下来的序号与n-1个人中存活的人的序号有一个递推关系式. 分析: 假设除去第k个人. 0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 //original sequence (1) 0, 1, 2, 3, ..., k-2,      , k, ...,…
约瑟夫环: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 例如:n = 9, k = 1, m = 5 [解答]出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8. int main()//约瑟夫环 { , m=,k=;//n是人数(编号1,2,……,x),m是出列号,k是起始人编号 , l=; ]; ;i<=;i++) {…
什么是约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为1的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解. 创建一个全局临时表: create global temporary table temp(t_id int) on commit delete rows; 游标…
本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新开始报数,数到第 m 个人,再让他出局......,如此反复直到所有人全部出局为止. 上一篇我们通过数组.静态链表实现了约瑟夫环,具体参考: 通过例子进阶学习C++(六)你真的能写出约瑟夫环么 本文,我们进一步深入分析约瑟夫环问题,并通过c++模板库实现该问题求解,最后我们说明…
大意: 给定$N,M$, 求$\sum\limits_{K=1}^N \text{(KM)&M}$ 考虑第$i$位的贡献, 显然为$\lfloor\frac{KM}{2^i}\rfloor$为奇数的个数再乘上$2^i$ 也就等于$2^i(\sum \lfloor\frac{KM}{2^i}\rfloor-2\sum \lfloor\frac{KM}{2^{i+1}}\rfloor)$, 可以用类欧求出 #include <iostream> #include <sstream&g…
题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往左第一个跳到的点,可以变成一棵树 如果r1r2(r1<r2)中间没有把两个点分开的弦,那么就是r1的深度 用一个单调栈可以求出往左跳到的点(每次把若干小区间合并),但是有可能一条弦跳到的位置会被向后的一条弦切断 所以再用一个单调栈求出每个右端点向左第一个跨过它的左端点,如果再维护过程中出现了交叉的情…
题目描述: \(1<=n,ai<=5*10^5\) 题解: 我是弱智我不会期望线性. 设\(E(a[i])\)表示第i个期望被减的个数. \(E(a[1])=a[1]\) 不难发现\(E(a[i])(i>1)\)之间互不影响,其实这很难. 考虑固定这两个,它们两个选到的概率一样,选到其它的就无视就好了. 那么只用考虑\(n=2\)的情况,这个直接暴力枚举\(a[1]\)结束时\(a[i]\)有几个,乘个\(1\over 2\)的几次方和组合数,式子如下: \(=a[i]-\sum_{i=…
题目 题目大意 有个二叉树,满足每个点跟它的所有祖先互质. 给出二叉树的中序遍历的点权,还原一种可能的方案. 思考历程 首先想到的当然是找到一个跟全部互质的点作为根,然后左右两边递归下去处理-- 然而考虑到和全部互质的点可能有很多个,这样的做法可能会退化到很多-- 先预处理了个\(L_i\)和\(R_i\)表示\(i\)左边第一个和\(i\)不互质的位置和右边第一个和\(i\)不互质的点. 这个东西怎么预处理就不用说吧-- (我估计正解肯定也要处理这东西) 然后就是乱搞-- 想不出正解,于是打了…
题目 题目大意 给你一个区间\([l,r]\),求这个区间内每个整数的十进制上从高位到低位的逆序对个数之和. 思考历程 一开始就知道这是个数位DP-- 结果一直都没有调出来,心态崩了-- 正解 先讲讲我的SB做法. 先设\(f_i\)表示压着第\(i\)位(从低位到高位,从\(0\)开始)的贡献. 于是转移就是这样: 计算第\(i\)位的贡献.这一位的贡献可能有点难计算,所以我预处理了一个\(h_{i,j,0/1}\)表示是否压着\(i\)位,\(0\)到\(i\)位对\(j\)的贡献(\(j\…
题目 题目大意 给你一棵树,带点权和边权. 要你选择一个联通子图,使得点权和乘最小边权最大. 支持修改点权操作. 思考历程 显然,最先想到的当然是重构树了-- 重构树就是在做最大生成树的时候,当两个联通块相连时,新增一个点,将两个联通块的根节点连上去. 这个新建的点上记录这条边的边权,那么以它为子树的答案就是子树的点权和乘上自己表示的这条边的边权. 然后题目就变成了一个似乎很经典的问题:给你\(a_i\)和\(b_i\),每次修改可以将区间内的\(a_i\)区间加,询问最大的\(a_ib_i\)…
题目 题目大意 给你一串二元组\((a_i,b_i)\)的数列. 求最小的区间\([l,r]\)长度,满足\([l,r]\)中的每个二元组选或不选,使得\(\sum a_i=w\)且\(\sum b_i\leq k\) 思考历程 想了好久,想来想去都是一个背包-- 最终决定打暴力-- 正解 先说说GMH大爷的神奇解法. 首先是二分答案\(ans\),转化成判定问题.然后在数列中每\(ans\)个点设置一个观测点. 以每个观测点为中心,向左和向右背包,然后合并. 然而正解并不需要一个\(\log\…
题目 题目大意 有一个字符串\(p\).一开始字符串\(s\)为空串. 接下来进行若干次操作:在\(s\)的某个空隙中插入\(p\). 给出操作后的\(s\),问长度最小的\(p\). 思考历程 感觉是一道神仙题. 于是考虑暴力. 在\(s\)前面找连续的最长串,作为\(p\)的前缀.显然这个串中只出现过一次\(s_1\) 同样地,在后面也找一条,作为后缀. 将前缀出现的位置和后缀出现的位置标记一下. 统计每个字符出现的个数,求最大公因数\(g\),表明操作的次数为\(g\)的因数. 然后按照长…
题目 题目大意 给你一颗带点权的树,后面有许多个询问\((u,v)\),问: \[\sum_{i=0}^{k-1}dist(u,d_i) \ or \ a_{d_i}\] \(d\)为\(u\)到\(v\)路径上的点. 思考历程&正解 其实我只会我的方法--题解说得太简略了,集训队大佬Infleaking的方法完全听不懂-- 首先看到这道题,就立马觉得是神仙题. 但是想到既然是树题,那应该不会太难. 于是我开始试着\(LCT\)建立联系--但是发现这个操作真是太骚了,用\(splay\)真的不好…
题目 题目大意 给你个非负整数数列\(a\),每次等概率选择大于零的\(a_i\),使其减\(1\). 问\(a_1\)被减到\(0\)的时候期望经过多少次操作. 思考历程 对于这题的暴力做法,显然可以状态压缩吧-- 然后我突然意识到,实际上我们将题目转化成以下模型: 有\(n\)种颜色,第\(i\)种颜色的小球有\(a_i\)个.那么题目就变成了一个有重复元素的排列问题. 先将\(2\)到\(n\)排列求出来,然后考虑将\(1\)随机插入. 枚举最后一个\(1\)出现的位置,然后在前面用组合数…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个树形结构,由 n 个垃圾桶和 n-1 条双向传送带组成. 垃圾处理器的编号为 1, 2, ..., n,每条传送带都可以花 1 秒钟将垃圾从一个垃圾桶输送到另一个垃圾桶. 垃圾投放点是编号为 r 的垃圾桶,垃圾总是投放在这里. 垃圾共有 n 种,编号也是 1, 2, ..., n. 编号为 i 的垃…
题目描述 题解 一种显然的水法:max(0,-(点权-边权之和*2)) 这样会挂是因为在中途体力值可能会更小,所以考虑求走完每棵子树所需的至少体力值 考虑从子树往上推求出当前点的答案 设每棵子树从根往下走的所需体力值为f,走完的贡献为sum 由于要加上 当前点-->儿子 这条边,所以实际上走完的贡献sum'=sum-边权*2 所需的体力值f'=max(边权+f,2*边权-sum),这里其实有两种情况 ①当前点-->儿子-->子树(-->儿子),那么最坏情况就是(子树的最坏情况+边权…
题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆盖一发,保证一段重链上的点的颜色相同(这样可以直接修改),用树状数组维护权值和 由于要保证颜色相同,所以不能随便moveroot 覆盖时先把x和y的lca和原树上的父亲断掉,把x-->lca这一段覆盖,然后再覆盖y-->lca向y方向的儿子 反正随便写应该就能过( 另一种做法 也就是题解的难想/难…
题目描述 题解 qy的毒瘤题 CSP搞这种码农题当场手撕出题人 先按照边权从大到小建重构树,然后40%暴力修改+查找即可 100%可以定期重构+平衡规划,每次把B个询问拉出来建虚树,在虚树上暴力维护每一段的凸壳,在凸壳上二分 虚树建法: 按照dfs序排序,每次用栈维护从根到当前点的栈 每次把当前点和栈顶做lca,若lca=栈顶就直接加,否则一直弹到栈顶是lca的祖先,顺便记录下每个点在虚树上的父亲 如果栈顶=之前的lca就不用管,否则加上lca,修改最后弹出的点的父亲 (注意要把根加进去) 设每…
Description: 题解: 显然满足二分性. 并且每一条边要不选l要不选r. 二分的那条链肯定要选l. 考虑有两个人在走最短路,一个人一开始必须走二分的那条链,要求第一个人走的比第二个人快. 安排的话也比较简单,第一人先走到这条边就给l,第二个人就给r. 还有一种想法,先只给二分的链l,其它都给r,跑一遍最短路,设为dis1. 然后再从二分的链的结尾开始,每条边都设为l,跑最短路,dis2. 然后一个点x的dis2[x]+二分的链长<=dis1[x],那么就可以走这个点,否则不能走,最后看…
题目 题目大意 维护一个无向图的割边条数,支持加边和删边. 正解 (PS:这是我很久之前在OJ上打出来的题解,现在直接copy过来) 题解只有一句话,估计没多少人可以看得懂.感觉出题人偷懒不想写题解-- 刚了一个晚上终于理解了题解的做法-- 由于本人还没有AC(时间比较匆忙),所以只是在这里梳理一下思路,顺便造福一下人类. 首先都知道线段树分治是个什么意思吧? 线段树分治是一种有效地利用撤销操作替代删除操作的套路.在这题中,所有的加边删边操作变成了加边和撤销操作.可以把操作看成一个栈,加边的时候…