【2024.9.30】NOIP2024 赛前集训-刷题训练(4)

Problem - 2000D - Codeforces

给一串数和一串LR字符,L 可以向右连接 R, 覆盖部分的LR不能再使用,但覆盖部分可以有被禁用的LR。每次覆盖部分的数字之和计入答案,求最大答案。

手玩一下发现可以贪心。从最左边的 L 和最右边的 R 开始贪心。操作顺序和实际是倒着的,但不影响。

#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 = 2e5 + 105;
ll sum[N], ans = 0;
int posl[N],posr[N],a[N];
char s[N];
int n,T,cntl=0,cntr=0;
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T--){
ans = 0;
cntl = 0;
cntr = 0;
cin >> n;
F(i, 1, n) cin >> a[i],sum[i] = sum[i - 1] + a[i];
cin >> (s + 1);
F(i, 1, n){
if(s[i] == 'L') posl[++cntl] = i;
else posr[++cntr] = i;
}
int l = 1, r = cntr;
while(l <= cntl && r >=1 && posl[l] < posr[r]){
ans += sum[posr[r]] - sum[posl[l] - 1];
++l, --r;
}
cout << ans << '\n';
}
return 0;
}

Problem - 33D - Codeforces

给一堆点和一堆没有交集的圆,保证点不在圆上。每次询问两个特定点 \(A,B\), 问 \(A\) 到 \(B\) 至少要穿过多少个圆。

对于一个圆 \(S\),

\(A \in S, B \in S\), 不穿过。

\(A \in S, B \notin S\), 要穿过。

\(A \notin S, B \in S\), 要穿过。

\(A \notin S, B \notin S\), 不穿过。

根据 点和圆位置的判定原理 预处理好 所有点圆关系 即可。

#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 = 1005;
bool f[N][N];
int n, m, k;
ll kx[N], ky[N], cx[N], cy[N], r[N];
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m >> k;
F(i, 1, n) cin >> kx[i] >> ky[i];
F(i, 1, m) cin >> r[i] >> cx[i] >> cy[i];
F(i, 1, n){
F(j, 1, m){
if((kx[i] - cx[j]) * (kx[i] - cx[j]) + (ky[i] - cy[j]) * (ky[i] - cy[j]) < r[j] * r[j])
f[i][j] = 1;
}
}
while(k--){
int a, b, ans = 0;
cin >> a >> b;
F(i, 1, m){
int sum = f[a][i] + f[b][i];
if(sum == 1) ++ans;
}
cout << ans << '\n';
}
return 0;
}

Problem - 2001D - Codeforces

求最长子序列,要求元素互不相同,奇数位尽量大,偶数位尽量小。

手玩几个样例发现,能不能先跳过某个元素 \(x\),把后面更符合要求的先放,取决于这是不是最后一个 \(x\)。

自然想到从右往左扫出后缀中每个元素出现的次数。标记一下在后缀中每个元素首次出现的位置 \(pos\)。

把序列信息整齐地写在草稿纸上后,容易发现在相邻两个 \(pos\) 之间,不用考虑是不是最后一个,那么就可以直接贪心地按照 “奇大偶小” 来选,其中 \(a[pos]\) 必选。

所以我们需要用线段树实现 单点复制 和 区间求max和min。

具体的实现过程为,从左往右一个一个 \(pos\)区间 地处理,每次跳转到极值的下一位就能保证一定最优。

!!!有一个细节:\(a[pos]\) 必选,但是 不一定选的是这个位置。所以如果这个值被提前选到了,那么这个 \(pos\)区间 要和后面的 \(pos\) 区间进行合并,直到 \(a[pos]\) 没有被选过。

时间复杂度:\(O(nlogn)\), 其实可以用单调队列做到严格 \(O(n)\)。

(小小3k, 轻松拿捏~)

