Codeforces Round #525 (Div. 2) Solution
A. Ehab and another construction problem
Water.
#include <bits/stdc++.h>
using namespace std; int x; int main()
{
while (scanf("%d", &x) != EOF)
{
int a = -, b = -;
for (int i = ; i <= x && a == - && b == -; ++i)
{
for (int j = i; j <= x; ++j)
{
if (j % i == && i * j > x && j / i < x)
{
a = j, b = i;
break;
}
}
}
if (a == -) puts("-1");
else printf("%d %d\n", a, b);
}
return ;
}
B. Ehab and subtraction
Water.
#include <bits/stdc++.h>
using namespace std; #define N 100010
int n, k; int main()
{
while (scanf("%d%d", &n, &k) != EOF)
{
priority_queue <int, vector <int>, greater <int> > q;
for (int i = , x; i <= n; ++i)
{
scanf("%d", &x);
if (x) q.push(x);
}
int add = ;
for (int kk = ; kk <= k; ++kk)
{
while (!q.empty() && q.top() == add) q.pop();
if (q.empty()) puts("");
else
{
int top = q.top(); q.pop();
top -= add;
add += top;
printf("%d\n", top);
}
}
}
return ;
}
C. Ehab and a 2-operation task
Solved.
题意:
有两种操作
$将前j个数全都加上x$
$将前j个数全都mod x$
要求用不超过$n + 1 次操作,使得给定序列变成严格的上升序列$
思路:
先全部加上一个较大的数$D$
然后每一次模一个数$D + a_i - i之后使得a_i 变成 i, 并且这样可以保证D + a_i - i > i - 1 只要D足够大$
那么前面已经弄好的数不会受到影响
操作数刚好$n + 1$
#include <bits/stdc++.h>
using namespace std; #define N 2010
int d = (int)5e5;
int n; int main()
{
while (scanf("%d", &n) != EOF)
{
printf("%d\n", n + );
printf("1 %d %d\n", n, d);
for (int i = , x; i <= n; ++i)
{
scanf("%d", &x);
printf("2 %d %d\n", i, (x + d - i));
}
}
return ;
}
D. Ehab and another another xor problem
Upsolved.
题意:
交互题。
要求猜两个数 $(a, b)$
每次可以给出询问$c, d$
根据$a \oplus c 和 b \oplus d 的大小关系给出1 0 -1 三种状态$
要求根据这些关系得出$(a, b), 询问次数<= 62$
思路:
此处我们约定$(x, y) 表示给出询问(? x y)$
先考虑$a == b 的情况,那么我们只需要每一次按位给出询问$
$此处约定i 表示第i位 , 给出询问 (1 << i, 0) 根据所给结果即可判断当前位为0还是1$
注意到对于两个数$a, b 根据二进制拆分之后,如果它们最高位所在位置不同$
那么谁的最高位高谁就更大
$那么我们从高位往低位确定,用aa, bb 表示a, b 中高位已经确定的数$
我们用$zero 表示 a 和 b 的大小关系,这个可以通过给出询问(0, 0) 得到$
$这样就可以每一次消除前面高位影响,判断当前位是否相同,或者大小关系$
$注意到如果当前位相同(即当前状态和zero状态相同),那么对于下面的低位, zero 的状态是不会变的$
$那么我们再给出询问(1 <<i , 0)即可知道当前位的大小$
$否则, 如果当前位不同,根据当前的状态和zero 状态的比较也可以知道当前位二者是1还是0$
$如果当前状态和zero不同,那么如果当前状态是1,那么a = 0, b = 1 (此处指当前位)$
$反之同理,此处指a和b的当前位$
#include <bits/stdc++.h>
using namespace std;
int a, b, st, zero;
int d = ( << ) - ; int main()
{
a = , b = ;
puts("? 0 0");
fflush(stdout);
scanf("%d", &zero);
for (int i = ; i >= ; --i)
{
if (zero == )
{
printf("? %d %d\n", a | ( << i), b);
fflush(stdout);
scanf("%d", &st);
if (st == -) a |= << i, b |= << i;
}
else
{
printf("? %d %d\n", a | ( << i), b | ( << i));
fflush(stdout);
scanf("%d", &st);
if (st == zero)
{
printf("? %d %d\n", a | ( << i), b);
fflush(stdout);
scanf("%d", &st);
if (st == -) a |= << i, b |= << i;
}
else
{
if (st == ) b |= << i;
else a |= << i;
printf("? %d %d\n", a, b);
fflush(stdout);
scanf("%d", &zero);
}
}
}
printf("! %d %d\n", a, b);
fflush(stdout);
}
E. Ehab and a component choosing problem
Upsolved.
题意:
找出$k个连通块,将所有元素放进s(set)中,求\frac{\sum_{u \in s} a_u}{k}最大$
$如果有多解,要让k也更大$
思路:
注意到$max(a_1, a_2, a_3..) >= average(a_1, a_2, a_3) 当且仅当a_1 == a_2, a_1 == a_3.. 的情况下等号成立$
那么显然每个连通块中的$\sum a_u 是相同的$
$dp求解即可$
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 300010
int n, a[N];
vector <int> G[N];
ll dp[N], ans = -0x3f3f3f3f3f3f3f3f, k; void DFS(int u, int fa, int p)
{
dp[u] = a[u];
for (auto v : G[u]) if (v != fa)
{
DFS(v, u, p);
dp[u] += max(dp[v], 0ll);
}
if (p)
ans = max(ans, dp[u]);
else if (dp[u] == ans)
{
dp[u] = ;
++k;
}
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) G[i].clear();
for (int i = ; i <= n; ++i) scanf("%d", a + i);
for (int i = , u, v; i < n; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
DFS(, , );
DFS(, , );
printf("%lld %lld\n", ans * k, k);
}
return ;
}
F. Ehab and a weird weight formula
Upsolved.
题意:
给出一棵树,要求构造一棵树使得
$deg_u \cdot a_u add to w$
$\lceil log_2(dist(u, v)) \rceil \cdot min(a_u, a_v) 对于每个edge(u, v) 都加起来$
$dist(u, v) 指的是 原数中两点之间的简单路径$
给出的原树有一个限制就是,对于每个$a_u, 最小值的唯一的$
并且对于每一个非最小值的$a_u, 都至少有一个邻居 使得a_v < a_u$
思路:
如果将最小的$a_u作为根, 那么往下走,a_u 是递增的$
证明:
假如存在某一个点$a_u < a_{fa[u]}$
那么对于这个点,肯定有一个儿子使得$a_u > a_{son[u]}$
那么这个儿子也同理,直到最后一个叶子结点便不满足
因为$\lceil log_2(dist(u, v)) \rceil 这个式子的特性,所以在一定范围内的 dist(u, v) 这个值是相同的$
$那么我们肯定选取最小的那个来乘, 因为祖先们都是比自己小$
$而且,我们肯定选取较短路径往上爬, 倍增找祖先即可$
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 500010
int n, a[N], root;
vector <int> G[N];
int fa[][N];
ll res; void DFS(int u)
{
for (int i = ; i < ; ++i)
fa[i][u] = fa[i - ][fa[i - ][u]];
ll tmp = 0x3f3f3f3f3f3f3f3f; int d = ;
for (; fa[d][u]; ++d)
tmp = min(tmp, 1ll * (d + ) * a[fa[d][u]] + a[u]);
tmp = min(tmp, 1ll * (d + ) * a[root] + a[u]);
if (u != root) res += tmp;
for (auto v : G[u]) if (v != fa[][u])
{
fa[][v] = u;
DFS(v);
}
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) G[i].clear();
memset(fa, , sizeof fa);
root = ; res = ;
for (int i = ; i <= n; ++i)
{
scanf("%d", a + i);
if (a[root] > a[i]) root = i;
}
for (int i = , u, v; i < n; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
DFS(root);
printf("%lld\n", res);
}
return ;
}
Codeforces Round #525 (Div. 2) Solution的更多相关文章
- Codeforces Round #525 (Div. 2)
Codeforces Round #525 (Div. 2) 哎,忍不住想吐槽一下,又要准备训练,又要做些无聊的事,弄得我都想退出了. 好好的训练不好么???? 只能做出两道水题,其实C题,感觉做出来 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #466 (Div. 2) Solution
从这里开始 题目列表 小结 Problem A Points on the line Problem B Our Tanya is Crying Out Loud Problem C Phone Nu ...
- 老年OIer的Python实践记—— Codeforces Round #555 (Div. 3) solution
对没错下面的代码全部是python 3(除了E的那个multiset) 题目链接:https://codeforces.com/contest/1157 A. Reachable Numbers 按位 ...
- Codeforces Round #545 (Div. 1) Solution
人生第一场Div. 1 结果因为想D想太久不晓得Floyd判环法.C不会拆点.E想了个奇奇怪怪的set+堆+一堆乱七八糟的标记的贼难写的做法滚粗了qwq靠手速上分qwqqq A. Skyscraper ...
- Codeforces Round 500 (Div 2) Solution
从这里开始 题目地址 瞎扯 Problem A Piles With Stones Problem B And Problem C Photo of The Sky Problem D Chemica ...
- Codeforces Round #525 (Div. 2)-A/B/C/E
http://codeforces.com/contest/1088/problem/A 暴力一波就好了. //题解有O(1)做法是 (n-n%2,2) #include<iostream> ...
- Codeforces Round #525 (Div. 2) F. Ehab and a weird weight formula
F. Ehab and a weird weight formula 题目链接:https://codeforces.com/contest/1088/problem/F 题意: 给出一颗点有权值的树 ...
- Codeforces Round #525 (Div. 2)E. Ehab and a component choosing problem
E. Ehab and a component choosing problem 题目链接:https://codeforces.com/contest/1088/problem/E 题意: 给出一个 ...
随机推荐
- Flask使用Flask-SQLAlchemy操作MySQL数据库
前言: Flask-SQLAlchemy是一个Flask扩展,简化了在Flask程序中使用SQLAlchemy的操作.SQLAlchemy是一个很强大的关系型数据库框架,支持多种数据库后台.SQLAl ...
- 软工个人博客作业Week 1
问题1:在瀑布模型中提到模型,模型(模拟版本)和原型有什么不同,如果与原型有同样的功能,那为什么称之为模型?如果没有同样的功能,又是怎么测试那些程序的? 问题2:怎样才能高效率的广泛而深入地了解用户的 ...
- myeclipse从SVN检出项目报错
今天是在公司实习的第一天,从SVN服务器检出项目后发现报错. 解决方法: 1. 右键项目,选择属性properties-->选择resource-->将others选中并换为UTF-8 2 ...
- QT 子窗口退出全屏
m_pWidget代表子窗口, 子窗口显示全屏: m_pWidget->setWindowFlags(Qt::Dialog); m_pWidget->showFullScreen(); 子 ...
- SDN网络虚拟化、资源映射等相关论文粗读
1. Control Plane Latency with SDN Network Hypervisors: The Cost of Virtualization 年份:2016 来源:IEEE NE ...
- Docker 方式运行 sonarqube
From 平台测试部同事的 ppt 感谢. 拉取镜像 docker pull postgres docker pull sonarqube 运行镜像 docker run --name db --re ...
- jquery 祖先、子孫、同級
jquery向上遍歷,獲取祖先元素 parent()獲取選中元素的父 parents()獲取選中元素的所有的祖先節點,一直到文檔的根元素<html> parentUntil(“元素1”)獲 ...
- 2.18比赛(T2,T3留坑)
2.18比赛(T2,T3留坑) pdf版题面 pdf版题解 超越一切(ak) [题目描述] 夏洛可得到一个(h+1)×(w+1)的巧克力,这意味着她横着最多可 以切 h 刀,竖着最多可以切 w 刀 她 ...
- 黑客又多一款喜爱工具:知名 Windows Phone 破解工具 WPinternals 开源了
导读 Windows Phone 发布后,黑客 HeathCliff74(René Lergner)写了一个软件 WPinternals,利用它可以对 Windows Phone 进行破解,这使他成为 ...
- const,static,volatile关键字的作用
const关键字: 1.欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了: 2.对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为 ...