Description

题库链接:

Day1 T1 铺设道路
Day1 T2 货币系统
Day1 T3 赛道修建
Day2 T1 旅行
Day2 T2 填数游戏
Day2 T3 保卫王国

Solution

题解在这儿

Code

Day1 T1 铺设道路

#include <bits/stdc++.h>
using namespace std; int n, a, la, ans; int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
if (a > la) ans += a-la;
la = a;
}
printf("%d\n", ans);
return 0;
}

Day1 T2 货币系统

#include <bits/stdc++.h>
using namespace std; int t, n, f[25005], a[105], ma, ans; void work() {
memset(f, ma = 0, sizeof(f));
scanf("%d", &n); ans = n, f[0] = 1;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), ma = max(a[i], ma);
for (int i = 1; i <= n; i++)
for (int j = a[i]; j <= ma; j++)
if (f[j-a[i]]) f[j]++;
for (int i = 1; i <= n; i++)
ans -= f[a[i]] > 1;
printf("%d\n", ans);
}
int main() {
scanf("%d", &t);
while (t--) work();
return 0;
}

Day1 T3 赛道修建

#include <bits/stdc++.h>
using namespace std;
const int N = 50000+5, inf = 500000000; int n, m, u, v, l, cnt, mid, vis[N];
struct tt {int nxt, to, dis; } edge[N<<1];
int path[N], top;
multiset<int> q[N];
multiset<int>::iterator it; void add(int u, int v, int c) {
edge[++top] = (tt){path[u], v, c};
path[u] = top;
}
int dfs(int u, int c) {
vis[u] = 1;
if (q[u].size()) q[u].clear();
for (int i = path[u], l; i; i = edge[i].nxt)
if (!vis[edge[i].to]) {
l = dfs(edge[i].to, edge[i].dis);
if (l >= mid) ++cnt;
else q[u].insert(l);
}
int ans = 0;
while (!q[u].empty()) {
it = q[u].lower_bound(mid-(*q[u].begin()));
if (it == q[u].begin() && q[u].count(*q[u].begin()) == 1) ++it;
if (it != q[u].end()) ++cnt, q[u].erase(q[u].find(*it));
else ans = max(ans, *q[u].begin());
q[u].erase(q[u].find(*q[u].begin()));
}
return ans+c;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i < n; i++) {
scanf("%d%d%d", &u, &v, &l);
add(u, v, l), add(v, u, l);
}
int ans, R = inf, L = 0;
while (L <= R) {
mid = (L+R)>>1;
cnt = 0;
for (int i = 1; i <= n; i++) vis[i] = 0;
if (dfs(1, 0) >= mid) ++cnt;
if (cnt >= m) ans = mid, L = mid+1;
else R = mid-1;
}
printf("%d\n", ans);
return 0;
}

Day2 T1 旅行

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N = 5000+5; int n, m, a[N], b[N], ku, kv, t, ans[N], kp[N], vis[N];
vector<int> to[N]; void update() {
if (ans[1] == 0) memcpy(ans, kp, sizeof(ans));
else for (int i = 1; i <= n; i++)
if (ans[i] != kp[i]) {
if (ans[i] > kp[i]) memcpy(ans, kp, sizeof(ans));
return;
}
}
bool dfs(int u, int fa) {
if (vis[u]) return false;
kp[++t] = u; vis[u] = 1;
for (int i = 0, sz = to[u].size(), v; i < sz; i++)
if ((v = to[u][i]) != fa && !(u == ku && v == kv || u == kv && v == ku))
if (!dfs(v, u)) return false;
return true;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a[i], &b[i]);
to[a[i]].pb(b[i]), to[b[i]].pb(a[i]);
}
for (int i = 1; i <= n; i++) sort(to[i].begin(), to[i].end());
if (n == m+1) {dfs(1, 0); update(); }
else for (int i = 1; i <= m; i++) {
ku = a[i], kv = b[i]; t = 0;
memset(vis, 0, sizeof(vis));
if (dfs(1, 0) && t == n) update();
}
for (int i = 1; i <= n; i++) printf("%d%c", ans[i], " \n"[i == n]);
return 0;
}

Day2 T2 填数游戏

#include <bits/stdc++.h>
using namespace std;
const int N = 1000000+15, yzh = 1000000007; int n, m, ans, s[N], a[N]; int main() {
scanf("%d%d", &n, &m);
if (n > m) swap(n, m);
if (n == 1) {
ans = 1;
for (int i = 1; i <= m; i++) ans = 2ll*ans%yzh;
} else if (n == 2) {
ans = 4;
for (int i = 1; i < m; i++) ans = 3ll*ans%yzh;
} else {
s[n+m] = 1;
for (int i = n+m-1; i >= 1; i--)
a[i] = 2+(i <= n)+(i <= m),
s[i] = 1ll*s[i+1]*a[i]%yzh;
(ans += 4ll*s[3]%yzh) %= yzh;
(ans += 4ll*(a[4]+1)*s[5]%yzh) %= yzh;
for (int i = 4; i <= n; i++) {
(ans += 2ll*(3+(i <= m))*(a[i+1]+1)*s[i+2]%yzh) %= yzh;
}
(ans += 2ll*(a[n+1]+1)*s[n+2]%yzh) %= yzh;
for (int i = 4; i <= m; i++) {
(ans += 2ll*(3+(i <= n))*(a[i+1]+1)*s[i+2]%yzh) %= yzh;
}
(ans += 2ll*(a[m+1]+1)*s[m+2]%yzh) %= yzh;
}
printf("%d\n", ans);
return 0;
}

