GDKOI2023 D2T1
前言
相比于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相关推荐
- 杨辉三角(二项式定理)组合数 【noip 2011/2016 d2t1】
杨辉三角与二项式定理 , (紫书p349) 杨辉三角性质via百度百科 杨辉三角与组合数 EG1 noip2011 d2t1 计算系数 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^ ...
- 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 ...
- 【CSP-S2019】D2T1 Emiya 家今天的饭
CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...
- [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads
目录 题意 输入格式 输出格式 样例 Input Output 数据范围 时间限制 思路 代码 题意 有\(N\)个人,现在你要从中选出\(K\)个人出来,然后让这\(K\)个人一起参加\(K\)场比 ...
- 【NOIP2015】D2-T1跳石头,二分答案
如果这道题没有写60分的堆加贪心而是二分,如果我在考试前我能写一道自己一直在躲避的二分答案,如果我能骗到第三题哪怕15分,结果都会不同,可惜没如果-- ------------------------ ...
- GDKOI2023游记
Day ? 本来想报pj的,被A诱骗,说pj.tg两个都报几率大,结果全机房都去tg了,我怀疑只要报了就给进. Day -5 开始停课备战GDKOI. 打了模拟赛.浙江省选模拟. T1 扫描线.根本没 ...
- 「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:将 ...
- 计蒜客NOIP模拟赛4 D2T1 鬼脚图
鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...
- Ender的模拟赛D2T1 wait【min-max反演】
题目描述 有一n*m的棋盘,每次随机染黑一个位置(可能染到已经黑了的),当某一行或者一列全为黑色时停止,求期望染色次数(mod 998244353) 对于100%的数据n,m<=1000 题目分 ...
最新文章
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
- 普林斯顿大学计算机科学与技术专业硕士项目拒信
- 仪表指针样式_Qt自定义Widget之仪表盘
- 你不知道LinkedList中的方法
- 使用Chatkit构建Node.js命令行聊天应用程序
- sequence——强行推式子+组合意义
- 通过CSS来垂直居中文本
- Ashmem、MemoryFile、Binder的共享内存(jni可用)
- BMap:JavaScript API
- 利用云服务器搭建内网映射服务器
- HexCompare比较任意Bin/Hex/Srec/s19/elf文件
- 大数据专业python实验报告_大数据导论实验报告
- LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置
- matlab 分块 矩阵 对角 合并
- 高德地图api接口免费查询天气实战案例,axios请求查询天气,js版,【接上一篇微信测试号推送纪念日】
- OpenDDS开发人员指南中文版3.23(2)入门
- 关闭窗口提示以及窗口被关闭后执行函数
- 新款Macbook Pro可以升级固态硬盘吗?
- 如何关闭计算机英语作文,英语作文lt;关掉你的电脑gt;
- 【偶遇小bug】浏览器无法翻译此网页解决
热门文章
- 手游直播正在连接推流服务器,游戏直播时Airplay投屏卡死完美解决方案
- mysql-8.0.28-winx64安装步骤
- 电脑断电后,突然无线有线网卡无法使用
- bmp180气压传感器工作原理_【科普】40种传感器工作原理
- SpringBoot项目网页加载出现Whitelabel Error Page
- python中Pandas之DataFrame索引、选取数据
- python运行excel宏_从python运行excel宏
- Visual Studio2010当前不会命中代码,源代码与原始版本不同问题的解决方法
- 电脑桌面上没有计算机回收站,桌面上没有回收站,桌面没有回收站怎么找
- 【转】让电脑更高效的魔法 – 浅谈高效率PC工作环境的简化、净化与建立方法...