题目链接   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 题解的更多相关文章

  1. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  2. 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]中有多少个数 ...

  3. Codeforces Global Round 2 题解

    Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...

  4. [CodeForces]Educational Round 52

    幸好我没有打这场,我VP的时候在C题就卡死了,我果然还是太菜了. A Vasya and Chocolate 题意:一个巧克力\(c\)元,买\(a\)赠\(b\),一共有\(n\)元,问能买几个巧克 ...

  5. Codeforces Educational Round 37

    Solved   CodeForces 920A Water The Garden   Solved   CodeForces 920B Tea Queue   Solved   CodeForces ...

  6. Codeforces Educational Round 57

    这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...

  7. Codeforces Educational Round 21

    A =w= B qwq C wvw D(multiset) 题意: 有n(n<=1e5)个数,希望通过把一个位置y的数字放到位置x上这个操作,使得新序列的某个前缀和等于总和的一半,问这样的操作是 ...

  8. Codeforces Global Round 3 题解

    这场比赛让我上橙了. 前三题都是大水题,不说了. 第四题有点难想,即使想到了也不能保证是对的.(所以说下面D的做法可能是错的) E的难度是 $2300$,但是感觉很简单啊???说好的歪果仁擅长构造的呢 ...

  9. Educational Round 64 题解

    前言: 这场太难了……我一个紫名只打出两题……(虽说感觉的确发挥不够好) 一群蓝绿名的dalao好像只打了两题都能升分的样子…… 庆幸的是最后A出锅然后unr了>///< 写一波题解纪念这 ...

随机推荐

  1. centos7.4进入单用户模式

    centos7.4进入单用户模式 1 - 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/b ...

  2. Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. 【草稿】JS中如何操作时间

    如何声明时间变量 如何设置时间变量的时.分.秒.毫秒 如何根据字符串变量,声明指定的时间变量 如何比较两个时间变量 代码如下: $(function () { var d = new Date(); ...

  4. Linux学习-使用传统程序语言进行编译的简单范例

    单一程序:印出 HelloWorld 编辑程序代码,亦即原始码 [root@study ~]# vim hello.c <==用 C 语言写的程序扩展名建议用 .c #include <s ...

  5. Linux学习-工作管理 (job control)

    什么是工作管理? 进行工作管理的行为中, 其实每个工作都是目前 bash 的 子进程,亦即彼此之间是有相关性的. 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 b ...

  6. SQL_3_表达式、条件语句与运算

    加号的两种用法: 1.在SELECT子句中使用+号以执行对数据的运算并将结果显示出来. SELECT ITEM WHOLESALE WHOLESALE+0.15 FROM PRICE; 还可以重命名新 ...

  7. 使用spyder3调试python程序

    Ctrl+F5 以Debug模式运行文件 在debug之前记得用%reset 指令清空一下ipython工作空间中的变量,以免影响debug中变量值的查看 无论你是否打断点,都会在第一行语句执行之前中 ...

  8. Selenium WebDriver- 操作JavaScript的confirm弹窗

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...

  9. jQuery效果show()方法

    $("button").click(function(){ $("p").show(); }); Syntax $(selector).show(speed,e ...

  10. 1章 perl入门

    1.标量数据    单变量    数字和字符串两种情况 2.所有数字的内部格式都相同.浮点型   perl中没有应对整数值得运算   . 3.浮点数直接量 数字e表示10的次方标示符 例子:-6.5e ...