T1:最大约数和

给定一个正整数 S,现在要求你选出若干个互不相同的正整数,使得它们的和不大于 S,而且每个数的因数(不包括本身)之和最大。S <= 1000

分析:

其实考完才听他们说是背包,不过也没差了,不管了

首先约数和\(sum\)是可以预处理的,用类似埃氏筛的方式枚举一下然后累加一下

然后发现有很明显的阶段,考虑\(dp\)

\(f[i] = f[j] + sum[i - j], 0 <= j <= i\)

代码:

#include<bits/stdc++.h>
#define N (1000 + 10)
#define int long long
using namespace std;
int n;
int f[N], sum[N];
signed main() {
freopen("sum.in", "r", stdin);
freopen("sum.out", "w", stdout);
scanf("%lld", &n);
for (register int i = 1; i <= n; ++i)
for (register int j = 2; i * j <= n; ++j) sum[i * j] += i;
for (register int i = 1; i <= n; ++i)
for (register int j = 0; j <= i; ++j) f[i] = max(f[i], f[j] + sum[i - j]);
printf("%lld", f[n]);
return 0;
}

T2:最佳序列

给一个长度为 n 的数组 A,给定 L, R,求所有满足长度大等于 L,小等于 R 的 A 数组的子区间的平均值的最大值。 n <= 1e5

分析:

考场没思路,前缀和+枚举区间长度\(60pts\)走人

观察数据范围可以套一个\(log\),试试二分平均值

怎么\(check\)呢

每次重构前缀和数组\(sum\),在前缀和数组上减去二分的\(mid\),那么问题转化为判断区间上有没有一段长度在\([L, R]\)之间的区间最小值大于\(0\)

枚举右端点\(i\),则左端点的可能区间为\([i - R, i - L]\),区间和为\(sum[i] - sum[左端点-1]\)

对于每一个枚举的\(i\),\(sum[i - L]\)相当于一个定值,那么维护\(sum[左端点-1]\)的最小值,若其能使区间和\(>=0\)则答案合法,否则答案不合法

维护最小值用单调队列

代码:

#include<bits/stdc++.h>
#define N (500000 + 10)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int n, L, R, head, tail;
double a[N], sum[N], q[N], pos[N], gmax;
bool check(double r) {
memset(q, 0, sizeof q);
memset(sum, 0, sizeof sum);
head = 1, tail = 0;
for (register int i = 1; i <= n; ++i) sum[i] = 1.0 * a[i] - r + sum[i - 1];
for (register int i = L; i <= n; ++i) {
while (head <= tail && q[tail] >= sum[i - L]) --tail;
while (head <= tail && pos[head] + R < i) ++head;
q[++tail] = sum[i - L];
pos[tail] = i - L;
if (sum[i] - q[head] >= 0) return true;
}
return false;
}
int main() {
n = read(), L = read(), R = read();
for (register int i = 1; i <= n; ++i) a[i] = read(), gmax = max(gmax, a[i]);
double mid;
double l = 0, r = 1.0 * gmax;
for(register int i = 1; i <= 100; ++i) {
mid = (l + r) / 2;
// cout<<mid<<endl;
if (check(mid)) l = mid;
else r = mid;
}
printf("%.4lf", mid);
return 0;
}

T3:贸易/华莱士

给定一个图,求边权最小的基环树森林,允许重边不允许自环,点、边<=5e5

分析:

考场上打了个错误的\(kruscal\)不知道为什么能拿\(50pts\),权当撞大运吧

大方向至少是对的,考虑类似\(kruscal\)的方式用并查集维护连通性并以一些奇怪的方式来判断边选还是不选

  • 如果当前边两头点在一个集合,没有环就选上
  • 如果当前边两头点不在一个集合,再次分类讨论:如果是两棵基环树则不用连上,否则加上这条边,并判断新的并查集是不是一棵基环树即可

    对于每个联通块是不是基环树打标记,最后只需要看加入的总边数是否等于\(n\)判断\(No\)

代码:

#include<bits/stdc++.h>
#define int long long
#define N (500000 + 10)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int n, m, fa[N], ans, cnt;
bool check[N];
int get_fa(int x) {return x == fa[x] ? x : fa[x] = get_fa(fa[x]);}
struct node {
int u, v, w;
}edge[N << 1];
bool cmp(node a, node b) {
return a.w < b.w;
}
signed main() {
n = read(), m = read();
for (register int i = 1; i <= n; ++i) fa[i] = i, check[i] = 0;
for (register int i = 1; i <= m; ++i) edge[i].u = read(), edge[i].v = read(), edge[i].w = read();
sort (edge + 1, edge + m + 1, cmp);
for (register int i = 1; i <= m; ++i) {
int fx = get_fa(edge[i].u), fy = get_fa(edge[i].v);
if (fx == fy) {
if (check[fx]) continue;
else check[fx] = 1, ans += edge[i].w, fa[fy] = fx, ++cnt;
} else {
if (check[fx] && check[fy]) continue;
if (check[fx] || check[fy]) check[fx] = 1;
fa[fy] = fx;
ans += edge[i].w, ++cnt;
}
}
// for (register int i = 1; i <= n; ++i) if (!check[i]) return printf("No"), 0;
if (!cnt) return printf("No"), 0;
printf("%lld", ans);
return 0;
}

