题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1,V1),W2(T2,W2)\) 那么\(W1+W2((T1*V1+T2*V2)/(V1+V2),V1+V2)\) N<=500000 做法 首先我们要知道的是如果进水的水温递增, 那么肯定要保留的是最后L体积的水混合起来,新水温就是答案. 每天先放水,然后 加入进的水不递增,那么就混合最后两天的水…
题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bulb A的沙子数.保证A和B的总沙子数为X. 函数ft(x)表示t时刻,初始bulb A中的沙子数为x时,当前的bulb A中的沙子数是多少. 最开始时函数恰好为f(x)=x. 然后在第一次翻转之前,函数会逐渐向下移动变为<2>的样子,然后在翻转之后,函数又会逐渐向上移动,直至变成<3>…
题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的字符串. \(x\)是\(f(x)\)的一个前缀,并且要让\(f(x)\)尽量短. 问在\(f^{10^{100}}(S)\)中,[L,R]中所有字符的出现次数. \[字符集为小写字母,|S|<=100000,1<=L<=R<=1e18\] 解法 可以发现的是S只用考虑前一半,因为进行…
对每个点的取值都取最小的可能值. 那个图最多一个环,非环的点的取值很容易唯一确定. 对于环上的点v,其最小可能取值要么是mex{c1,c2,...,ck}(ci这些是v直接相连的非环点)(mex是).要么是这个值+1. 并且如果环上的一个点的值确定了,其他的值也就唯一确定了. 那么就一共只有两种可能性,枚举一下即可.…
题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. 可以通过搜索+剪枝解决. 我主要运用的剪枝有: 1.填了一位之后,可以立刻填出对称的另外一位. 2.看当前的rev(x)-x是否与给定的目标差距过远.…
题意 给定一个D,以及一个长度为N的序列a,顺序执行这些数字: 对于一个数字x,会使得D=min(D,abs(D-x)) 有Q次询问,每次询问独立,给出i,能否修改a[i],使得D最后不为0. n,q<=500000 解法 我们设Low[i],表示当前D执行i+1..n的数字之后,不为0的最小值. 我们知道,对于每一次询问i, 求出前i-1个数字执行后的结果D, 通过修改a[i],我们可以使得D变成[1,D], 那么如果D>=Low[i+1]就回答"YES",否则回答&qu…
题意 给定一个n*m的池塘,每个格子上可能有叶子. 从一个叶子出发,可以跳到相同行或相同列的叶子. 问至少去掉多少叶子,使得起点不能到达终点. \(n,m<=100\) 解法 很显然的最小割模型. 每列每行都新建一个点. 每片叶子拆成两个点,一个向另一个连一条容量为1的边. 另外一个就要向本行本列新建的那个点连一条容量无穷的边. 然后新建的那个点给所有本行或本列的叶子的第一个点连一条容量无穷的边. 然后跑一遍最小割就行了.…
给你一个1~n的排列p,n是偶数,每次从中任选一对相邻的数出来,插到排列q的开头,如此循环,问你所能得到的字典序最小的排列q. 我们先确定q开头的两个数q1,q2,q1一定是p的奇数位的最小的数,而q2一定是q1后面最小的偶数位的数,这很显然. 然后记q1,q2在p中的位置分别是L,R,把p分成三段[1,L],[L+1,R-1],[R+1,n],递归处理,当前区间[l,r],每次取的一对的左端点L必然是与当前区间左端点l奇偶性相同的最小的数,而R必然是L右侧与当前区间左端点l奇偶性不同的最小的数…
题意:给你一个H*W的字符矩阵,一次操作可以任意将两行或者两列交换.问你是否能通过任意多次操作,使得其变为对称矩阵.对称的含义是:对于任何格子A(i,j),其都等于A(H-i+1,W-j+1). 显然,先换行还是列不影响结果,不妨假设先换行再换列. 行不必真换,只需找出哪些行成对即可,然后这些对的顺序无关,这样的方案数只有1*3*5*7*...*n,只有10000左右. 这个怎么枚举呢,假设行数是1,2,3,4,5,6, 那么就(1,2)-(3,4)-(5,6) -(3,5)-(4,6) -(3…
题意:给你一个排列a,每次可以交换相邻的两个数.让你用最少的交换次数使得a[i] != i. 对于两个相邻的a[i]==i的数,那么一次交换必然可以使得它们的a[i]都不等于i. 对于两个相邻的,其中一个a[i]==i,另一个a[i]!=i的数,一次交换也必然可以使得它们的a[i]都不等于i. 于是可以把序列划分成多段连续的a[i]==i的段落,它所贡献的交换次数就是[(长度+1)/2]. #include<cstdio> using namespace std; int n,a[100005…