Educational Codeforces Round 36

Educational Codeforces Round 36

A. Garden

题目描述:给定\(n\)个数,找出能整除\(m\)的最大的数(假设是\(num\)),输出\(\frac{m}{num}\)。

solution

枚举。

时间复杂度:\(O(n)\)

B. Browser

题目描述:有\(n\)个标签页,当前在第\(i\)页,有下面六个操作:

  1. 向左移动一个页面,即\(i-1\)
  2. 向右移动一个页面, 即\(i+1\)
  3. 关闭左边一个页面,即第\(i-1\)个页面
  4. 关闭右边一个页面,即第\(i+1\)个页面
  5. 关闭左边所有页面,假设左边最近一个已关闭的页面为\(L\),则关闭\(L+1\)到\(i-1\)的页面。
  6. 关闭右边所有页面,假设右边最近一个已关闭的页面为\(R\),则关闭\(i+1\)到\(R-1\)的页面。

    标签页删除后保持原来的编号。问最少多少个操作使得最后只剩下\([x, y]\)的标签页。

solution

贪心。最好肯定是移到\(x\)和\(y\)然后把\(x\)左边和\(y\)右边删除,但要仔细判断是否要删,删左边还是右边比较快。

时间复杂度:\(O(1)\)

C. Permute Digits

题目描述:给出两个数字\(A, B\),将\(A\)的数字重新排列,得到一个不超过\(B\)的最大的数,输出那个数。

solution

搜索。从高位开始与\(B\)匹配,如果存在与该位相同的数字,则取该数字,否则取比该数小的最大的数,若没数,则回溯继续搜索。若在某一位取了小于\(B\)对应位的数,那剩下的数字从大到小输出即可。

时间复杂度:\(O(18)\)

D. Almost Acyclic Graph

题目描述:给出一个有向图,问是否能最多删去一条边,使得剩下的图是有向无环图。

solution

找出任意一个环,尝试把环中的边一一删去,看剩下的是否是有向无环图,若是则输出YES。如果都不行,则说明这个环始终存在(若不删这个环的边),输出NO

时间复杂度:\(O(n^2)\)

E. Physical Education Lessons

题目描述:有\(n\)天,开始时每天都是工作日,接下来有\(q\)个修改,每个修改会把\([x, y]\)变成工作日或非工作日,求出每次修改后的工作日天数。

solution

先离散化,然后用线段树维护。

时间复杂度:\(O(qlogq)\)

F. Imbalance Value of a Tree

题目描述:给出一棵有点权的树,求出所有路径的最大值减最小值的差的和。

solution

所有路径的最大值减最小值的差的和等价于所有路径的最大值的和减所有路径的最小值的和。

考虑所有路径最大值的和。将点按点权从小到大排序,假设当前到了第\(i\)个点,前面的点用并查集维护连通性并记录每个联通块的点数。假设\(j\)与\(i\)相连且\(j\)排在\(i\)的前面,因\(i\)是当前的最大值,且\(j\)连通块的点到\(i\)连通块的点必定经过\(i\),所以\(j\)连通块的点到\(i\)连通块的点的路径的最大值为\(i\),更新答案,然后将\(i\)连通块与\(j\)连通块合并为\(i\)连通块,对所有满足条件的\(j\)进行操作。最后就能算出所有路径最大值的和。

同理,将点按点权从大到小排序,用同样的方法进行操作,就能求出所有路径最小值的和。求出所有路径最大值的和与所有路径最小值的和的差即是答案。

时间复杂度:\(O(nlogn)\)

G. Coprime Arrays

题目描述:将\(n\)个数\(a_i\)称为既约系当且仅当\(gcd(a_1, a_2, ..., a_n)=1\)。给出两个数字\(n, k\)。对于\(i(1 \leq i \leq k)\),计算出满足\(1 \leq a_j \leq i (1 \leq j \leq n)\)的既约系\(a_i\)的个数,答案模\(10^9+7\)。假设每个\(i\)的答案为\(b_i\),输出\(\sum_{i=1}^{k}(b_i XOR i) mod (10^9+7)\)。

solution

