Codechef LOCAUG17
做完题目很少有写题解的习惯,强行PO一组吧。
比赛链接:https://www.codechef.com/LOCAUG17
给定字符串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)。
代码在这里。
给定长度为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的因子个数。
代码在这里。
给定长度为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)。
代码在这里。
给定一棵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的因子个数。
代码在这里。
给定数组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的更多相关文章
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- CodeChef FNCS
题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
随机推荐
- c++ struct与class的差别
从语法上,在C++中(仅仅讨论C++中).class和struct做类型定义时仅仅有两点差别: (一)默认继承权限. 假设不明白指定,来自class的继承依照private继承处理.来自struct的 ...
- 通过Java反射做实体查询
我们在使用hibernate的时候,查询的时候都会和实体中的一些字段相结合去查询,当然字段少了,还算是比较简单,当字段多了,就不那么容易了,所以就自己写了个方法,根据实体中的字段信息去查询,废话不多说 ...
- 【转载】java sleep和wait的区别的疑惑?
首先,要记住这个差别,"sleep是Thread类的方法,wait是Object类中定义的方法".尽管这两个方法都会影响线程的执行行为,但是本质上是有区别的. Thread.sle ...
- C++中的链式操作
代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...
- 【万里征程——Windows App开发】控件大集合1
加入控件的方式有多种.大家更喜欢哪一种呢? 1)使用诸如 Blend for Visual Studio 或 Microsoft Visual Studio XAML 设计器的设计工具. 2)在 Vi ...
- MVC框架的优缺点
MVC框架的优缺点 解析:M(Model)-模型,V(View)-视图.C(Controller)-控制器 作用:M-处理应用程序数据部分,V-处理数据展示的部分.C-处理用户交互,逻辑功能实现 1. ...
- 序列化模块 json pickel shelve
一.json 模块 1.定义 将字典.列表等内容转换成字符串的过程就是序列化. 操作的数据类型有限,但是可以支持所有编程语言操作. 2.为什么要有序列化? 1.以某种存储形式使自定义对象持久化. 2 ...
- jquery.validate ajax验证
$("#form1").validate({ rules: { ctl00$ContentPlaceHolder1$txtShopName: { remote: { type: & ...
- 从源码理解 ThreadLocal
为每个线程保存各自的拷贝,可以通过在Thread类中定义一个成员变量来保存每个线程值,这样也是线程安全的. 通过定义一个成员变量 sn 来实现,这里并没有使用ThreadLocal类来实现: publ ...
- webpack 构建多页面应用
如何使用webpack构建多页面应用,这是一个我一直在想和解决的问题.网上也给出了很多的例子,很多想法.猛一看,觉得有那么点儿意思,但仔细看也就那样. 使用webpack这个构建工具,可以使我们少考虑 ...