2019/10/9 CSP-S 模拟测的更多相关文章

  1. 2019/10/17 CSP模拟 总结

    T1 补票 Ticket 没什么好说的,不讲了 T2 删数字 Number 很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂 ...

  2. 2019.10.26 CSP%您赛第三场

    \(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...

  3. 2019.10.15 CSP初赛知识点整理

    初赛需要的知识点整理如下: (1)计算机的硬件组成与基本常识 (2)单位/进制的转换 (3)进制/逻辑运算相关 (4)概率与期望 (5)排序的各种性质 (6)简单数据结构的使用(栈.队列.链表等) ( ...

  4. 2019.10.24 CSP%你赛第二场d1t3

    题目描述 Description 精灵心目中亘古永恒的能量核心崩溃的那一刻,Bzeroth 大陆的每个精灵都明白,他们的家园已经到了最后的时刻.就在这危难关头,诸神天降神谕,传下最终兵器——潘少拉魔盒 ...

  5. 2019.10.28 CSP%您赛第四场t3

    我写不动前两个了. 原谅一下. ____________________________________________________________________________________ ...

  6. 2019.10.29 CSP%您赛第四场t2

    我太菜了我竟然不会分层图最短路 ____________________________________________________________________________________ ...

  7. 2019.11.9 csp-s 考前模拟

    2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  9. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  10. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

随机推荐

  1. 【POJ】3259 Wormholes

    题目链接:http://poj.org/problem?id=3259 题意:n个农场,m条双向路径,w条单向路径(虫洞).单向虫洞路径是负值.农夫想知道自己能不能看到自己(X). 题解:其实刚开始没 ...

  2. 21个CSS技巧

    级联样式表(CSS)在当代Web设计中已经成为重要的环节,如果没有CSS现在的网站将像10年前一样不堪入目.随着CSS技术的普及,越来越多的高质量CSS教程涌入互联网,让我们的学习更加方便. 1.CS ...

  3. pytorch,cuda8,torch.cuda.is_available return flase (ubuntu14)

    因为ubuntu 系统是14.0的,安装pytorch1.0的时候,本身已经安装好了cuda8,在验证gpu的时候,torch.cuda.is_available()返回false 安装命令是: co ...

  4. win10 +Kinect V1 1414环境配置

    win10 +Kinect V1 1414环境配置 想起老Lab的机器人头顶的Kinect 安装准备 demo展示 人脸识别 照片不能够检测到人脸 可以去除背景 检测骨架 想起老Lab的机器人头顶的K ...

  5. 数据库MySQL--基础查询

    1.查询字段 查询表某字段:select 字段名 from 表名: 查询表内所有字段:select * from 表名: (当字段和关键字重名是用( ` )着重号区分 ) 2.查询常量值 select ...

  6. java 和 IntelliJ IDEA 的一些配置

    jdk 的下载与配置https://jingyan.baidu.com/article/ca41422fe3b7261eae99edc6.html intellij IDEA软件java项目No SD ...

  7. 廖雪峰Java16函数式编程-2Stream-6reduce

    1. 聚合方法 Stream.reduce()是一个Stream的聚合方法:把一个Stream的所有元素聚合成一个结果 例如: Stream.of(1, 2, 3, 4, 5).count(); // ...

  8. shiro框架的组成和内部结构(下一篇为spring整合shiro)

    1.shiro简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. ​ 实际上,Shir ...

  9. 牛客多校第六场 B Shorten IPv6 Address 模拟

    题意: 给你一个二进制表示的IPv6地址,让你把它转换成8组4位的16进制,用冒号分组的表示法.单组的前导0可以省略,连续多组为0的可以用两个冒号替换,但是只允许替换一次.把这个地址通过这几种省略方式 ...

  10. 尚学linux课程---6、linux命令介绍

    尚学linux课程---6.linux命令介绍 一.总结 一句话总结: linux中命令的一般格式:命令关键字 选项 参数1 参数2 1.linux基本原则? 一切皆文件 配置文件保存为纯文本格式 2 ...