对于每个\(i\),\(b_i\)可用容斥原理来算。设\(f(x)=x^n\), 则\(b_i=\sum_{S} (-1)^{|S|}f(\left \lfloor \frac{i}{S} \right \rfloor)\),其中\(S\)为小于等于\(i\)的质数的子集。如果把\(S\)换为\(j(1 \leq j \leq i)\),考虑每个\(j\)对\(b_i\)的贡献,发现系数是莫比乌斯函数。即

\[b_i=\sum_{j=1}^{i} \mu(j)f(\left \lfloor \frac{i}{j} \right \rfloor)\]

对于每个\(j\),只有\(j|i\)时,\(\left \lfloor \frac{i}{j} \right \rfloor\)会改变,所以可以设一个数组\(g[i]\),枚举\(j\),\(g[kj]+=\mu(j) (f(k)-f(k-1))\),然后\(g\)的前缀和便是\(b_i\)。

时间复杂度:\(O(nlogn)\)

原文地址:https://www.cnblogs.com/GerynOhenz/p/8319285.html

时间: 2024-10-01 03:04:32

Educational Codeforces Round 36的相关文章

[Educational Codeforces Round 36]E. Physical Education Lessons

[Educational Codeforces Round 36]E. Physical Education Lessons <题意概括> 给定一个长度为$N\left(1\leqslant N\leqslant10^{9}\right)$的区间 $Q\left(1\leqslant Q\leqslant3\cdot10^{5}\right)$次将区间$\left[L,R\right]$Set为0或1,每次Set后输出区间总和 <做法> $10_{9}$的范围显然不可能是朴素线段树

Educational Codeforces Round 36 (Rated for Div. 2)

Educational Codeforces Round 36 (Rated for Div. 2) F. Imbalance Value of a Tree You are given a tree T consisting of n vertices. A number is written on each vertex; the number written on vertex i is ai. Let's denote the function I(x,?y) as the differ

Educational Codeforces Round 36 (Rated for Div. 2) 题解

Educational Codeforces Round 36 (Rated for Div. 2) 题目的质量很不错(不看题解做不出来,笑 Codeforces 920C 题意 给定一个\(1\)到\(n\)组成的数组,只可以交换某些相邻的位置,问是否可以将数组调整为升序的 解题思路 首先如果每个数都能通过交换到它应该到的位置,那么就可以调整为升序的. 但实际上交换是对称的,如果应该在的位置在当前位置前方的数都交换完成,那么整体就是排好序的,因为不可能所有不在相应位置的数都在相应位置的后方.

Educational Codeforces Round 36 (Rated for Div. 2) ---d

D. Almost Acyclic Graph 首先判环可以用拓扑来实现. 暴力解法自然是枚举每一条边,删除,判断是否存在环. 解法一: 对于指向同一个点的边,在拓扑排序中看删除他们事实上是等价的,即那个点入度-1,那么我们枚举所有的点即可. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=1e5+10; 4 int n,m; 5 int tot,fi[inf],nxt[inf],to[inf],in[inf];

Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons(动态开点线段树)

链接: https://codeforces.com/problemset/problem/915/E 题意: This year Alex has finished school, and now he is a first-year student of Berland State University. For him it was a total surprise that even though he studies programming, he still has to atten

【Educational Codeforces Round 36 A】 Garden

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举用哪一个桶就好 [代码] #include <bits/stdc++.h> using namespace std; int n,k,x; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); cin >>

Educational Codeforces Round 36 (Rated for Div. 2) G. Coprime Arrays

求a_i 在 [1,k]范围内,gcd(a_1,a_2...,a_n) = 1的a的数组个数. F(x)表示gcd(a_1,a_2,...,a_n) = i的a的个数 f(x)表示gcd(a_1,a_2,...,a_n) = ki的a的个数(实际上就是i的倍数) f(x) = segma(x | d) F(d) F(x) = segma(x | d) mu(d / x) * f(d) F(1) = segma(d,1,k) mu(d) * f(d) f(d) = (k / d)^n 由于k变化时

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Educational Codeforces Round 26 D. Round Subset(dp)

题目链接:Educational Codeforces Round 26 D. Round Subset 题意: 给你n个数,让你选其中的k个数,使得这k个数的乘积的末尾的0的个数最大. 题解: 显然,末尾乘积0的个数和因子2和因子5的个数有关. 然后考虑dp[i][j]表示选i个数,当前因子5的个数为j时,能得到因子2最多的为多少. 那么对于每个数,记录一下因子2和5的个数,做一些01背包就行了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) me