#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 = 3e5 + 5;
const int inf = 0x3f3f3f3f;
int a[N], ne[N], t[N], mx[N << 2], mn[N << 2];
int T, n;
vector<int> v[N], tback;
void pushup(int u){
mx[u] = max(mx[u * 2], mx[u * 2 + 1]);
mn[u] = min(mn[u * 2], mn[u * 2 + 1]);
}
void update(int u, int l, int r, int x, int y){
if(l == r) {
if(y == inf) mx[u] = -y, mn[u] = y;
else mx[u] = mn[u] = y;
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) update(u * 2, l, mid, x, y);
else update(u * 2 + 1, mid + 1, r, x, y);
pushup(u);
}
int query_max(int u, int l,int r, int x, int y){
if(x <= l && r <= y) return mx[u];
int mid = (l + r) >> 1, ret = -inf;
if(x <= mid) ret = max(ret, query_max(u * 2, l, mid, x, y));
if(y > mid) ret = max(ret, query_max(u * 2 + 1, mid + 1, r, x, y));
return ret;
}
int query_min(int u, int l,int r, int x, int y){
if(x <= l && r <= y) return mn[u];
int mid = (l + r) >> 1, ret = inf;
if(x <= mid) ret = min(ret, query_min(u * 2, l, mid, x, y));
if(y > mid) ret = min(ret, query_min(u * 2 + 1, mid + 1, r, x, y));
return ret;
}
signed main(){
// freopen("test.in","r",stdin);
// freopen("LMMS2.in","r",stdin);
// freopen("LMMS.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T --){
cin >> n;
int len = 0;
F(i, 1, n) cin >> a[i], v[a[i]].emplace_back(i), update(1, 1, n, i, a[i]);
G(i, n, 1){
if(!t[a[i]]) ne[i] = i, ++len, tback.emplace_back(a[i]);
else ne[i] = ne[i + 1];
++t[a[i]];
}
int i = 1, cnt = 0;
cout << len << '\n';
while(i <= n){
int l = i, r = ne[i];
while(l < r){
while(a[r] == inf && r + 1 <= n) r = ne[r + 1];
int val;
if((++cnt) & 1){
val = query_max(1, 1, n, l, r);
}
else{
val = query_min(1, 1, n, l, r);
}
if(val !=inf && val != -inf){
if(val == a[r] && r + 1 <= n) r = ne[r + 1];
int pos = -1;
for(auto x : v[val]){
if(x >= l && x <= r && pos == -1) pos = x;
if(x >= l) update(1, 1, n, x, inf), a[x] = inf;
}
cout << val << ' ';
l = pos + 1;
}
else l = r + 1;
}
if(l == r && a[r] != inf) {
++cnt;
cout << a[r] << ' ';
for(auto x: v[a[r]]) if(x >= l) update(1, 1, n, x, inf), a[x] = inf;
} i = r + 1;
}
cout << '\n';
for(auto pos : tback) {
t[pos] = 0;
v[pos].clear();
}tback.clear();
}
return 0;
}

Problem - 2001E1 - Codeforces

#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 = 505;
int n, k, mod, T;
ll f[N][N], g[N][N], sum[N][N];
signed main(){
// freopen("DH.in","r",stdin);
// freopen("DH.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T --){
cin >> n >> k >> mod;
F(i, 1, n) f[i][0] = 1, g[i][0] = 1, sum[i][0] = 1;
F(i, 0, k) f[1][i] = g[1][i] = 1, sum[1][i] = i + 1;
F(i, 2, n) F(j, 1, k){
G(p, j, 0){
int q = min(p, j - p);
if(p != q){ // p >= q
(g[i][j] += g[i - 1][p] * sum[i - 1][q] * 2 % mod) %= mod;
(f[i][j] += f[i - 1][p] * sum[i - 1][q] * 2 % mod) %= mod;
}
else {
(g[i][j] += g[i - 1][p] * sum[i - 1][p - 1] * 2 % mod + g[i - 1][p] * g[i - 1][p] % mod) %= mod;
(f[i][j] += f[i - 1][p] * sum[i - 1][p - 1] * 2 % mod) %= mod;
}
}
sum[i][j] = (sum[i][j - 1] + g[i][j]) % mod;
}
cout << f[n][k] << '\n';
F(i, 0, n) F(j, 0, k) f[i][j] = g[i][j] = sum[i][j] = 0;
}
return 0;
}

