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. 余胜威《MATLAB数学建模经典案例实战》2015年版

    内容介绍 本书全面.系统地讲解了数学建模的知识.书中结合历年全国大学生数学建模竞赛试题,采用案例与算法程序相结合的方法,循序渐进,逐步引导读者深入挖掘实际问题背后的数学问题及求解方法.在本书案例的分析 ...

  2. python 之 面向对象(反射、__str__、__del__)

    7.10 反射 下述四个函数是专门用来操作类与对象属性的.通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def __ ...

  3. SQL语句报错:Incorrect string value: '\xE9\x98\xBF\xE6\x96\xAF...'

    很明显是编码的问题.检查了一下$conn->query("set names utf8");已经加在代码里了.那莫非是数据库编码不是utf8? 看了一下 还真不是 于是右键要 ...

  4. Spring整合Hibernate的两种方式

    在使用spring注解整合hibernate时出现"org.hibernate.MappingException: Unknown entity: com.ssh.entry.Product ...

  5. VMware 网络介绍

       3.1 网卡介绍 如图所示,你的机器有两块网卡,一个是有线,一个是无线. 装完VM之后,会出现两块虚拟网卡,如图 VM有四种连接方式,我们着重介绍前三种    3.2 桥接 选择桥接模式,说明V ...

  6. Win8.1下Flash Builder 提示: 找不到所需的Adobe Flash Player调试器版本,解决办法

    系统:Win8.1 x64 [解决]安装Flash DeBug最新版本补丁,注意下载对应系统的调试版本 下载地址:http://www.adobe.com/support/flashplayer/do ...

  7. 内部属性[[class]]

    1. 对象的[[class]]属性 所有typeof返回值为“object”的对象(如数组)都包含一个内部属性[[class]],这个属性无法直接访问,一般通过Object.prototype.toS ...

  8. TypeScript编写Vue项目结构解析

    使用TypeScript编写Vue项目也已经有了一段时间,笔者在刚刚使用TypeScript时候也是很茫然,不知道从何下手,感觉使用TypeScript写项目感觉很累赘并不像JavaScript那么灵 ...

  9. Android数据库GreenDao配置版本问题

    感谢该贴解决我多天的困惑:https://blog.csdn.net/u013472738/article/details/72895747 主要是降低了GreenDao版本 网上很多教程说的版本都是 ...

  10. 理解 Cookie,Session,Token 并结合 Redis 的使用

    Http 协议是一个无状态协议, 客户端每次发出请求, 请求之间是没有任何关系的.但是当多个浏览器同时访问同一服务时,服务器怎么区分来访者哪个是哪个呢? cookie.session.token 就是 ...