Codeforces Round 965 (Div. 2)
前言
有人在过七夕,我在打 cf ,还有某人独自一人在学校机房,凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。
Standings:2166
题目链接:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces
A. Find K Distinct Points with Fixed Center
题意:
给一个点(x,y),要求构造 k 个点使得这 k 个点的中心是(x,y)。
思路:
分奇偶讨论,两两对应即可。
#include<cstdio>
#include<cstring>
using namespace std;int T,x,y,k;int main()
{scanf("%d",&T);while (T --){scanf("%d%d%d",&x,&y,&k);if(k & 1){printf("%d %d\n",x,y);for (int i = 1;i <= k / 2;++ i) printf("%d %d\n%d %d\n",x + i,y + i,x - i,y - i);}else{for (int i = 1;i <= k / 2;++ i) printf("%d %d\n%d %d\n",x + i,y + i,x - i,y - i);}}return 0;
}
B. Minimize Equal Sum Subarrays
题意:
给你一个 1 ~ n 的排列 p ,你需要构造出一个新的 1 ~ n 的排列 q ,使得满足条件的 (i , j)对的数目最小:
思路:
只要使每一位的前缀和不一样即可,其实整体往右挪一位就是答案。
比赛时打得太丑,才知道 vector 的 erase 复杂度是 O(n)的,过 B 的时候就已经心态崩了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;#define N 200005int T,n,fst;
long long sum[N],a[N],b[N],pre[N],las[N],now;int main()
{scanf("%d",&T);while (T --){scanf("%d",&n),sum[0] = now = 0ll;for (int i = 1,x;i <= n;++ i)scanf("%lld",&a[i]),sum[i] = sum[i - 1] + a[i],b[i] = 0,pre[i] = i - 1,las[i] = i + 1;fst = 1;for (int i = 1;i <= n;++ i){if(i == n || (now + a[fst] != sum[i])){b[i] = a[fst];now += b[i];fst = las[a[fst]];}else{b[i] = a[las[fst]];now += b[i];las[fst] = las[las[fst]];}}for (int i = 1;i <= n;++ i) printf("%lld ",b[i]);printf("\n");}return 0;
}
C. Perform Operations to Maximize Score
题意:
给一个序列 a 和一个 01 串 b ,可以进行 k 次操作,每次操作可以让 b 中为 1 的某一位对应的 a 加上一,求 k 次操作之后以下值的最大值 :
其中 表示序列 a 挖去
之后的序列,median 表示中位数。
思路:
可以分 = 0 和
= 1 讨论。
1. = 1 的情况:显然让 k 次操作都加在
上最优,O(n)扫一遍即可。
2. = 0 的情况:发现最大的那个
能得到最大的贡献,于是我们只用考虑挖去最大的
后的序列,让它的中位数尽可能大即可。我们可以二分中位数的值,再判断是否合法即可。
好在是压线调出来了,以致于没有掉大分。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;#define N 200005int T,n,mid,m;
long long k,ans,mx1,mx2;struct Node
{int val,b;
}a[N],c[N];long long max(long long x,long long y) { return x > y ? x : y ; }int cmp(Node x,Node y) { return x.val < y.val ; }int check(int x)
{int tmp = m - mid + 1;int fl = m;for (int i = m; i ;-- i)if(c[i].val >= x) -- tmp,fl = i - 1;else break;if(tmp <= 0) return 1;int now = k;for (int i = fl; i ;-- i){if(c[i].b) now -= x - c[i].val,-- tmp;if(now <= 0 || tmp <= 0) break;}if(now < 0) return 0;if(tmp <= 0) return 1;return 0;
}int main()
{scanf("%d",&T);while (T --){scanf("%d%lld",&n,&k),ans = a[n + 1].val = 0ll;mid = n / 2;for (int i = 1;i <= n;++ i){scanf("%lld",&a[i].val);if(a[i].val >= mx1) mx2 = mx1,mx1 = a[i].val;}for (int i = 1;i <= n;++ i) scanf("%d",&a[i].b);sort(a + 1,a + n + 1,cmp);int bz = 0;for (int i = 1;i <= n;++ i)if(a[i].b){int tp;if(i <= mid) tp = a[mid + 1].val;else tp = a[mid].val;ans = max(ans,a[i].val + k + tp);}else{bz = i;}if(bz){m = 0;for (int i = 1;i <= n;++ i)if(i != bz) c[++ m].b = a[i].b,c[m].val = a[i].val;ans = max(ans,a[bz].val + c[mid].val);int l = c[mid].val;int r = 1e9;while (l <= r){int md = (l + r) >> 1;if(check(md)) l = md + 1,ans = max(ans,a[bz].val + md);else r = md - 1;}}printf("%lld\n",ans);}return 0;
}
D. Determine Winning Islands in Race
题意:
给 n 座岛屿,第 i 座和第 i + 1 座之间有一座桥(基础桥),除此之外还有若干座桥(附加桥),所有桥都是单向的且由标号小的岛屿指向标号大的岛屿。最初,Elsie 在 1 号岛屿,Bessie 在 s 号岛屿,他们都需要前往 n 号岛屿;Bessie 只能走基础桥,而 Elsie 可以走附加桥。
由 Bessie 率先开始,每一轮这个人都可以走一条存在的桥,然后他原先所在的岛屿立刻坍塌,这意味着所有与原先岛屿相连的桥也同时坍塌;如果当前无路可走,则这个人终止在这个岛屿。
两个人都采取最优策略,对于每个 ,判断 Bessie 能否到达 n 号岛屿。
思路:
假设有一座 u -> v 的桥,若 E 可以通过这段桥超过 B ,则必须要满足一下条件:
1. u < s
2. v - s > t (t 是 A 到达 v 所用的最快时间)
即
用 BFS 求出 A 到每个点的最短时间,再用差分数组统计贡献即可。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;#define N 200005int T,n,m,cnt,st[N],dis[N],vis[N],dif[N];struct Edge
{int next,to;
}ed[N << 1];queue<int> q;void add(int u,int v)
{ed[++ cnt].next = st[u];ed[cnt].to = v;st[u] = cnt;return;
}void bfs()
{while (!q.empty()) q.pop(); q.push(1),vis[1] = 1;while (!q.empty()){int x = q.front();q.pop(),vis[x] = 0;for (int i = st[x]; ~i ;i = ed[i].next){int rec = ed[i].to;if(dis[x] + 1 < dis[rec]){dis[rec] = dis[x] + 1;if(!vis[rec]) q.push(rec),vis[rec] = 1;}int l = x + 1;int r = rec - (dis[x] + 1) - 1;if(l <= r) ++ dif[l],-- dif[r + 1];}}return;
}int main()
{scanf("%d",&T);while (T --){scanf("%d%d",&n,&m),cnt = 0;for (int i = 1;i <= n;++ i) st[i] = -1,dis[i] = n + 1,vis[i] = dif[i] = 0;dis[1] = dif[0] = 0;for (int i = 1;i < n;++ i) add(i,i + 1);for (int i = 1,u,v;i <= m;++ i) scanf("%d%d",&u,&v),add(u,v);bfs();for (int i = 1;i < n;++ i) dif[i] += dif[i - 1],printf("%d",(dif[i]) ? 0 : 1);printf("\n");}return 0;
}
E1. Eliminating Balls With Merging (Easy Version)
题意:
给一行小球,每个小球上面都标有一个分值,小球可以通过向左右吃掉分值小于等于自己的球,并加上所吃小球的分值。问有多少个小球有可能成为最后剩下的那个小球。
思路:
Easy Version 我们可以利用贪心,按分值从大到小将球排序,从大球到小球进行处理。我们用单调栈记录一下每个小球左右两边第一个比它大的小球,分别记作 l 和 r 。容易发现,如果 l 或者 r 能成功留下,且当前小球可以吃掉它,那么当前小球一定可以成功留下,反之不行。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;#define N 200005int T,n,k,l[N],r[N],f[N],mx,ans;
long long a[N],pre[N];struct Node
{long long val,id;
}b[N];stack<int> q;int cmp(Node x,Node y) { return x.val > y.val ; }long long max(long long x,long long y) { return x > y ? x : y ; }int main()
{scanf("%d",&T);while (T --){scanf("%d%d",&n,&k),pre[0] = f[0] = f[n + 1] = mx = ans = 0;for (int i = 1;i <= n;++ i){scanf("%lld",&a[i]);b[i].id = i,b[i].val = a[i],f[i] = 0,mx = max(mx,a[i]),pre[i] = pre[i - 1] + a[i];}for (int i = 1;i <= n;++ i) f[i] = (a[i] == mx);sort(b + 1,b + n + 1,cmp);while (!q.empty()) q.pop();q.push(0),a[0] = 1e9 + 1ll;for (int i = 1;i <= n;++ i){while (!q.empty() && a[i] >= a[q.top()]) q.pop();l[i] = q.top();q.push(i);}while (!q.empty()) q.pop();q.push(n + 1),a[n + 1] = 1e9 + 1ll;for (int i = n; i ;-- i){while (!q.empty() && a[i] >= a[q.top()]) q.pop();r[i] = q.top();q.push(i);}for (int i = 1;i <= n;++ i){if(b[i].val == mx) continue;int now = b[i].id;long long sum = pre[r[now] - 1] - pre[l[now]];if(sum >= a[l[now]]) f[now] |= f[l[now]];if(sum >= a[r[now]]) f[now] |= f[r[now]];}for (int i = 1;i <= n;++ i) ans += f[i];printf("%d\n",ans);}return 0;
}
E2. Eliminating Balls With Merging (Hard Version)
题意:
Hard Version 唯一的区别就是给出一个 x ,对于所有 ,都要统计子序列 1 ~ i 的 Easy Version 的问题。
思路:
按 Easy Version 的做法肯定会超时,我们试试 “返璞归真” ,回归最原始易得的想法。
对于某个球 i 要是想留下来,就一定要把 1 ~ i - 1 都吃掉,那么我们可以计算想要把 1 ~ i - 1 都吃掉,至少需要往右吃到的位置 minr ;再根据已经把 1 ~ i - 1 都吃掉的情况下,至多往右吃到的位置 maxr 。那么球 i 对答案的贡献区间就是 [minr , maxr] ,用差分数组标记即可。
对于求 minr 和 maxr 的过程,可以用 ST 表 + 二分 做,循环判断向左最多吃到哪,和向右最优吃到哪,如果吃不动就跳出。这样是不会超时的,因为每次吃到卡住的地方都说明那个位置的分值比你目前拥有的一段区间的分值之和要大,也就是说每一次扩散都会让你手上的值至少翻倍,因此这一过程的复杂度是 log(最大分值) 的。
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;#define N 200005int T,n,p,lg[N],dif[N];
long long a[N],pre[N],f[N][22];stack<long long> st;long long max(long long x,long long y) { return x > y ? x : y ; }void RMQ()
{for (int i = 1;i <= lg[n];++ i)for (int j = 1;j + (1 << i) - 1 <= n;++ j)f[j][i] = max(f[j][i - 1],f[j + (1 << (i - 1))][i - 1]);return;
}int getMINR(int x)
{int tl,tr;tl = tr = x;while (tl > 1){int ml = 1;int mr = tl - 1;int now = tl;long long sum = pre[tr] - pre[tl - 1];int mid,len;while (ml <= mr){mid = (ml + mr) >> 1;len = tl - mid;long long mx = max(f[mid][lg[len]],f[tl - (1 << lg[len])][lg[len]]);if(sum >= mx) now = mid,mr = mid - 1;else ml = mid + 1;}if(tl > 1 && tl == now){ml = tr + 1;mr = n;now = tr;sum = pre[tr] - pre[tl - 1];while (ml <= mr){mid = (ml + mr) >> 1;len = mid - tr;long long mx = max(f[tr + 1][lg[len]],f[mid - (1 << lg[len]) + 1][lg[len]]);if(sum >= mx && sum + pre[mid] - pre[tr] >= a[tl - 1]) now = mid,mr = mid - 1;else if (sum >= mx) now = mid,ml = mid + 1;else mr = mid - 1;}if(now == tr){tr = -1;break;}else tr = now;}else tl = now;}return tr;
}int getMAXR(int x)
{while (x < n){int ml = x + 1;int mr = n;int now = x;long long sum = pre[x];while (ml <= mr){int mid = (ml + mr) >> 1;int len = mid - x;long long mx = max(f[x + 1][lg[len]],f[mid - (1 << lg[len]) + 1][lg[len]]);if(sum >= mx) now = mid,ml = mid + 1;else mr = mid - 1;}if(now == x) break;x = now;}return x;
}int main()
{lg[1] = 0;for (int i = 2;i <= 200000;++ i) lg[i] = lg[i >> 1] + 1;scanf("%d",&T);while (T --){scanf("%d%d",&n,&p),pre[0] = 0ll,a[0] = a[n + 1] = 1e9 + 1,dif[0] = 0;for (int i = 1;i <= n;++ i)scanf("%lld",&a[i]),f[i][0] = a[i],pre[i] = pre[i - 1] + a[i],dif[i] = 0;RMQ();for (int i = 1;i <= n;++ i){int mnr = getMINR(i);if(mnr == -1) continue;int mxr = getMAXR(i);++ dif[mnr],-- dif[mxr + 1];}for (int i = 1;i <= n;++ i){dif[i] += dif[i - 1];if(i >= p) printf("%d ",dif[i]);}printf("\n");}return 0;
}
总结
感觉总是会卡在前三题,导致后面一些能做的大分题没时间写,看来得多练练 ABC 了。
相关文章:

