GDKOI2023 D2T1

news/2024/10/22 14:44:42/

前言

相比于D1T1,这题才是真正的签到题,然而,我却爆0了。为了纪念这悲壮的0分,写下了这篇题解。

题目大意

给出 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1n105) 个字符串及其出现时间(以几点几分给出),每个字符串会存在 m ( 1 ≤ m ≤ 1440 ) m(1\le m\le 1440) m(1m1440) 个单位时间(分钟),求存在字符串最多的时间点有多少个字符串(注意:同个字符串在同一时间点重叠只算一个字符串

解题思路

实际上,最麻烦的地方是相同会出现重叠,并且不管重叠几次,都只造成 1 1 1 的贡献。所以,显而易见,我们需要将每一个字符串分开考虑。参考下图:
在这里插入图片描述
由于重叠部分也只造成 1 1 1 的贡献,我们考虑进行区间合并。先按照左端点排序:
在这里插入图片描述
如果下一个区间的左端点小于这一个区间的右端点,那么一定可以进行区间合并,也就是将右端点后移,合并后,得到下图:
在这里插入图片描述
再进行区间加即可。相信大家第一个想到的都是差分,可是从这里开始,我突然脑抽了,果断打起了线段树,过了样例(因为太水了……),然后爆0了。赛后调出来了,写篇题解给自己一个警告:就算再喜欢线段树,考场上也尽量不要写!!!

代码实现

#include <bits/stdc++.h>
using namespace std;
struct node {long long l, r, laz, Max;
} segment_tre[10010];
struct node2 {long long f, t;
};
long long n, m, tot;
unordered_map<string, long long> mem;
vector<node2> v[100010], sorted_v[100010];
string s1, s2;
void setup(long long i, long long l, long long r) {segment_tre[i].l = l;segment_tre[i].r = r;if (l == r)return;long long mid = ((l + r) >> 1);setup(i * 2, l, mid);setup(i * 2 + 1, mid + 1, r);
}
void push_d(long long i) {if (segment_tre[i].laz != 0) {segment_tre[i * 2].Max += segment_tre[i].laz;segment_tre[i * 2].laz += segment_tre[i].laz;segment_tre[i * 2 + 1].Max += segment_tre[i].laz;segment_tre[i * 2 + 1].laz += segment_tre[i].laz;segment_tre[i].laz = 0;}return;
}
void change(long long i, long long l, long long r, long long num) {if (segment_tre[i].l >= l && segment_tre[i].r <= r) {segment_tre[i].laz++;segment_tre[i].Max++;return;}push_d(i);if (segment_tre[i * 2].r >= l)change(i * 2, l, r, num);if (segment_tre[i * 2 + 1].l <= r)change(i * 2 + 1, l, r, num);segment_tre[i].Max = max(segment_tre[i * 2].Max, segment_tre[i * 2 + 1].Max);return;
}
long long ask(long long i, long long l, long long r) {if (segment_tre[i].l >= l && segment_tre[i].r <= r)return segment_tre[i].Max;push_d(i);long long value = 0;if (segment_tre[i * 2].r >= l)value = max(value, ask(i * 2, l, r));if (segment_tre[i * 2 + 1].l <= r)value = max(value, ask(i * 2 + 1, l, r));return value;
}
long long work(string s) { return ((s[0] - '0') * 10 + s[1] - '0') * 60 + (s[3] - '0') * 10 + s[4] - '0'; }
int main() {ios::sync_with_stdio(false);cin.tie(0);freopen("switch.in", "r", stdin);freopen("switch.out", "w", stdout);cin >> n >> m;setup(1, 0, 24 * 60);for (int i = 1; i <= n; i++) {cin >> s1 >> s2;if (mem[s1] == 0) {mem[s1] = ++tot;v[tot].push_back((node2){ work(s2), work(s2) + m - 1 });} elsev[mem[s1]].push_back((node2){ work(s2), work(s2) + m - 1 });}for (int i = 1; i <= tot; i++) {sort(v[i].begin(), v[i].end(), [&](node2 q, node2 h) -> bool { return q.f < h.f; });long long f = v[i][0].f, t = v[i][0].t;for (int j = 1; j < v[i].size(); j++)if (v[i][j].f <= t)t = v[i][j].t;else {sorted_v[i].push_back((node2){ f, t });f = v[i][j].f;t = v[i][j].t;}sorted_v[i].push_back((node2){ f, t });}for (int i = 1; i <= tot; i++)for (int j = 0; j < sorted_v[i].size(); j++) change(1, sorted_v[i][j].f, sorted_v[i][j].t, 1);cout << ask(1, 0, 24 * 60);return 0;
}

http://www.ppmy.cn/news/345093.html

相关文章

gec210(s5pv210)总结

烧写内核的方法总结&#xff1a; 在有Uboot的前题下&#xff0c;通过NFS挂载来烧写。 在开启粤嵌gec210开发板的时候&#xff0c;在3秒内按任意键&#xff0c;进入uboot&#xff0c;接下来按e&#xff0c;进入可输入命令状态。 &#xff08;1&#xff09;通过pri来检查ip &…

G2.

图例配置 shape, color, size 这三个图形属性如果判断接收的参数是数据源的字段时&#xff0c;会自动生成不同的图例&#xff1b;shape属性&#xff0c;会根据不同的 shape 类型生成图例&#xff1b;color 属性&#xff0c;会赋予不同的图例项不同的颜色来区分图形&#xff1b…

G120C: Description

3.1 Scope of delivery inverters FSAA ... FSC The delivery comprises at least the following components: ● A ready to run inverter with loaded firmware. ● 1 set of terminal strips for connecting the inputs and outputs ● 1 set of shield plates, including …

部署Alertmanager对prometheus监控检测飞书报警通知

告警效果 一、编写alertmanager.yml 创建个目录存放alertmanager.yml文件 mkdir -p /data/alertmanager vi alertmanager.ymlroute:group_by: [alertname]group_wait: 30sgroup_interval: 30srepeat_interval: 1mreceiver: web.hook receivers:- name: web.hookwebhook_confi…

微信红包软件可测试,微信抢红包神器测试g2020

微信抢红包神器测试g是一款在2020年全新升级推出的可以辅助微信抢红包的神器。微信抢红包神器测试g支持自动抢红包的功能&#xff0c;自动开启&#xff0c;即使手机锁屏&#xff0c;后台依然可以自动帮你抢红包&#xff0c;而且还可以自动回复哦&#xff0c;自定义开启&#xf…

JavaScript字符串常用方法

关注“大前端私房菜”微信公众号&#xff0c;输入暗号【面试宝典】即可免费领取107页前端面试题。 字符串的常用方法 我们操作字符串&#xff0c;也有一堆的方法来帮助我们操作&#xff0c;字符串和数组有一个一样的地方&#xff0c;也是按照索引来排列的 注意&#xff1a;所有…

MAC系统使用

查看端口占用情况 //如查看8080端口的占用情况 sudo lsof -i tcp:9901//比如我们想要释放Java占用的9901端口 PID 是 12420 kill -9 12420

《低代码指南》低代码开发平台Noodl即将开源

Noodl 是一个低代码开发平台,让设计师、开发者能够用低代码的可视化编程方法构建强大的 Web 应用。目前 Noodl 已被亚马逊、三星、沃尔玛等财富 500 强企业应用于原型设计到生产环境中。 日前,Noodl 官方发出公告表示,将从现有的付费订阅模式向开源模式过渡。 Noodl 目前的…