Codechef LOCAUG17

做完题目很少有写题解的习惯,强行PO一组吧。

比赛链接:https://www.codechef.com/LOCAUG17

PRINCESS

给定字符串s,问s是否存在长度大于1的回文子串。

解:分两种情况。设n=|s|。

1. 存在回文子串长度为奇数。则存在2<=i<n,使得s[i-1]==s[i+1]。

2. 存在回文子串长度为偶数。则存在1<=i<n,使得s[i]==s[i+1]。

时间复杂度O(n)。

ALATE

给定长度为n的数组a[1..n]。维护两种操作:

1. 给定x,求$\sum_{x|i} a[i]$。

2. 给定x和y,把a[x]改为y。

解:维护ans[x] = $\sum_{x|i} a[i]$。

0. 暴力预处理得到ans[]的初值。

1. 对于操作1,直接输出ans[x]。

2. 对于操作2,枚举所有d|x,更改ans[d]。

时间复杂度$O(n\log n+n \max\limits_{1 \le k \le 100,000} \sigma(k))$,其中$\sigma(k)$表示k的因子个数。

ALTSUB

给定长度为n的数组a[1..n]。维护两种操作:

1. 给定x和y,把a[x]改为y。

2. 给定L和R,求a[L], a[L+1], ..., a[R]的所有子序列的交错和的平方之和。

一个序列a[1], a[2], ..., a[n]的交错和定义为$\sum_{i=1}^n (-1)^{i-1} a[i]$。

解:考虑使用线段树。

每个区间维护6个信息:

cnt0 - 这段区间中长度为偶数的子序列个数。

cnt1 - 这段区间中长度为奇数的子序列个数。

sum0 - 这段区间中长度为偶数的子序列的交错和之和。

sum1 - 这段区间中长度为奇数的子序列的交错和之和。

sum20 - 这段区间中长度为偶数的子序列的交错和的平方之和。

sum21 - 这段区间中长度为奇数的子序列的交错和的平方之和。

具体更新信息如下:

void update(node *tree, int k)
{
    tree[k].cnt0 = (tree[k<<1].cnt0*tree[k<<1|1].cnt0+tree[k<<1].cnt1*tree[k<<1|1].cnt1)%MOD;
    tree[k].cnt1 = (tree[k<<1].cnt0*tree[k<<1|1].cnt1+tree[k<<1].cnt1*tree[k<<1|1].cnt0)%MOD;
    tree[k].sum0 = (tree[k<<1|1].cnt0*tree[k<<1].sum0+tree[k<<1].cnt0*tree[k<<1|1].sum0+tree[k<<1|1].cnt1*tree[k<<1].sum1-tree[k<<1].cnt1*tree[k<<1|1].sum1)%MOD;
    tree[k].sum1 = (tree[k<<1|1].cnt0*tree[k<<1].sum1-tree[k<<1].cnt1*tree[k<<1|1].sum0+tree[k<<1|1].cnt1*tree[k<<1].sum0+tree[k<<1].cnt0*tree[k<<1|1].sum1)%MOD;
    tree[k].sum20 =(tree[k<<1|1].cnt0*tree[k<<1].sum20+tree[k<<1].cnt0*tree[k<<1|1].sum20+2*tree[k<<1].sum0*tree[k<<1|1].sum0
                +    tree[k<<1|1].cnt1*tree[k<<1].sum21+tree[k<<1].cnt1*tree[k<<1|1].sum21-2*tree[k<<1].sum1*tree[k<<1|1].sum1)%MOD;
    tree[k].sum21 =(tree[k<<1|1].cnt1*tree[k<<1].sum20+tree[k<<1].cnt0*tree[k<<1|1].sum21+2*tree[k<<1].sum0*tree[k<<1|1].sum1
                +    tree[k<<1|1].cnt0*tree[k<<1].sum21+tree[k<<1].cnt1*tree[k<<1|1].sum20-2*tree[k<<1].sum1*tree[k<<1|1].sum0)%MOD;
}

时间复杂度O(n+mlogn)。

GTREE

给定一棵n个节点,并以1为根的树,其每个点x有权值a[x]。

对于每个节点x,问其子树中的所有节点中(不包括节点x本身),有多少个节点y满足 $\gcd (a[x], a[y]) > 1$。

解:先考虑这样一个问题:

【假设给定若干个数字,并且数字x出现c[x]次。问有多少个数字与m的最大公约数大于1。】