Codeforces Round 965 (Div. 2)
前言 有人在过七夕,我在打 cf ,还有某人独自一人在学校机房,凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。 Standings:2166 题目链接:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces A. Find K Distin…...

Win10下载安装Mysql服务
Win10下载安装MySQL 一、官网下载MySQL 1.官网地址: https://www.mysql.com/ 2.在官网首页拉到最下方,点击MySQL Community Server: 3.根据个人电脑的操作系统选择,此处以Windows x64为例,选择第2个,点击…...
MVVM(Model-View-ViewModel)架构模式
在Android开发中,MVVM(Model-View-ViewModel)架构模式已经成为构建可维护和可扩展应用程序的重要选择。MVVM模式通过分离视图(View)、模型(Model)和视图模型(ViewModel)来…...

C#MVC返回DataTable到前端展示。
很久没写博客了,闭关太久,失踪人口回归,给诸位道友整点绝活。 交代下背景:要做一个行转列的汇总统计,而且,由于是行转列,列的数量不固定,所以,没法使用正常的SqlSugar框…...
HttpUtils工具类(二)Apache HttpClient 5 使用详细教程
目录 一、Apache HttpClient 5介绍 (1)核心特性 (2)Apache HttpClient 5 的新特性 (3)在 Java 项目的主要使用场景及缺点 使用场景: 缺点: 二、在实际项目中的应用 …...

Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)
1、Vue 2.0 生命周期钩子 每个应用程序实例在创建时都有一系列的初始化步骤。例如,创建数据绑定、编译模板、将实例挂载到 DOM 并在数据变化时触发 DOM 更新、销毁实例等。在这个过程中会运行一些叫做生命周期钩子的函数,通过这些钩子函数可以定义业务逻…...

