Codeforces Educational Round 33 题解
题目链接 Codeforces Educational Round 33
Problem A
按照题目模拟,中间发现不对就直接输出NO。
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define MP make_pair
- #define fi first
- #define se second
- typedef long long LL;
- int a, b, c, n;
- int main(){
- a = 1, b = 2, c = 3;
- scanf("%d", &n);
- rep(i, 1, n){
- int x;
- scanf("%d", &x);
- if (x != a && x != b) return 0 * puts("NO");
- if (x == a) swap(b, c); else swap(a, c);
- }
- puts("YES");
- return 0;
- }
Problem B
打表然后塞到set里面,然后查找一下。
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define MP make_pair
- #define fi first
- #define se second
- typedef long long LL;
- int c[20];
- int a[100010];
- int n;
- int cnt, et;
- set <int> s;
- int main(){
- rep(i, 1, 10){
- int a = (1 << i) - 1;
- int b = (1 << (i - 1));
- s.insert(a * b);
- }
- rep(i, 1, et) printf("%d\n", c[i]);
- scanf("%d", &n);
- rep(i, 1, n) if (n % i == 0) a[++cnt] = i;
- dec(i, cnt, 1) if (s.count(a[i])) return 0 * printf("%d\n", a[i]);;
- return 0;
- }
Problem C
在每个连通块里面找个权值最小的然后加起来即可。
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define MP make_pair
- #define fi first
- #define se second
- typedef long long LL;
- const int N = 1e6 + 10;
- LL a[N];
- LL now;
- LL ans = 0;
- int vis[N];
- vector <int> v[N];
- int n, m;
- void dfs(int x){
- vis[x] = 1;
- now = min(now, a[x]);
- for (auto u : v[x]){
- if (!vis[u]) dfs(u);
- }
- }
- int main(){
- scanf("%d%d", &n, &m);
- rep(i, 1, n) scanf("%lld", a + i);
- rep(i, 1, m){
- int x, y;
- scanf("%d%d", &x, &y);
- v[x].push_back(y);
- v[y].push_back(x);
- }
- rep(i, 1, n) if (!vis[i]){
- now = 1e10;
- dfs(i);
- ans += now;
- }
- printf("%lld\n", ans);
- return 0;
- }
Problem D
考虑每一天的时候,记录min和max,分别表示钱的下限值和上限值。
如果min都超过d了那肯定不行了,输出-1。
check的时候根据mx是否非负来决定是否更新答案。
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- int n, d;
- int x;
- int mi = 0, mx = 0;
- int ans;
- int main(){
- scanf("%d%d", &n, &d);
- rep(i, 1, n){
- scanf("%d", &x);
- if (x){
- mi += x, mx += x;
- if (mi > d) return 0 * puts("-1");
- mx = min(mx, d);
- }
- else{
- if (mx >= 0) mi = max(mi, 0);
- else ++ans, mx = d, mi = 0;
- }
- }
- printf("%d\n", ans);
- return 0;
- }
Problem E
首先来个预处理,把所有的数的质因子以及指数求出来。
然后对于每一个质因子c,找到他的指数d。
转化成盒子里面放小球的问题。
(盒子不同,小球相同,允许空盒子的情况)
那么当前质因子c对答案的贡献即为$C(y + d - 1, d)$
由于各质因子之间是独立的,所以直接相乘即可。
最后还有-1的情况,对整个ans乘上$2^{y - 1}$即可。
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define MP make_pair
- #define fi first
- #define se second
- typedef long long LL;
- typedef pair <int, int> PII;
- const int N = 2e6 + 10;
- const int mod = 1e9 + 7;
- int fac[N];
- int c[N];
- int val[N];
- int ret, q, x, y;
- int inv[N];
- vector <PII> pri[N];
- inline int Pow(int a, int b, int mod){
- int ret = 1;
- for (; b; b >>= 1, a = 1ll * a * a % mod) if (b & 1) ret = 1ll * ret * a % mod;
- return ret;
- }
- inline int C(int n, int k){ return 1ll * fac[n] * inv[k] % mod * inv[n - k] % mod; }
- void init(){
- fac[0] = 1;
- rep(i, 1, 2e6 + 3) fac[i] = 1ll * fac[i - 1] * i % mod;
- rep(i, 0, 2e6 + 3) inv[i] = Pow(fac[i], mod - 2, mod);
- rep(i, 1, 1e6 + 3) val[i] = i;
- rep(i, 2, 1e6 + 3) if (!c[i]){
- for (int j = i * 2; j <= 1e6 + 3; j += i){
- c[j] = 1;
- int cnt = 0;
- while (val[j] % i == 0) val[j] /= i, ++cnt;
- pri[j].push_back(MP(i, cnt));
- }
- }
- rep(i, 2, 1e6 + 3) if (val[i] > 1)
- pri[i].push_back(MP(i, 1));
- }
- int main(){
- init();
- scanf("%d", &q);
- while (q--){
- int x, y;
- scanf("%d%d", &x, &y);
- ret = Pow(2, y - 1, mod);
- for (auto u : pri[x]){
- int d = u.se;
- ret = 1ll * ret * C(y + d - 1, d) % mod;
- }
- printf("%d\n", ret);
- }
- return 0;
- }
Problem F
对于每一个结点,维护以他为根的子树中深度在[l, r]范围内的所有点的权值的最小值。
一开始每个点在空树的基础上在自己这个深度插入自己的权值。
每个点的插入复杂度为$O(logn)$,因为要开$logn$棵线段树。
然后dfs一遍,做$n$次线段树合并即可。
查询的时候对询问的距离$d$加上当前结点的深度$deep$,这样就构成了一个询问区间$[1, d + deep]$。
为什么左端点是$1$呢,因为当前结点代表的线段树在$[1, deep - 1]$内都没有信息,那么$[1, d + deep]$就可以等效题目的询问区间。
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define MP make_pair
- #define fi first
- #define se second
- typedef long long LL;
- const int N = 1e5 + 10;
- const int M = 2e7 + 10;
- int father[N], deep[N];
- int n, r;
- vector <int> v[N];
- int a[N];
- int t[M], ls[M], rs[M];
- int tot = 0;
- int val[M];
- int m;
- int ans;
- void dfs(int x, int fa, int dep){
- deep[x] = dep;
- father[x] = fa;
- for (auto u : v[x]){
- if (u == fa) continue;
- dfs(u, x, dep + 1);
- }
- }
- int ins(int x, int a, int b, int c, int p){
- int y = ++tot;
- val[y] = min(val[x], p);
- if (a == b) return y;
- int mid = (a + b) >> 1;
- if (c <= mid) ls[y] = ins(ls[x], a, mid, c, p), rs[y] = rs[x];
- else ls[y] = ls[x], rs[y] = ins(rs[x], mid + 1, b, c, p);
- return y;
- }
- int ask(int x, int a, int b, int d){
- if (b <= d) return val[x];
- int mid = (a + b) >> 1, t = ask(ls[x], a, mid, d);
- if (d > mid) t = min(t, ask(rs[x], mid + 1, b, d));
- return t;
- }
- int merge1(int x, int y, int a, int b){
- if (!x || !y) return x + y;
- int z = ++tot;
- val[z] = min(val[x], val[y]);
- if (a == b) return z;
- int mid = (a + b) >> 1;
- ls[z] = merge1(ls[x], ls[y], a, mid);
- rs[z] = merge1(rs[x], rs[y], mid + 1, b);
- return z;
- }
- void work(int x, int fa){
- for (auto u : v[x]){ if (u == fa) continue; work(u, x); }
- for (auto u : v[x]){
- if (u == fa) continue;
- t[x] = merge1(t[x], t[u], 1, n);
- }
- }
- int main(){
- scanf("%d%d", &n, &r);
- rep(i, 1, n) scanf("%d", a + i);
- rep(i, 0, 2e7) val[i] = 2147000000;
- rep(i, 2, n){
- int x, y;
- scanf("%d%d", &x, &y);
- v[x].push_back(y);
- v[y].push_back(x);
- }
- dfs(r, 0, 1);
- rep(i, 1, n) t[i] = ins(0, 1, n, deep[i], a[i]);
- work(r, 0);
- ans = 0;
- scanf("%d", &m);
- while (m--){
- int x, y;
- scanf("%d%d", &x, &y);
- x = ((x + ans) % n) + 1;
- y = ((y + ans) % n);
- y += deep[x];
- if (y > n) y = n;
- printf("%d\n", ans = ask(t[x], 1, n, y));
- }
- return 0;
- }
Codeforces Educational Round 33 题解的更多相关文章
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- Codeforces Beta Round #62 题解【ABCD】
Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...
- Codeforces Global Round 2 题解
Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...
- [CodeForces]Educational Round 52
幸好我没有打这场,我VP的时候在C题就卡死了,我果然还是太菜了. A Vasya and Chocolate 题意:一个巧克力\(c\)元,买\(a\)赠\(b\),一共有\(n\)元,问能买几个巧克 ...
- Codeforces Educational Round 37
Solved CodeForces 920A Water The Garden Solved CodeForces 920B Tea Queue Solved CodeForces ...
- Codeforces Educational Round 57
这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...
- Codeforces Educational Round 21
A =w= B qwq C wvw D(multiset) 题意: 有n(n<=1e5)个数,希望通过把一个位置y的数字放到位置x上这个操作,使得新序列的某个前缀和等于总和的一半,问这样的操作是 ...
- Codeforces Global Round 3 题解
这场比赛让我上橙了. 前三题都是大水题,不说了. 第四题有点难想,即使想到了也不能保证是对的.(所以说下面D的做法可能是错的) E的难度是 $2300$,但是感觉很简单啊???说好的歪果仁擅长构造的呢 ...
- Educational Round 64 题解
前言: 这场太难了……我一个紫名只打出两题……(虽说感觉的确发挥不够好) 一群蓝绿名的dalao好像只打了两题都能升分的样子…… 庆幸的是最后A出锅然后unr了>///< 写一波题解纪念这 ...
随机推荐
- jvm架构以及Tomcat优化
JVM栈 JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean.char.byte.short.i ...
- markdown快捷键
分组 功能 操作 快捷键 设置标题 一级标题 Heading1 Ctrl+1 二级标题 Heading2 Ctrl+2 三级标题 Heading3 Ctrl+3 四级标题 Heading4 Ctrl+ ...
- Linux网络编程:客户端/服务器的简单实现
一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...
- myeclipse中hibernate生成映射文件
在hibernate中,每个数据表对应的其实是一个实体类,每个实体类有一个对应的hbm.xml配置文件匹配,myeclipse中有个MyEclipse Database Explorer视图,它提供了 ...
- MIME类型-服务端验证上传文件的类型
MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件. web服务器使用MIME来说明发送数据的种类, ...
- webdriver高级应用- 改变一个页面对象的属性值
适用于一些无法操作的元素,可以直接改他的属性从而操作,代码如下: #encoding=utf-8 from selenium import webdriver import unittest impo ...
- 初学-BeautifulSoup爬取豆瓣页面
# -*- coding: utf-8 -*-import osimport urllibimport urllib2from bs4 import BeautifulSoup headers = { ...
- day01_14.遍历数组
<?php $a = array('a','b','c'); print_r($a); ?> 输出结果:Array ( [0] => a [1] => b [2] => ...
- 《Effective Java》笔记 :(一)创建和销毁对象
一 .考虑用静态工厂方法代替构造器 1. 静态工厂方法与设计模式中的工厂方法模式不同,注意不要混淆 例子: public static Boolean valueOf(boolean b){ retu ...
- [svn学习篇]svn使用教程
http://www.cnblogs.com/longshiyVip/p/4905901.html http://blog.csdn.net/dily3825002/article/details/6 ...