CFGym 101505I 题解
一、题目链接
http://codeforces.com/gym/101505
二、题意
这题其实主要就是题意,理解题意后,就是水题了。我想了下,主要原因就是这几点:
1、题意太过英文化,很多句子不能和中文一对一翻译,导致理解出现偏差。
2、题意没讲清楚。对于每个测试样例,第一个数据是不用考虑的。这点题目没说,要是说了,估计这题过的人更多。
主要意思就是:给你N组数组,每组一个t和一个v,其实输入的t是递增的(严不严格无所谓)。再给M个询问,询问格式是:<大于或小于> <聚集函数> <时间>。比如:gt max 300,表示:对于第i(1<=i<=N)个数据,若它的时间是Ti,判断它的值Vi是否比[Ti - 300, Ti)这个区间内记录的数据的V的最大值还大。如果是,结果+1,然后输出有多少组这样的数据。对于每个询问都是如此。注意,第一组数据是不用考虑的。因为它前面没有数据。
三、思路
理解题意后,思路就很简单了。对于每个询问,循环遍历所有数据(从第2个开始),假设询问时间为t, 第i组数据的时间为Ti,找到大于等于Ti-t的时间所在下标j(可以通过二分找到,因为数据位置不会变,所以时间和值可以分开存,而不需要结构体。如果用结构体,就要手写lower_bound函数了),计算区间[j, i - 1)内的最大值、最小值或平均值。一维区间求最值,可以用线段树。
四、源代码
#include<bits/stdc++.h> using namespace std; typedef pair<int, int> PII; ; int n, m; int tim[maxn], val[maxn], sum[maxn]; << , ); PII data[maxn << ]; void update(int x, int v) { ; data[_t].first = data[_t].second = v; ; _t > ; _t >>= ) { data[_t].first = min(data[_t << ].first, data[_t << | ].first); data[_t].second = max(data[_t << ].second, data[_t << | ].second); } } void init() { ; ; m = _t; ; i < m << ; ++i)data[i] = INF; ; i <= n; ++i)update(i, val[i]); } PII query(, , int r = m) { if(y < l || x > r)return INF; else if(l >= x && r <= y)return data[root]; else { ; PII left = query(x, y, root << , l, mid); PII right = query(x, y, root << | , mid + , r); return make_pair(min(left.first, right.first), max(left.second, right.second)); } } int Max(int idx, int before, int type) { , tim + n + , tim[idx] - before) - tim; ? << : ; PII ans = query(j, idx - ); return ans.second; } int Min(int idx, int before, int type) { , tim + n + , tim[idx] - before) - tim; ? << : ; PII ans = query(j, idx - ); return ans.first; } double Avg(int idx, int before) { , tim + n + , tim[idx] - before) - tim; ] - sum[j - ]) / (1.0 * (idx - j)); } int main() { ], op2[]; while(~scanf("%d", &n)) { memset(sum, , sizeof(sum)); memset(op1, '\0', sizeof(op1)); memset(op2, '\0', sizeof(op2)); ; i <= n; ++i)scanf("%d%d", &tim[i], &val[i]); ; i <= n; ++i)sum[i] = sum[i - ] + val[i]; init(); int q, before; scanf("%d", &q); while(q--) { scanf("%s%s%d", op1, op2, &before); ; ) { ) { ; i <= n; ++i)))++cnt; } ) { ; i <= n; ++i) if((double)val[i] > Avg(i, before))++cnt; } ) { ; i <= n; ++i)))++cnt; } } ) { ) { ; i <= n; ++i)))++cnt; } ) { ; i <= n; ++i)if((double)val[i] < Avg(i, before))++cnt; } ) { ; i <= n; ++i)))++cnt; } } printf("%d\n", cnt); } } } /* 5 4 16 9 49 46 93 55 16 62 55 8 gt max 29 lt avg 15 gt min 34 gt max 4 lt min 44 lt max 29 gt max 42 lt avg 10 10 60 30 120 28 180 35 240 34 300 40 360 31 420 28 480 2 540 42 600 30 2 gt avg 7200 lt min 300 8 1 10 5 30 10 50 15 45 20 55 25 40 30 30 35 20 6 gt max 10 gt avg 10 gt min 10 lt max 10 lt avg 10 lt min 10 */
变量m是为设计线段树而定义的,因为n不会刚好是2的幂。
CFGym 101505I 题解的更多相关文章
- CFGym 101490J 题解
一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你n个点,代表学生所在位置,n个点,代表老师所在位置.每个学生分配一个老师.让你找出一个最小的学生 ...
- CFGym 101490E 题解
一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你一个图,n个点,m条边,一个x,从顶点1走到顶点n.假设从顶点1走到顶点n的最短路为d,x代表你 ...
- CFGym 101161I 题解
一.题目链接 http://codeforces.com/gym/101161/problem/I 二.题意 给定一棵树,一个初始的省会城市,若干个询问,0表示修改省会城市,1表示查询去省会必须经过指 ...
- CFGym 100198G 题解
一.题目链接 http://codeforces.com/gym/100198/problem/G 二.题意 看样例就能明白,写表达式解析器. 三 .思路 一看这题目,立马就会想到“后缀表达式”,考虑 ...
- CFGym 101194L 题解
一.题目链接 http://codeforces.com/gym/101194/problem/L 二.题意 有4个队伍,要打6场比赛(刚好每两个队伍都能相互比一次),若A和B比赛有3种结果: A赢B ...
- CFGym 101194D 题解
一.题目链接 http://codeforces.com/gym/101194/problem/D 二.题意 给定一个数字n和一个数字k,一个n个整数的序列,让你在里面找尽可能多的长度为k的符合“要求 ...
- CFGym 100211J 题解
一.题目 二.题意 给定一个字母表(最多也就是英文小写字母的前10个字母),一个交换表,两个字符串,判断字符串A能否通过交换表的交换方式变成字符串B. 三.思路 1.一开始,比赛时,我半模拟半记忆化地 ...
- [CF-GYM]Abu Tahun Mod problem题解
前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
随机推荐
- QT 正则表达式无效
背景:写了一个判断IP地址合法的正则表达式,并让它应用在输入框中 代码如下 QRegExp rx_ip("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}( ...
- 51nod 1179 最大的最大公约数 一种筛选的方法
1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出N个正整数,找出N个数两两之间最大公约数的最大值 ...
- redis缓存穿透、缓存击穿、缓存雪崩
缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透. 解决办法: 预校验 在控 ...
- Android将图片保存到相册并及时看到
Android中将图片保存到SD卡中,相册里不会及时出现这张图片,因为没有及时更新其索引,一般需要开机几次.当然我们可以手动更新其索引. 1,首先将文件保存到SD卡中. String filePath ...
- 数据库 update select 多列操作
最常用的update语法是: UPDATE <table_name> SET <column_name1> = <value>, SET <column_ ...
- Java中的HashMap的工作原理是什么?
问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...
- 新转移注意(caffe):ImportError: libcudart.so.7.0: cannot open shared object file: No such file or directory
https://github.com/NVIDIA/DIGITS/issues/8 For this error ImportError: libcudart.so.7.0: cannot open ...
- Linux之screen命令详解
一.nohup 工作中经常会遇到这样的需求,通过SecureCRT或其它工具远程到服务器执行某个任务,而这个任务耗时又比较长,你又不得不等待它执行完毕,但是如果此间如果关掉窗口或断开连接又会导致任务被 ...
- 【转】 python 删除非空文件夹
转自:https://blog.csdn.net/xiaodongxiexie/article/details/77155864 一般删除文件时使用os库,然后利用os.remove(path)即可完 ...
- Swift学习——A Swift Tour 协议和扩展
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/28854395 Protocols an ...