【2024.09.27】NOIP2024 赛前集训-刷题训练(3)
【2024.09.27】NOIP2024 赛前集训-刷题训练(3)
算法一:模拟正常人铺路的过程,每次找区间的最小值,最小值就是本次填的高度,由于出现了若干个0位置,就分裂成若干个子区间去重复上述过程,直到全部变成0。时间复杂度 \(O(nlogn)\), 瓶颈在预处理 st表。
算法二:若 \(a[i - 1] < a[i]\), 则 \(ans += a[i] - a[i - 1], i \in [0,n]\)。 感性理解一下: \(\forall i, a[i] <= a[i - 1]\) 的情况都会被顺便删掉。
所以其实以下两种写法都是对的:
//写法一
F(i, 2, n + 1) if(a[i] < a[i - 1]) ans += a[i - 1] - a[i];
//写法二
F(i, 1, n) if(a[i] > a[i - 1]) ans += a[i] - a[i - 1];
结论就是如果货币系统里的一些数可以由其他数表示出来,那么这样的数就可以被删掉。
那么每往新的货币系统里加一个数,就把 能由它的若干倍表示的数 都标记上(值域很小),剪下枝就过了。
#include<bits/stdc++.h>
#define F(i,l,r) for (int i(l); i<=(r); ++i)
#define G(i,r,l) for (int i(r); i>=(l); --i)
using namespace std;
using ll = long long;
const int N = 1e5 + 5,mx = 25000;
int t[N], a[N];
int n, T;
signed main(){
// freopen("money.in","r",stdin);
// freopen("money.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T --){
cin >> n;
F(i, 1, n) cin >> a[i];
sort(a + 1, a + n + 1);
if(a[1] == 1){
cout << "1\n";
continue;
}
memset(t, 0, sizeof(t));
t[0] = 1;
int ans = 0;
F(i, 1, n){
if(t[a[i]]) continue;
++ans;
F(j, 0, mx) if(t[j] && !t[j + a[i]]) for(int k = a[i];j + k <= mx; k += a[i]) t[j + k] = 1;
}cout << ans << '\n';
}
return fflush(0),0;
}
\(m = 1\):自底向上dp就行。
\(a_i = 1\):菊花图,做法显然。
\(b_i = a_i + 1\):链,在序列上二分即可。
分支不超过3:根最多三叉,别的点最多二叉,观察一下发现一个儿子的贡献要么向另一个儿子拐,要么穿过父节点继续向上,由此想到自底向上贪心。(提示正解)
综上有80pts。
正解就是扩展一下,记 \(T(u)\) 表示 \(u\) 的子树。记 \(d[u]\) 为 \(T(u)\) 能向上传的最大权值的链。(抛开能计算贡献的链)
\(d[u]\) 和 贡献 靠 \(multiset\) 维护即可。按权值从小到大枚举链,找最小的能和它匹配的链, 匹配后把他们从集合里删掉。
细节是如果 单链权值 就 \(\ge lim\) 就不要放进集合了直接算贡献。
反思一下,对 \(multiset\) 操作太不熟了,有点儿难调。。。代码能力还能提升!
#include<bits/stdc++.h>
#define F(i,l,r) for (int i(l); i<=(r); ++i)
#define G(i,r,l) for (int i(r); i>=(l); --i)
using namespace std;
using ll = long long;
const int N = 1e6 + 5;
bool vis[N];
struct node{
int v,w,ne;
}e[N << 1];
int n, m, idx = 0, num = 0;
int mx[N], first[N], d[N];
void add(int x, int y, int z){
e[++idx] = (node){y, z, first[x]};
first[x] = idx;
}
void go(int u, int f, int lim){
multiset<int> p;
for(int i = first[u]; i; i = e[i].ne){
int v = e[i].v, w = e[i].w;
if(v == f) continue;
go(v, u, lim);
if(d[v] + w>=lim) ++num;
else p.insert(d[v] + w);
}
while(p.size()){
int x = *p.begin();
p.erase(p.begin());
auto it = p.lower_bound(lim - x);
if(it != p.end()){
++ num;
p.erase(it);
}
else d[u] = max(x, d[u]);
}
}
inline bool chk(int lim){
memset(d, 0, sizeof(d));
num = 0;
go(1, 0, lim);
return num >= m;
}
signed main(){
// freopen("track.in","r",stdin);
// freopen("track.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
F(i, 1, n - 1){
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
int l = 0, r = 5e8 + 1, mid;
while(l + 1 < r){
mid = (l + r) >> 1;
if(chk(mid)) l = mid;
else r = mid;
}
cout << l << '\n';
return fflush(0),0;
}
树的情况:从1开始,每次按点权从小到大扩展即可(预先对邻接表sort)。
基环树:只有一个环,断一条边就是树,环上每条边都尝试一下即可。时间复杂度 \(O(n^2)\)。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
using namespace std;
using ll = long long;
const int N = 5e3 + 5;
struct node{
int u, v;
inline bool operator == (const node &o){
return u == o.u && v == o.v;
}
}e[N], d[N];
vector<int> G[N];
int n, m, cnt = 0, num = 0, tot = 0;
int dfn[N], low[N], nw[N], ans[N];
bool ins[N];
stack<int> stk;
inline void dfs(int u, int f){
ans[++tot] = u;
for(auto v : G[u]){
if(v == f) continue;
dfs(v, u);
}
}
inline void tarjan(int u, int f){
stk.push(u),ins[u] = 1,dfn[u] = low[u] = ++cnt;
for(auto v : G[u]){
if(v == f) continue;
if(!dfn[v]) tarjan(v, u), low[u] = min(low[u], low[v]);
else if(ins[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]){
int x, las = 0, fst = 0;
if(stk.top() == u) return stk.pop(), ins[u] = 0, void();
do{
x = stk.top(),stk.pop(),ins[x] = 0;
if(las) d[++ num] = {las, x};
else fst = x;
las = x;
}while(x != u);
d[++ num] = {u, fst};
}
}
inline void dfs(int u, int f, int idx){
nw[++ tot] = u;
for(auto v : G[u]){
if(v == f || (d[idx] == (node){u, v}) || (d[idx] == (node){v, u})) continue;
dfs(v, u, idx);
}
}
signed main(){
// freopen("travel.in","r",stdin);
// freopen("travel.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
if(m == n - 1){
F(i, 1, m){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
} F(u, 1, n) if(G[u].size()) sort(G[u].begin(), G[u].end());
dfs(1, 0);
}
else{
F(i, 1, m) cin >> e[i].u >> e[i].v, G[e[i].u].push_back(e[i].v), G[e[i].v].push_back(e[i].u);
tarjan(1, 0);
F(u, 1, n) if(G[u].size()) sort(G[u].begin(), G[u].end());
F(i, 1, num){
tot = 0, dfs(1, 0, i);
if(ans[1]){
F(j, 1, n) {
if(ans[j] == nw[j]) continue;
if(ans[j] > nw[j]){
F(k, 1, n) ans[k] = nw[k];
break;
}
else break;
}
} else F(j, 1, n) ans[j] = nw[j];
}
} F(i, 1, tot) cout << ans[i] << ' ';
return fflush(0), 0;
}
【2024.09.27】NOIP2024 赛前集训-刷题训练(3)的更多相关文章
- NOIp2018停课刷题记录
Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...
- LeetCode的刷题利器(伪装到老板都无法diss你没有工作)
在工程效率大行其道的今天,如果不会写点代码以后也不容易在测试圈混下去.今天给大家推荐一个LeetCode的刷题利器,可以伪装到连你老板在这里走过去都无法确认你是在干活呢,还是在干活呢. LeetCod ...
- leecode刷题(27)-- 合并k个排序链表
leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1-> ...
- 牛客网NOIP赛前集训营-提高组(第四场)B题 区间
牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...
- NOI Online 赛前刷题计划
Day 1 模拟 链接:Day 1 模拟 题单:P1042 乒乓球 字符串 P1015 回文数 高精 + 进制 P1088 火星人 搜索 + 数论 P1604 B进制星球 高精 + 进制 D ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- NOIP赛前集训备忘录(含每日总结)(日更?。。。)
NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...
- Buu刷题
前言 希望自己能够更加的努力,希望通过多刷大赛题来提高自己的知识面.(ง •_•)ง easy_tornado 进入题目 看到render就感觉可能是模板注入的东西 hints.txt给出提示,可以看 ...
- 《剑指offer》刷题笔记
简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...
- 《剑指offer》刷题目录
<剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 面试题09. ...
随机推荐
- win+jenkins+git+allure+tomcat+jdk部署(万人坑)
万人坑:之所以叫万人坑,是一些网站真的是非常非常非常坑,且不说按照他们的方法一次都没成功,还遇到了各种千奇百怪的问题,浪费了本人3.1415926h的时间,真想给他们竖起一个超大号的倒拇指.下面开始踩 ...
- springcloud config坑系列一之Connection pool shut down on "zuul.host.*" property change
在使用springcloud config自动刷新功能难免会踩到一些坑,下面来介绍下 在生成中经常需要动态刷新配置,只需要增加@RefreshScope,并且执行手动刷新链接/actuator/ref ...
- 15. 从0开始学ARM-位置无关码
@ 目录 十九.位置无关码 一.为什么需要位置无关码? 1. exynos 4412启动流程 二.怎么实现位置无关码? 1. 什么是<编译地址>?什么是<运行地址>? 2. 举 ...
- Ubuntu 设置远程桌面(VNC)
连接 Xfce 4 远程桌面 下载 Xfce 4 桌面环境: sudo apt install -y xfce4 xfce4-goodies 这里会提示你设置显示管理器,我们设置 gdm3 就好. 安 ...
- LLM论文研读: MindSearch
1. 背景 近日中科大与上海人工智能实验室联合推出的MindSearch思索,引起了不小的关注,github上的星标,短短几周时间,已经飙到了4.2K.看来确实有些内容,因此本qiang~研读了论文及 ...
- 倾斜摄影osgb格式文件,进行坐标转换
倾斜摄影OSGB格式的文件,很棘手,今天需要把osgb放到UE中渲染.碰到的问题如下: 1.osgb文件导进去后,Z轴不想上,是歪的,小人放进去后,就斜站在马路上. 2.根本原因是坐标系,UE的插件c ...
- 【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)
工具介绍: P1finger 红队行动下的重点资产指纹识别工具.P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统.其主要特点包括: 语言和实现: 语言:使用Go语 ...
- 使用Hexo主题搭建个人博客(markdown)
依赖环境 安装node.js:node.js下载可以从其官方界面开始https://nodejs.org/zh-cn/ 安装git:git下载则可以从其官方界面开始https://git-scm.co ...
- 小tips:使用JSON.parse(JSON.stringify(object))实现深拷贝的局限及扩展
使用JSON.parse(JSON.stringify(object))实现深拷贝局限 大部分情况我们都可以使用JSON.parse(JSON.stringify(object))来实现深拷贝,但该方 ...
- 想好新年去哪了吗?合合信息扫描全能王用AI“留住”年味
还有不到十天,除夕就要到了.近几年春节假期中,有人第一次带着孩子直击海面冰风,坐船回老家:也有人选择"漫游"国内外,在旅行中迎接新春的朝气.合合信息旗下扫描全能王APP通过AI扫描 ...