Codeforces Round Edu 36
A、B、C
略
D(dfs+强连通分量)
题意:
给出一个n(n<=500)点m(m<=100000)边的有向图,问能否通过删去一条边使得该图无环。
分析:
最简单的想法就是枚举一条边删去然后判断图是否有环,这样是O(m^2)的不能接受
仔细想想,如果图中环数<=1,则YES;如果图中环数>=2,那么只有当它们的交恰好是一条边时,才是YES,其它情况都是NO
所以我们首先可以通过dfs找到一个环(vis[u]=0,1,2分别表示点u没遍历到、遍历到了在栈里、遍历过了已经出栈了),然后枚举环上的边进行删除,然后判断剩余的图中是否有环即可
这样时间复杂度是O(n(n+m))的
至于判断是否有环,我们可以求强连通分量的数目,用bitset去优化,那么时间复杂度就是O(n*n*n/64)
E(离散化+线段树)
略
F(套路+并查集)
题意:
给你一个树(n<=2e6),每个点都有自己的点权,I(x,y)表示x与y路径之间的所有点最大值与最小值的差,求
分析:
将最大值与最小值分别计算,以最大值为例,即计算对于每个点u,有多少个点对过u并且以v[u]为最大值
这就是将序列上的经典问题推广到树上来,原来的序列上的这个问题我是用set做的,但这种方法不能推广到树上来
其实序列上的该问题还有一个套路,就是从小到大往对应位置上加,那么对于现在刚加入的x,能凑成区间包含他作为最大值的一定是x左边连续存在的点和x右边连续存在的点,这我们可以用并查集来维护
推广到树上,现在从小到大加入x,那么能过x的点对一定是在x周围那些连续存在的点里面挑,这也可以用并查集来完成,不断把x的集合与四周相邻点的集合merge就行了
void merge(int x,int y,int value)
{
if(!f[x]||!f[y]) return;
x=find(x),y=find(y);
s+=1LL*sz[x]*sz[y]*value;
f[x]=y;
sz[y]+=sz[x];
}
long long solve()
{
for(int i=;i<=n;++i) pos[i]=i;
sort(pos+,pos+n+,cmp);
for(int i=;i<=n;++i) f[i]=,sz[i]=;
s=;
for(int i=;i<=n;++i)
{
int x=pos[i];
f[x]=x,sz[x]=;
for(int j=;j<g[x].size();++j) merge(x,g[x][j],a[x]);
}
return s;
}
G(莫比乌斯反演)
题意:
给定一个n和k(均不超过2e6),定义b(i)表示gcd(a1,a2,...,an)=1的序列个数,其中1<=ai<=i,现在要求出b(1) b(2) ... b(k)
分析:
我们先确定上界i,那么F(x)表示gcd是x倍数的序列个数,f(x)表示gcd是x的序列个数
显然F(x)=[i/x]^n
那么有F(d)=Σf(n) (d|n) ,反演一下有f(d)=Σμ(n/d)F(n) (d|n)
那么b(i)=f(1)=Σμ(j)F(j) (1<=j<=i)
那么对于确定上界i,我们就通过莫比乌斯反演求出了b(i)的值,但我们现在要求出所有的b(1) .. b(k)
我们考察相邻的b(i-1)和b(i),发现[i/x]^n和[(i-1)/x]^n不一样当且仅当i是n的因数
于是我们可以枚举因数,做出每一项与前一项的差值,然后求个前缀和就可以得到每一个b(i)了
时间复杂度O(klogk)
Codeforces Round Edu 36的更多相关文章
- CodeForces Round
CodeForces Round 199 Div2 完了,这次做扯了,做的时候有点发烧,居然只做出来一道题,差点被绿. My submissions # When Who Problem ...
- Codeforces Codeforces Round #484 (Div. 2) D. Shark
Codeforces Codeforces Round #484 (Div. 2) D. Shark 题目连接: http://codeforces.com/contest/982/problem/D ...
- Codeforces Round #452 (Div. 2) A B C
Codeforces Round #452 (Div. 2) A Splitting in Teams 题目链接: http://codeforces.com/contest/899/problem/ ...
- Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题
Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题 [Problem Description] 总共两次询 ...
- Codeforces Round #519 by Botan Investments(前五题题解)
开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...
- Codeforces Round #781(C. Tree Infection)
Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
随机推荐
- dnsquery - 使用解析程序查询域名服务器
SYNOPSIS(总览) dnsquery [-n nameserver ] [-t type ] [-c class ] [-r retry ] [-p period ] [-d ] [-s ] [ ...
- ubuntu命令行转换图片像素大小
convert -resize 512x256 00433.png 00001.png 1.512和256之间是x(就是字母那个x),用' * '反而会报错 2.这个命令会按照原图的比例进行转换 3. ...
- java中等待所有线程都执行结束
转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原 ...
- python3写冒泡排序
1.概念理解: 冒泡排序:可以简单的理解为是列表中相近的元素,两两比较,小的在前面.最多需要len()-1次排序. 2.例子:a=[11,7,4,56,35,0] 3.代码实现: 4.输出结果: 第1 ...
- Java Thread.join()详解
一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 一.使用方式. join是Thread类的 ...
- js div大小随意伸缩
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Linux文件查找find和locate
目 录 第1章 locate文件查找 1 1.1 概述 1 1.2 locate文件查找的特性 1 第2章 文件查找概述 1 第3章 1 3.1 文件名查找 1 3 ...
- Linux系统权限
目 录 第1章 权限描述 1 1.1 权限描述 1 1.2 文件权限对应表 1 1.3 三种角色 1 1.4 文件和用户以及组之间的关系 1 第2章 修改权限命令chmo ...
- vue 框架原理
参考:https://segmentfault.com/a/1190000006599500#articleHeader4 记录自己的理解: 核心的响应原理通过Object.definePropert ...
- vue 运行时 + 编译器 vs. 只包含运行时
https://cn.vuejs.org/v2/guide/installation.html#运行时-编译器-vs-只包含运行时 文档中的这个地方,说的不清楚 If you need to comp ...