题目大意 给你一个序列\(a_1, a_2, ..., a_n\). 我们令函数\(f(n)\)表示斐波那契数列第\(n\)项的值. 总共\(m\)个操作, 分为以下两种: 将\(x \in [L, R]\)中的所有\(a_x\)加上一个数\(k\); 询问\(\sum_{x \in [L, R]}f(a_x)\) \(n \le 10^5\) \(m \le 10^5\) Solution 我们靠考虑斐波那契数列的转移矩阵: \[ [f_{a + b - 1} \ f_{a + b}] = […
Description 给你一个无限长的数组,初始的时候都为0,有3种操作: 操作1是把给定区间[l,r][l,r] 设为1, 操作2是把给定区间[l,r][l,r] 设为0, 操作3把给定区间[l,r][l,r] 0,1反转. 一共n个操作,每次操作后要输出最小位置的0. Input 第一行一个整数n,表示有n个操作 接下来n行,每行3个整数op,l,r表示一个操作 Output 共n行,一行一个整数表示答案 Sample Input 3 1 3 4 3 1 6 2 1 3 Sample Ou…
题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 t′=t2⋯tmt1t′=t2⋯tmt1 也是 ss 的一个子串. Input 输入仅有一行,一个字符串 s(1≤lens≤300000)s(1≤lens≤300000) .字符串 ss 仅包含小写字母. Output 输出一个整数表示答案. Sample Input (样例输入1) abaac (样例输入…
题目描述 给定一个长度为\(L \le 10^9\)的环形赛道, \(n \le 10^5\)个人在上面赛艇. 每个人的速度都不相同, 假如为正则顺时针走, 否则逆时针走. 当两个人相遇时, 他们就会开火, 编号小的那个人就会挂掉出局. 当只剩下一个人时, 这个人就获得胜利. 问: 多久以后游戏结束. Solution 考虑什么时候游戏结束: 最后仅剩的两个人相遇, 则一个挂掉, 另一个胜利. 因此我们只要得到最后是哪两个人相遇即可. 考虑每次相遇的只能是位置相邻的两个人, 因此我们把相邻两个人…
题面 Description 给定一个n个点m条边的连通图,保证没有自环和重边.对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成树上.假如最大权值为无限大,则输出-1. I nput 第一行两个整数n,m,表示n个点m条边 接下来m行,每行3个整数x,y,z,表示节点x和节点y之间有一条长z的边 Output 输出一行m个整数,表示每条边的答案 Sample Input 4 4 1 2 2 2 3 2 3 4 2 4 1 3 Sample Output…
noip2019集训测试赛(二十一)Problem B: 红蓝树 Description 有一棵N个点,顶点标号为1到N的树.N−1条边中的第i条边连接顶点ai和bi.每条边在初始时被染成蓝色.高桥君将进行N−1次操作,来把这棵蓝色的树变成红色的树.* 选一条仅包含蓝色边的简单路径,并删除这些边中的一条.* 然后在路径的两个端点中间连一条红色的边.他的目标是,对于每一个i,都有一条红色的边连接ci和di.现在请你判断是否可能达成他的目标. Input 题目数据按一下格式从标准输入输出输入: NN…
Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\(M\)和\(L\)中最多只会出现一次. 以\(M\)为例, 我们从前往后逐位在原串中匹配, 数组f[i]表示\(M\)的前\(i\)位在原串中当前位置之前的最晚出现位置. 假设当前数字\(x\)在\(M\)中出现位置为\(p\), 则 \[ f[p] = \begin{cases} f[p] = i…
Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\)列的情况, 我naive地认为一个状态要么不出现, 要么只出现一次. 于是用\(f[i][j]\)来表示出现的概率, 直接进行DP. 然后我用随机函数对拍, 发现是WA的... 考虑问题出现在了哪里: 一个状态实际上是可以出现多次的. 比如说我们考虑分别控制了两行两列的状态: 两行两列产生4个交点…
Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大小非常不熟练. 正确的做法是每个点开两个变量size和add, 分别表示在splay中以这个点为根的所有点所在的子树的点的数量, 以及以当前点为根的子树由虚边贡献的点的数量. #include <cstdio> #include <cctype> #include <algori…
Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格, 从前往后扫描. 假设我们已经知道了到前一天的最优策略, 考虑到当前这一天的最优策略: 假如手上还有股票, 那么一定是要把它卖掉的; 假如已经没有股票了, 那么我们就在原本打算卖出的股票以及这一天的股票中选出股价最低的买入. 用优先队列维护股价, 从第一天往后扫描即可. #include <cst…