由Mobius反演可得

$$\sum_{i=1}^n c_i [\gcd (i, m) = 1] = \sum_{d|m} \mu(d) \sum_{i=1}^{\lfloor n/d \rfloor} c_{id}.$$

我们可以利用一些dfs的技巧,在dfs整棵树的同时,对每个节点x,以及每个d|a[x],O(1)地求得$\sum_{i=1}^{\lfloor n/d \rfloor} c_{id}$。

于是,时间复杂度是$O(n \max\limits_{1 \le k \le 100,000} \sigma(k))$,其中$\sigma(k)$表示k的因子个数。

KMAX

给定数组a[1], a[2], ..., a[n],以及k<=n。其中k<=100,n<=100000。

令f(i, j)表示子数组a[i], a[i+1], ..., a[j]的前k大值之和(如果不足k个就全取)。

求$\sum_{i=1}^n \sum_{j=i}^n f(i, j)$。

解:从小到大枚举a[x]的位置x,我们统计位于位置x的a[x]可以对多少个子数组的f(i, j)有贡献。

于是我们只需求得在位置x之前,大于a[x]的最近k个位置;以及在位置x之后,大于a[x]的最近k个位置。(可以利用线段树等求得,也可以利用并查集来做。)

统计所有求和即可。

时间复杂度O(nklogn)。

时间: 2024-10-25 04:40:25

Codechef LOCAUG17的相关文章

CodeChef FNCS (分块+树状数组)

题目:https://www.codechef.com/problems/FNCS 题解: 我们知道要求区间和的时候,我们用前缀和去优化.这里也是一样,我们要求第 l 个函数到第 r 个函数 [l, r] 的函数和,那么我们可以用 sum[r] - sum[l-1] 来求得. 由于这个数据量有点大,所以我们将函数分块. 例如样例: 1 3 有5个函数,那么我们分成3块.{ [1 3] , [2 5] }, { [4 5], [3 5] }, { [1 2] }.每一块对应都有一个sum ,这时如

codechef营养题 第三弹

第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Race in Byteland. There are N motorcyclists taking part in the competition. Johnny is watching the race. At the present moment (time 0), Johnny has taken

codechef 营养题 第一弹

第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5XXoERDanUcdxw08SmRj1a5VY1o7jpW1xYv_V1kuYao1Pg4yKdfG4MfNsNAEa codechef problems 第一弹 一.Authentication Failed原题题面Several days ago Chef decided to registe

bzoj4260: Codechef REBXOR

求异或maxmin一般用trie (二进制式的trie).query中找的是满足((x>>i)&1)^A=1,那么A=((x>>i)&1)^1:maxx=max(sumx,sumi)(i=[1,x]).(YY一下异或的性质 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #def

Codechef July Challenge 2014部分题解

Dish Owner(并查集) 链接:http://www.codechef.com/JULY14/problems/DISHOWN/ 题意分析:本题主要操作就是给出0 x y时,拥有第x道菜的厨师与拥有第y道菜的厨师pk,谁拥有的所有菜的其中一道菜(不一定是x或y)的分值比较高谁就获胜,并赢得loser的所有菜.即比较的是每个人分值最高的菜,所以对于非loser的人来说,他的分值最高的菜是不变的.综合题意用并查集易解. #include <cstdio> const int Maxn=100

codechef Row and Column Operations 题解

You are given an N × N grid initially filled by zeros. Let the rows and columns of the grid be numbered from1 to N, inclusive. There are two types of operations can be applied to the grid: RowAdd R X: all numbers in the row R should be increased by X

Codechef Nuclear Reactors 题解

There are K nuclear reactor chambers labelled from 0 to K-1. Particles are bombarded onto chamber 0. The particles keep collecting in the chamber 0. However if at any time, there are more than N particles in a chamber, a reaction will cause 1 particl

codechef Cleaning Up 题解

After a long and successful day of preparing food for the banquet, it is time to clean up. There is a list of n jobs to do before the kitchen can be closed for the night. These jobs are indexed from 1 to n. Most of the cooks have already left and onl

codechef Permutation Cycles 题解

We consider permutations of the numbers 1,..., N for some N. By permutation we mean a rearrangment of the number 1,...,N. For example 2  4  5  1  7  6  3  8 is a permutation of 1,2,...,8. Of course, 1  2  3  4  5  6  7  8 is also a permutation of 1,2