一、题目链接

  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 题解的更多相关文章

  1. CFGym 101490J 题解

    一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你n个点,代表学生所在位置,n个点,代表老师所在位置.每个学生分配一个老师.让你找出一个最小的学生 ...

  2. CFGym 101490E 题解

    一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你一个图,n个点,m条边,一个x,从顶点1走到顶点n.假设从顶点1走到顶点n的最短路为d,x代表你 ...

  3. CFGym 101161I 题解

    一.题目链接 http://codeforces.com/gym/101161/problem/I 二.题意 给定一棵树,一个初始的省会城市,若干个询问,0表示修改省会城市,1表示查询去省会必须经过指 ...

  4. CFGym 100198G 题解

    一.题目链接 http://codeforces.com/gym/100198/problem/G 二.题意 看样例就能明白,写表达式解析器. 三 .思路 一看这题目,立马就会想到“后缀表达式”,考虑 ...

  5. CFGym 101194L 题解

    一.题目链接 http://codeforces.com/gym/101194/problem/L 二.题意 有4个队伍,要打6场比赛(刚好每两个队伍都能相互比一次),若A和B比赛有3种结果: A赢B ...

  6. CFGym 101194D 题解

    一.题目链接 http://codeforces.com/gym/101194/problem/D 二.题意 给定一个数字n和一个数字k,一个n个整数的序列,让你在里面找尽可能多的长度为k的符合“要求 ...

  7. CFGym 100211J 题解

    一.题目 二.题意 给定一个字母表(最多也就是英文小写字母的前10个字母),一个交换表,两个字符串,判断字符串A能否通过交换表的交换方式变成字符串B. 三.思路 1.一开始,比赛时,我半模拟半记忆化地 ...

  8. [CF-GYM]Abu Tahun Mod problem题解

    前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. POJ 1034 The dog task(二分图匹配)

    http://poj.org/problem?id=1034 题意: 猎人和狗一起出去,狗的速度是猎人的两倍,给出猎人的路径坐标,除了这些坐标外,地图上还有一些有趣的点,而我们的狗,就是要尽量去多的有 ...

  2. 快递100API接口调用代码示例

    package com.util; import java.io.IOException; import java.io.InputStream; import java.net.MalformedU ...

  3. 计算机网络七层协议模型 “开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)

    计算机网络七层协议模型 作者:Ryan    时间:2013年10月7日 一.物理层(Physical Layer) OSI模型的最低层或第一层,规定了激活.维持.关闭通信端点之间的机械特性.电气特性 ...

  4. Model/ModelMap 和 ModelAndView 的区别使用

    Model/ModelMap 和 ModelAndView 的区别使用 Model/ModelMap controller: package springmvc.controller; import ...

  5. Linux编写一个C程序HelloWorld

    环境 需要文本编辑器和编译器,文本编辑器用linux(我用的centos7)自带的vi,编译器用gcc(GNU C Compiler/GNU Compiler Collection) 安装gcc,查看 ...

  6. LINUX QQ

    查询龙井QQ http://www.longene.org/forum/viewtopic.php?f=6&t=4700

  7. js取整,保留小数位数、四舍五入、科学记数法及去掉数字末尾多余的0

    1.向下取整 var num1 = 12.10345; var num2 =12.9801; var newnum1=Math.floor(num1)     //结果 12 var newnum2= ...

  8. 阅读和设计源码利器UML

    https://www.w3cschool.cn/uml_tutorial/ 就不做特殊说明了啊: 一 UML 1 简介 类注释: 下面的图表示的 UML 类,该图被分为四个部分. 顶端部分被用来命名 ...

  9. POJ 3279 Fliptile 状态压缩,思路 难度:2

    http://poj.org/problem?id=3279 明显,每一位上只需要是0或者1, 遍历第一行的所有取值可能,(1<<15,时间足够)对每种取值可能: 对于第0-n-2行,因为 ...

  10. PCB 中过孔和通孔焊盘的区别

    在PCB设计中,过孔VIA和焊盘PAD都可以实现相似的功能.它们都能插入元件管脚,特别是对于直插DIP)封装的的器件来说,几乎是一样的. 但是!在PCB制造中,它们的处理方法是不一样的. 1.VIA的 ...