Day2 T3 保卫王国

#include <bits/stdc++.h>
#define ll long long
#define min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;
const int N = 100000+5;
const ll inf = 1e10+1; char rubbish_bin[3];
int n, m, lim, p[N], u, v, path[N], top, x, y, fa[N][20], dep[N];
ll dp[N][2], f[N][20][2][2];
struct tt {
int to, nxt;
} edge[N<<1]; void read(int &x) {
x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = (x<<1)+(x<<3)+ch-48, ch = getchar();
}
void add(int u, int v) {
edge[++top] = (tt){v, path[u]};
path[u] = top;
}
void dfs(int u, int f, int d) {
dep[u] = d, fa[u][0] = f, dp[u][1] = p[u];
for (int i = 1; i <= lim; i++)
fa[u][i] = fa[fa[u][i-1]][i-1];
for (int i = path[u], v; i; i = edge[i].nxt)
if ((v = edge[i].to) != f) {
dfs(v, u, d+1);
dp[u][0] += dp[v][1];
dp[u][1] += min(dp[v][0], dp[v][1]);
}
}
ll cal(int u, int x, int v, int y) {
if (dep[u] < dep[v]) swap(u, v), swap(x, y);
ll u0, u1, v0, v1, t0, t1, l0, l1; int lca;
if (x) u1 = dp[u][1], u0 = inf;
else u1 = inf, u0 = dp[u][0];
if (y) v1 = dp[v][1], v0 = inf;
else v1 = inf, v0 = dp[v][0];
for (int i = lim; i >= 0; i--)
if (dep[fa[u][i]] >= dep[v]) {
t0 = u0, t1 = u1;
u0 = min(t0+f[u][i][0][0], t1+f[u][i][1][0]);
u1 = min(t0+f[u][i][0][1], t1+f[u][i][1][1]);
u = fa[u][i];
}
if (u == v) {
lca = u;
if (y) l0 = inf, l1 = u1;
else l0 = u0, l1 = inf;
} else {
for (int i = lim; i >= 0; i--)
if (fa[u][i] != fa[v][i]) {
t0 = u0, t1 = u1;
u0 = min(t0+f[u][i][0][0], t1+f[u][i][1][0]);
u1 = min(t0+f[u][i][0][1], t1+f[u][i][1][1]);
t0 = v0, t1 = v1;
v0 = min(t0+f[v][i][0][0], t1+f[v][i][1][0]);
v1 = min(t0+f[v][i][0][1], t1+f[v][i][1][1]);
u = fa[u][i], v = fa[v][i];
}
lca = fa[u][0];
l0 = dp[lca][0]-dp[u][1]-dp[v][1]+u1+v1;
l1 = dp[lca][1]-min(dp[u][0], dp[u][1])-min(dp[v][0], dp[v][1])+min(u0, u1)+min(v0, v1);
}
for (int i = lim; i >= 0; i--)
if (fa[lca][i]) {
t0 = l0, t1 = l1;
l0 = min(t0+f[lca][i][0][0], t1+f[lca][i][1][0]);
l1 = min(t0+f[lca][i][0][1], t1+f[lca][i][1][1]);
lca = fa[lca][i];
}
if (min(l0, l1) < inf) return min(l0, l1);
else return -1;
}
int main() {
read(n), read(m); scanf("%s", rubbish_bin); lim = log(n)/log(2);
for (int i = 1; i <= n; i++) read(p[i]);
for (int i = 1; i < n; i++) {
scanf("%d%d", &u, &v);
add(u, v), add(v, u);
}
dfs(1, 0, 1);
for (int u = 1; u <= n; u++) {
f[u][0][0][0] = inf;
f[u][0][1][0] = dp[fa[u][0]][0]-dp[u][1];
f[u][0][0][1] = f[u][0][1][1] = dp[fa[u][0]][1]-min(dp[u][0], dp[u][1]);
}
for (int i = 1; i <= lim; i++)
for (int u = 1; u <= n; u++) {
int t = fa[u][i-1];
f[u][i][0][0] = min(f[u][i-1][0][0]+f[t][i-1][0][0], f[u][i-1][0][1]+f[t][i-1][1][0]);
f[u][i][0][1] = min(f[u][i-1][0][0]+f[t][i-1][0][1], f[u][i-1][0][1]+f[t][i-1][1][1]);
f[u][i][1][0] = min(f[u][i-1][1][0]+f[t][i-1][0][0], f[u][i-1][1][1]+f[t][i-1][1][0]);
f[u][i][1][1] = min(f[u][i-1][1][0]+f[t][i-1][0][1], f[u][i-1][1][1]+f[t][i-1][1][1]);
}
while (m--) {
read(u), read(x), read(v), read(y);
printf("%lld\n", cal(u, x, v, y));
}
return 0;
}