【2024.9.30】NOIP2024 赛前集训-刷题训练(4)的更多相关文章

  1. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  2. poj-2421-最小生成树刷题

    title: poj-2421-最小生成树刷题 date: 2018-11-20 20:30:29 tags: acm 刷题 categories: ACM-最小生成树 概述 做了几道最小生成树的题, ...

  3. LeetCode的刷题利器(伪装到老板都无法diss你没有工作)

    在工程效率大行其道的今天,如果不会写点代码以后也不容易在测试圈混下去.今天给大家推荐一个LeetCode的刷题利器,可以伪装到连你老板在这里走过去都无法确认你是在干活呢,还是在干活呢. LeetCod ...

  4. 牛客网刷题(纯java题型 1~30题)

    牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...

  5. leecode刷题(30)-- 二叉树的后序遍历

    leecode刷题(30)-- 二叉树的后序遍历 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 思路 ...

  6. 牛客网NOIP赛前集训营-提高组(第四场)B题 区间

    牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...

  7. NOI Online 赛前刷题计划

    Day 1 模拟 链接:Day 1  模拟 题单:P1042 乒乓球  字符串 P1015 回文数  高精 + 进制 P1088 火星人  搜索 + 数论 P1604 B进制星球  高精 + 进制 D ...

  8. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  9. NOIP赛前集训备忘录(含每日总结)(日更?。。。)

    NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...

  10. 牛客CSP-S提高组赛前集训营1

    牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓 ...

随机推荐

  1. Buckingham-Reiner 方程和 Darby-Melson 经验方程

    由 Roni, et al. (2018), Woolley, et al. (2014), Yang, et al. (2017) 整理人便便的物理性质数据如下: 性质 值 密度 \((\text{ ...

  2. 【Python自动化】之特殊的自动化定位操作

    今天有时间了,想好好的把之前遇到过的自动化问题总结一下,以后有新的总结再更新 目录: 一.上传文件(4.11) 二.下拉框选择(4.11) 1.Select下拉框 2.非Select下拉框 三.下拉框 ...

  3. Mono 现状与未来:从Wine-mono 到.NET 9

    Mono 官网主页[1]和 Mono GitHub 页面今日发布公告[2],微软宣布将 Mono 项目移交给 WineHQ 组织,也就是 Linux 兼容 Windows 应用框架 Wine 的开发团 ...

  4. 【Docker学习教程系列】8-如何将本地的Docker镜像发布到私服?

    通过前面的学习,我们已经知道,怎么将本地自己制作的镜像发布到阿里云远程镜像仓库中去.但是在实际工作开发中,一般,我们都是将公司的镜像发布到公司自己搭建的私服镜像仓库中,那么一个私服的镜像仓库怎么搭建? ...

  5. MyBatis分页实现

    目录 分页实现 limit实现分页 RowBounds分页 分页实现 limit实现分页 为什么需要分页? 在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进 ...

  6. C++ std::shared_ptr自定义allocator引入内存池

    当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低.当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分 ...

  7. Mongodb入门4

    今天学习一下MongoDB数据库的索引. 因为养的鱼生病了,所以抽空晚上学习记录一下. 这里借用一下菜鸟教程的原文: 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描 ...

  8. vue 消息订阅与发布

    vue 消息订阅与发布 一.场景 vue中非父子组件之间通信时,使用vuex有时间会很麻烦,这时候可以通过bus总线来实现 消息的订阅与发布 二.实现方法 1.main.js //main.js Vu ...

  9. SQL Server – 执行计划和各种 join 方式 (Execution plan & Join Pattern)

    前言 我几乎从来没有遇到过性能问题, 毕竟项目真的太小了. 一般上只要用常识去建 index 就可以了. 但是这并不阻碍我对知识的追求. 这篇是关于一些性能优化和原理的内容. 纯属学习, 希望未来有机 ...

  10. CSS & JS Effect – Simulation Position Sticky (用 JavaScript 实现 position sticky)

    前言 在 CSS – Position 我有提到过, 原生的 sticky 有一些 limitation. 不是每次都闪的掉. 这篇主要是通过 JS 来模拟它, 突破那些限制. Google Ads ...