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. centos 6.5安装zabbix 4.4

    一.安装环境 本环境,使用单机部署. 操作系统:centos 7.5 x64zabbix-server,Mysql,php,nginx都在同一台服务器.都是使用Yum安装的! 官方安装文档: http ...

  2. MOOC python笔记(一):python语言概述

    python语言简介 特点:简单.易学.使用者多. 荷兰人Guido 1989年发明. 面向对象的解释型计算机程序设计语言. 设计哲学是"优雅"."明确".&q ...

  3. 精通Spring Boot

    原 精通Spring Boot—— 第二十一篇:Spring Social OAuth 登录简介 1.什么是OAuth OAuth官网介绍是这样的: An open protocol to allow ...

  4. java中四种权限修饰符区别

    总的概括:public > protected > (default) > private 细分见下表格: 权限修饰符 public protected (default) priv ...

  5. Visual Studio 2012 VC下 OpenGL 配置与使用

    Windows环境下的GLUT下载地址:(大小约为150k)    Download 1 32位Windows环境下安装GLUT的步骤1.将glut.h复制到C:\Program Files (x86 ...

  6. iOS 12中获取WiFi的SSID

    开始搞智能家居,wifi获取不到了?? 小插曲 旧方法失效,19-12-15更新,ios13开始需要请求定位信息 SSID全称Service Set IDentifier, 即Wifi网络的公开名称. ...

  7. Python illustrating Downhill simplex method for minimizing the user-supplied scalar function的代码

    学习过程,把代码过程较好的代码段做个记录,如下的代码段是关于Python illustrating Downhill simplex method for minimizing the user-su ...

  8. C++ primer学习笔记_6_函数---函数定义、参数传递

    1. 习题参考: 6.14 举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子. 答: 形参使用引用类型的情况:(1)避免拷贝传递大对象的时候,这里的string对象s:(2)当需要从函 ...

  9. weblogic如何修改密码&密码找回

    一.修改Console密码后,挂载的服务无法重启[解决办法] 1. 打开weblogic控制台,安全领域 --> myrealm --> 用户和组,将会看到weblogic用户,可以直接删 ...

  10. Apache Flink 零基础入门(转)

    这是一份很好的 Apache Flink 零基础入门教程. Apache Flink 零基础入门(一&二):基础概念解析 Apache Flink 零基础入门(三):开发环境搭建和应用的配置. ...