遥感之常用各种指数总结大全
目前在遥感领域基本各种研究领域都会用到各种各样的指数,如水体指数,植被指数,农业长势指数,盐分指数,云指数,阴影指数,建筑物指数,水质指数,干旱指数等等众多。 本文对上…...

【C++】C++11新增特性
目录 C11简介: 1、统一的列表初始化: std::initializer_list 2、自动类型推导: auto: decltype: 3、final 和 override final: override: 4、默认成员函数控制: 显示缺省…...

【LeetCode每日一题】——662.二叉树最大宽度
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 中等 三【题目编号】 662.二叉树最大宽度 四【题目描述】 给…...

第二十三节、血量更新逻辑的实现
一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类,然后创建项目菜单 2、进行订阅 放入事件类,关联代码,即可进行广播 传递给这…...
Spring Authorization Server 认证服务器搭建
Spring Authorization Server实现了oauth2和oidc,最近有了解相关技术的需求,所以就尝试着进行了基本的环境搭建和技术测试,目前只测试了授权码模式,做一个记录,后续需要用时方便查找和参考。 1. 版本要求 Spring Authorization Server 版本:1.3.1 JDK 版本:17 Spring B…...

秋招突击——8/15——知识补充——垃圾回收机制
文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器(Garbage First垃圾优先&#x…...

【iOS】UITableViewCell的重用问题解决方法
我自己在实验中对cell的重用总结如下: 非自定义Cell和非自定义cell的复用情况一样: 第一次加载创建tableView的时候,是屏幕上最多也显示几行cell就先创建几个cell,此时复用池里什么都没有开始下滑tableView,刚开始滑…...
开发一个微信小程序商城需要哪些技术栈
开发一个小程序商城需要掌握以下技术栈: 前端技术:包括HTML、CSS和JavaScript,用于定义商城的页面结构、样式设计和交互功能。 微信小程序专用技术:如WXML、WXSS、JavaScript和JSON,用于描述小程…...

望繁信科技荣膺上海市浦东新区博士后创新实践基地称号
近日,上海望繁信科技有限公司(简称“望繁信科技”)凭借在大数据流程智能领域的卓越表现,成功入选上海市浦东新区博士后创新实践基地。这一荣誉不仅是对望繁信科技创新能力和技术实力的高度认可,也标志着公司在推动产学…...

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端(用户)请求能力有一个极限,当接入请求过多时&#…...

Ubuntu20.4 系统安装后无wifi图标
0. 问题排查 1.检查 BIOS 设置: 有时候,无线网卡可能在 BIOS 中被禁用。重启电脑,进入 BIOS 设置,确保无线网卡选项是启用的。 2.检查硬件开关: 检查您的笔记本电脑是否有物理开关或键盘快捷键来启用或禁用无线网卡。 3.在软件更新中切换…...

牛客网SQL进阶135 :每个6/7级用户活跃情况
每个67级用户活跃情况_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、、试卷作答记录表exam_record、题目练习记录表practice_record,统计 每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,结果 按照总…...
SQLite3使用接口写入二进制文件
使用接口的方式写入二进制文件 ,有二种方案。 一、全部文件 一次性写下到数据中 使用sqlite3_bind_blob接口 FILE* fpfopen("user.bmp","rb"); iLenfread(buffer,1,65535,fp); fclose(fp);sqlite3_prepare(pDB,"insert into user values …...
在复杂的数据库架构中,如何优化 SQL 查询以提高性能和减少资源消耗?
在优化 SQL 查询以提高性能和减少资源消耗时,可以考虑以下几个方面: 使用索引:为经常被查询的列创建索引,可以大大加快查询速度。同时,避免过多的索引,因为过多的索引会增加写入操作的开销。 编写高效的查…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...