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 查询以提高性能和减少资源消耗时,可以考虑以下几个方面: 使用索引:为经常被查询的列创建索引,可以大大加快查询速度。同时,避免过多的索引,因为过多的索引会增加写入操作的开销。 编写高效的查…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
