做完题目很少有写题解的习惯,强行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<<].cnt0*tree[k<<|].cnt0+tree[k<<].cnt1*tree[k<<|].cnt1)%MOD;
tree[k].cnt1 = (tree[k<<].cnt0*tree[k<<|].cnt1+tree[k<<].cnt1*tree[k<<|].cnt0)%MOD;
tree[k].sum0 = (tree[k<<|].cnt0*tree[k<<].sum0+tree[k<<].cnt0*tree[k<<|].sum0+tree[k<<|].cnt1*tree[k<<].sum1-tree[k<<].cnt1*tree[k<<|].sum1)%MOD;
tree[k].sum1 = (tree[k<<|].cnt0*tree[k<<].sum1-tree[k<<].cnt1*tree[k<<|].sum0+tree[k<<|].cnt1*tree[k<<].sum0+tree[k<<].cnt0*tree[k<<|].sum1)%MOD;
tree[k].sum20 =(tree[k<<|].cnt0*tree[k<<].sum20+tree[k<<].cnt0*tree[k<<|].sum20+*tree[k<<].sum0*tree[k<<|].sum0
+ tree[k<<|].cnt1*tree[k<<].sum21+tree[k<<].cnt1*tree[k<<|].sum21-*tree[k<<].sum1*tree[k<<|].sum1)%MOD;
tree[k].sum21 =(tree[k<<|].cnt1*tree[k<<].sum20+tree[k<<].cnt0*tree[k<<|].sum21+*tree[k<<].sum0*tree[k<<|].sum1
+ tree[k<<|].cnt0*tree[k<<].sum21+tree[k<<].cnt1*tree[k<<|].sum20-*tree[k<<].sum1*tree[k<<|].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)。

代码在这里

Codechef LOCAUG17的更多相关文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  4. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  5. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

  6. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  7. CodeChef FNCS

    题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...

  8. codechef Prime Distance On Tree(树分治+FFT)

    题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...

  9. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

随机推荐

  1. MD5进行文件完整性校验的操作方法

    我组产品包含大量音频和图片资源,MD5主要就用来检测这些资源文件的完整性.主要思路是:先计算出所有资源文件的MD5值,存到一个xml文件中,作为标准的MD5值.然后把这个xml文件放到我们的产品中,每 ...

  2. How to fill the background with image in landscape in IOS? 如何使image水平铺满屏幕

    UIImageView *backgroundImage = [[UIImageView alloc] initWithFrame:self.view.frame];    [backgroundIm ...

  3. Base64的空格 + 问题...

    BASE64  通过url传递到后台 加号变空格的处理方法 解决方法: 前台处理:str.replace("+", "%2B"); (错误) <scrip ...

  4. Linux下Tomcat VM參数改动

    不可行的方法 最初我直接改动catalina.sh, 将JAVA_OPTS变量加上了 -server -Xms1G -Xmx1G -XX:+UserG1GC 最初看起来没啥问题,可是当服务器运行几天后 ...

  5. [Javascript] Use a custom sort function on an Array in Javascript

    Sorting in Javascript with sort uses lexical sorting by default, which means it will sort in alphabe ...

  6. PHP中文分词扩展 SCWS

    1.scws简单介绍 SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统). 这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中 ...

  7. android 4.4以上能够实现的沉浸式状态栏效果

    仅仅有android4.4以及以上的版本号才支持状态栏沉浸效果 先把程序执行在4.4下面的手机上,看下效果: 在4.4以上的效果: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  8. Effective C++ 条款三 尽可能使用const

    参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以 ...

  9. 【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别

    文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...

  10. Android图表AChartEngine

    很多时候项目中我们需要对一些统计数据进行绘制表格,更多直观查看报表分析结果.基本有以下几种方法: 1:可以进行android api进行draw这样的话,效率比较低 2:使用开源绘表引擎,这样效率比较 ...