做完题目很少有写题解的习惯,强行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)。

代码在这里

最新文章

  1. &amp;&amp;&amp;&amp;数组去重方法总结&amp;&amp;&amp;&amp;&amp;
  2. 顶点缓存对象(VBO)
  3. Tomcat长出现的内存溢出问题
  4. C#通过反射获取上层调用方法信息
  5. 创意欣赏:20幅字体排版(Typography)素描
  6. 《c程序设计语言》读书笔记--大于8 的字符串输出
  7. uistepper on ios versions prior to 5.0
  8. JS 截取字符串函数
  9. poj 3616 Milking Time DP
  10. BestCoder Round #46
  11. 2015西雅图微软总部MVP峰会
  12. Windows 2008服务器环境PHP连接SQL Server数据库的配置及连接方法
  13. Hibernate中事务小案例
  14. Linux 目录与文件管理
  15. Python中求1到20平方的两种方法
  16. 使用Gson将对象类转成Json对象时出现\u003d的问题
  17. 使用IDEA部署项目到远程服务器
  18. npm无反应的问题&amp;npm常用命令
  19. 机器学习技法笔记:02 Dual Support Vector Machine
  20. 【每日一题】Flooded! UVA - 815 模拟阅读格式题

热门文章

  1. 关于HTML中文乱码问题
  2. Andriod DiskLruCache的使用案例
  3. Monkey源代码分析之事件注入
  4. [ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)
  5. 【转载】高性能IO模型浅析
  6. 【BZOJ】1007 水平可见直线
  7. Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****
  8. springCloud和docker笔记(1)——微服务架构概述
  9. SequenceFile
  10. yum lock