[NOIp 2018]all的更多相关文章

  1. [OI]Noip 2018总结(普及)

    考砸了,还有原谅我代码十分有限的可读性. 一个人的真正伟大之处就在于他能够认识到自己的渺小.——保罗 从一年前初一九月到现在18年10月接触OI已经有一年了.几次模拟赛也自我感觉良好,都过了一等的线, ...

  2. noip 2018 D1T3 赛道修建

    noip 2018 D1T3 赛道修建 首先考虑二分答案,这时需要的就是对于一个长度求出能在树中选出来的最多的路径条数.考虑到一条路径是由一条向上的路径与一条向下的路径构成,或者仅仅是向上或向下的路径 ...

  3. NOIP 2018 总结

    NOIP 2018 总结 提高组: 应得分 \(100 + 100 + 40 + 100 + 50 + 44 = 434\). 考后期望得分 \(100 + 100 + 20 + 100 + 50 + ...

  4. noip 2018 d2t1 旅行

    noip 2018 d2t1 旅行 (题目来自洛谷) 给定n个城市,m条双向道路的图, 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路 ...

  5. NOIP 2018 真・退役记

    目录 NOIp 2018 真・退役记 7.01 7.05 \(summary\) 7.12 7.18 7.26 - 7.27 8.2 8.3 8.3 8.7 8.9 8.20 8.24 8.27 8. ...

  6. NOIP 2018 普及组 解题报告

    目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...

  7. Before NOIP 2018

    目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...

  8. My thoughts after NOIP 2018(1)

    联赛就这样结束了. 感觉真是奇怪啊.以前看重的东西,像是忽然扔下的包袱,一下子轻了. 而我一直在逃避的,不愿直面的东西,果然终于还是要再次面对了啊. 文化课百废待兴,\(noip\)的最终结果依然未知 ...

  9. [游记] Noip 2018

    飞雪连天射白鹿, 笑书神侠倚碧鸳 $ 2018/12/14 $ 经历了 \(noip\) 玩完的心态爆炸之后,还是决定稍微写一下游记记录一下\(QAQ\),以免以后就忘了. 然后打算先写个框架之后再慢 ...

  10. NOIP 2018 划水记

    (此处不应有目录) (本来想咕掉这篇游记) Day -1 今天信心题,这个毒瘤出题人怎么出了一堆垃圾题(smallfat批判这个垃圾题). T2,T3是送分题.T1考了个noip根本不会考得类欧几里德 ...

随机推荐

  1. Django框架之第五篇(模板层) --变量、过滤器、标签、自定义标签、过滤器,模板的继承、模板的注入、静态文件

    模板层 模板层就是html页面,Django系统中的(template) 一.视图层给模板传值的两种方法 方式一:通过键值对的形式传参,指名道姓的传参 n = 'xxx'f = 'yyy'return ...

  2. Python之路【第十八篇】:前端HTML

    一.前端概述 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind( ...

  3. 二叉树根结点到任意结点的路径(C语言)

    有一棵二叉树,如下图所示: 其中 # 表示空结点. 先序遍历:A B D E G C F 问题:怎么得到从根结点到任意结点的路径呢? 示例:输入 G,怎么得到从结点 A 到结点 G 的路径呢? 很明显 ...

  4. Go基础编程实践(一)—— 操作字符串

    修剪空格 strings包中的TrimSpace函数用于去掉字符串首尾的空格. package main import ( "fmt" "strings" ) ...

  5. golang之defer

    概述 对于资源释放,有很多不同的实现方式,不同语言也有不同的惯用方法. C语言 :手动管理 Golang :defer Python :上下文管理器contexManager C++ : 作用域和析构 ...

  6. -Gradle 翻译 Merge AndroidManifest 合并清单文件 MD

    目录 目录 Merge AndroidManifest 合并清单文件 合并多个清单文件 合并优先级 合并冲突启发式算法 合并规则的标记 节点标记 属性标记 Attribute markers 标记选择 ...

  7. 3.使用 Code First 迁移更新数据库

    1.更新 SeedData 类,使它提供新列的值. 示例更改如下所示,但可能需要对每个 new Movie 块做出此更改. context.Movie.AddRange( new Movie { Ti ...

  8. C#关键字:访问修饰符

    一.访问修饰符 访问修饰符有public.private.protected.internal和protected internal.它们是修饰在类型(类.接口.委托.结构和枚举)和类型成员(字段.属 ...

  9. 2)NET CORE特性与优势

    先看看netcore有哪些特性,哪些优点,与.net frameworkd 差异吧: l  跨平台: 可以在 Windows.macOS 和 Linux 操作系统上运行. l  跨体系结构保持一致:  ...

  10. 2019-07-25 PDO

    PDO是什么? pdo是php数据对象,即php data object .使用pdo是为了让我们能够使用相同的代码连接不同的数据库.PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展 ...