#36. 同比环比

内存限制:512 MiB 时间限制:5000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: hiram

题目描述

计算一个二维表中某些聚合指标的同期和环期,这里的聚合方式为求和。

同期、环期定义:

环期:上一个周期的数值 同期:上一个更大周期中同一时间段的数值 环期只有一个,同期则因参照量(另一个更大周期)不同而不同,有多个。

例如我今天(12.25日,星期日)步数是1000步,昨日800步,则环期为 800; 同期有多个,例如上周日为700步,上月25日900步,则上周同期为700,上月同期为900。

聚合方式包括:求和

分组方式:

年周星期+指标1+指标2+ ... 年月日+指标1+指标2+... 年周 + 指标1 + 指标2 +...

输出为计算指标的 日的月同期 & 星期的年同期 & 日环期 & 周环期(年周分组)

*注:同期/环期时间具体计算逻辑

同期计算逻辑

2011-08-09来描述,2011年8月9日 农历 七月初十 第33周,星期二

年周星期

年_星期 星期的年同期 当前日期 -537天/527天 保证周数,星期不变化,没有对应日期为空(-1)

年月日

月_日 日的月同期 当前日期 -31/30/29/28天,保证日不变化,无对应日时同期为空(-1) 2011/7/9

环期计算逻辑

2011-08-09来描述,2011年8月9日 农历 七月初十 第33周,星期二

年周星期 可求日环期,最小粒度为日 当前日期 -1天 2011/8/8 第33周,星期一

如果当前日期为2011/1/1则其环期为2010/12/31

年月日 可求日环期,最小粒度为日 当前日期-1天 2011/8/8 第33周,星期一

如果当前日期为2011/1/1则其环期为2010/12/31

年周 可求周环期,最小粒度为周 当前日期 -7天 2011年第32周

年周数的计算规则按照ISO标准周计算,规则见:https://en.wikipedia.org/wiki/ISO_week_date。注意:ISO标准周的年份可能与实际年份不同,例如2016年1月1日的年周数是2015-53

注1:相同时间分组存在多行时,其原值对应的指标值是多行指标之和。(如示例数据中,输出的第1行第4列,6来自于2+4)

注2:一周的第一天为周1

输入格式

第一行行数

第二行列数

第三行开始,每行对应这个二维表的每一行数据,所有数据均为非负整数,每个数据之间以空格分隔。(前三列为时间,最后一列为计算指标,中间所有列为分组维度)

输出格式

输出4列数据,为输出数据行对应的四个同期环期计算值。

第一列: 计算指标各个分组下计算指标的日的月同期。

第二列:计算指标各个分组下计算指标的星期的年同期。

第三列:计算指标各个分组下计算指标的日环期。

第四列:计算指标各个分组下计算指标的周环期。

样例

输入:

6
5
2011 8 16 1 1
2011 8 9 1 2
2011 8 8 1 4
2011 7 8 1 2
2010 7 9 1 4
2010 7 8 2 5

输出:

-1 -1 -1 6
-1 -1 4 -1
2 -1 -1 -1
-1 4 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1

数据范围与提示

输入输出均为int。

输出数据每行末尾有一个空格。最后一行末尾有个换行。

使用

 DataInputStream dis = new DataInputStream(new BufferedInputStream(System.in));

可以更加快速的读。