前言

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

题目大意

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

解题思路

实际上,最麻烦的地方是相同会出现重叠,并且不管重叠几次,都只造成 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;
}

GDKOI2023 D2T1相关推荐

  1. 杨辉三角(二项式定理)组合数 【noip 2011/2016 d2t1】

    杨辉三角与二项式定理 , (紫书p349) 杨辉三角性质via百度百科 杨辉三角与组合数 EG1 noip2011 d2t1 计算系数 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^ ...

  2. GDKOI-2023 游记

    GDKOI-2023 游记 文章目录 GDKOI-2023 游记 1 扯淡 2 成绩单 3 行程 3.1 D a y 0 Day0 Day0 3.2 D a y 1 Day1 Day1 3.3 D a ...

  3. 【CSP-S2019】D2T1 Emiya 家今天的饭

    CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...

  4. [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads

    目录 题意 输入格式 输出格式 样例 Input Output 数据范围 时间限制 思路 代码 题意 有\(N\)个人,现在你要从中选出\(K\)个人出来,然后让这\(K\)个人一起参加\(K\)场比 ...

  5. 【NOIP2015】D2-T1跳石头,二分答案

    如果这道题没有写60分的堆加贪心而是二分,如果我在考试前我能写一道自己一直在躲避的二分答案,如果我能骗到第三题哪怕15分,结果都会不同,可惜没如果-- ------------------------ ...

  6. GDKOI2023游记

    Day ? 本来想报pj的,被A诱骗,说pj.tg两个都报几率大,结果全机房都去tg了,我怀疑只要报了就给进. Day -5 开始停课备战GDKOI. 打了模拟赛.浙江省选模拟. T1 扫描线.根本没 ...

  7. 「SCOI 2018 D2T1」Pipi 酱的日常

    传送门 problem 给定 nnn 个数,第 i(1≤i≤n)i(1\le i\le n)i(1≤i≤n) 个位置上的值为 xix_ixi​,有 mmm 个操作,操作有以下两种: 1 pos v:将 ...

  8. 计蒜客NOIP模拟赛4 D2T1 鬼脚图

    鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...

  9. Ender的模拟赛D2T1 wait【min-max反演】

    题目描述 有一n*m的棋盘,每次随机染黑一个位置(可能染到已经黑了的),当某一行或者一列全为黑色时停止,求期望染色次数(mod 998244353) 对于100%的数据n,m<=1000 题目分 ...

最新文章

  1. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
  2. 普林斯顿大学计算机科学与技术专业硕士项目拒信
  3. 仪表指针样式_Qt自定义Widget之仪表盘
  4. 你不知道LinkedList中的方法
  5. 使用Chatkit构建Node.js命令行聊天应用程序
  6. sequence——强行推式子+组合意义
  7. 通过CSS来垂直居中文本
  8. Ashmem、MemoryFile、Binder的共享内存(jni可用)
  9. BMap:JavaScript API
  10. 利用云服务器搭建内网映射服务器
  11. HexCompare比较任意Bin/Hex/Srec/s19/elf文件
  12. 大数据专业python实验报告_大数据导论实验报告
  13. LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置
  14. matlab 分块 矩阵 对角 合并
  15. 高德地图api接口免费查询天气实战案例,axios请求查询天气,js版,【接上一篇微信测试号推送纪念日】
  16. OpenDDS开发人员指南中文版3.23(2)入门
  17. 关闭窗口提示以及窗口被关闭后执行函数
  18. 新款Macbook Pro可以升级固态硬盘吗?
  19. 如何关闭计算机英语作文,英语作文lt;关掉你的电脑gt;
  20. 【偶遇小bug】浏览器无法翻译此网页解决

热门文章

  1. 手游直播正在连接推流服务器,游戏直播时Airplay投屏卡死完美解决方案
  2. mysql-8.0.28-winx64安装步骤
  3. 电脑断电后,突然无线有线网卡无法使用
  4. bmp180气压传感器工作原理_【科普】40种传感器工作原理
  5. SpringBoot项目网页加载出现Whitelabel Error Page
  6. python中Pandas之DataFrame索引、选取数据
  7. python运行excel宏_从python运行excel宏
  8. Visual Studio2010当前不会命中代码,源代码与原始版本不同问题的解决方法
  9. 电脑桌面上没有计算机回收站,桌面上没有回收站,桌面没有回收站怎么找
  10. 【转】让电脑更高效的魔法 – 浅谈高效率PC工作环境的简化、净化与建立方法...