【Henu ACM Round#17 F】Upgrading Array】的更多相关文章

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1.那么除过之后没有影响的. 然后.就是要明白 那个f(x)函数的意义.其实就是问你x质因数分解之后,其中好的质数和坏的质数的差是多少. 也即有多少个好因数,多少个坏因数. (以下的gcd(i)都指的是a[1..i]这些数字的gcd 然后考虑我们在第i个位置进行了一次操作. 显然他会对后面的数字造成影响…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中的前 i+1-f[i]个字符组成的 字符串. 特殊的,t可能就是一个空串. 比如abcdefg 这里f是kmp算法中的f数组 然后t有两种可能 ① t==s 这样的话,整个前缀就是 sssssss..ss了 这里有(i)/(i-f[i])个s 设为num; 我们可以用这些s来构造ababababa的形式. 则…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 做这题之前先要知道二叉排序树的一个性质. 就是它的中序遍历的结果就是这个数组升序排序. (且每个节点的左边的节点都是比这个节点的值小的,每个节点的右边的节点都是比这个节点的值大的. 则我们把原数组排序. 然后在这里面找到原来数组的a[1]的位置idx; 则1..idx-1这些数字都是a[1]的左子树. idx+1..n这些数字都是a[1]的右子树. 然后idx的左儿子是什么呢? 肯定就是1..idx-1中在原数组中最早出现的数字…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 判断sum/2这个价值能不能得到就可以了. 则就是一个01背包模型了. 判断某个价值能否得到. f[j]表示价值j能否得到. f[0] = 1; 写个01背包就好 [代码] #include <bits/stdc++.h> #define ll long long using namespace std; const int M = 100*200; const int N = 100; int f[M+10],n,a[N+1…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 排序,逆序.贪心选较大的就好. [代码] #include <bits/stdc++.h> #define ll long long using namespace std; const int M =1e5; int f[M+10],a[1000+10],n,m; int main() { ios::sync_with_stdio(0),cin.tie(0); #ifdef LOCAL_DEFINE freopen(&quo…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是不是存在就好了. 但是这样复杂度看起来是O(N^3)的了. 其实不然,a[n] = a[n-1]+a[n-2]这个递推的增长速度是接近2^n的增长速度的. (所以到达10^9之后直接break就好了 所以实际上不会真的达到递推1000的规模 差不多只有O(N^2*100)的样子. 这是可以接受的了.…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3+a4+...+ak+2 ->a2<ak+2 类似还可以推出 a3<ak+3 a4<ak+4 ... 则有 a1<ak+1<a2k+1<a3k+1... a2<ak+2<a2k+2<a3k+2... ... 也就是每隔k个要是递增的. 你的任务就是维…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其他角都是空的正方形. 举一些例子. ...* *... 可以看到这个连通块不是长方形. 就是因为有 .. *. 和 .* .. 如果我们把这两个角上的墙给删掉的话. 显然就能得到一个矩形了. 根据这个作为启发. 我们可以将整张图里面所有的2x2的正方形里面的"角"都给删掉. 这样的话,就能…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. 如果这个位置能放右括号和第一个匹配(位置满足在1+l[i]..1+r[i]之间. 那么我们就在第二个位置放一个右括号就好了. (如果我们作死不放右括号的话,那就只能放左括号了->一定要放一个括号的 那么我们就只能先匹配这一个左括号了,而前一个左括号可能在第3个位置就不能匹配了. 这就会造成错解. 也…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和b[i]相同了. (其他点无论怎么按b[i]只会变大) 但是这样直接暴力写会超时->O(N^2). 则写一个队列. 处理和他相邻的点的时候. 如果发现a[y]==b[y] 就重新入队. 因为可以保证每个点最多操作一次. 所以复杂度就是O(n+m)的了. [代码] #include <bits/st…