Codeforces Gym101522 D.Distribution of Days-算日期 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)
The Gregorian calendar is internationally the most widely used civil calendar. It is named after Pope Gregory XIII, who introduced it in October 1582.
In the Gregorian calendar, there are 28 days in February in a common year and 29days in February in a leap year. Year Y is a leap year if and only if Y is a multiple of 400, or Y is a multiple of 4 and is not a multiple of 100.
Percy is curious about the distribution of days of the week of his birthday in his life. By checking the calendar, he quickly finds that in the years between 1999 and 2017 (inclusive), his birthday (in case you do not know, 27 February) appears only twice on both Tuesday and Thursday, three times on each of the other days of the week.
Percy finds counting the distribution of some days in some consecutive years really cool, so he decides to invent a way to quickly count the distribution.
Within 15 minutes, he successfully invented a fast program to do the calculation for years between 1583 and 2 × 109, inclusive. His program can answer 5000 queries in 1second. However, he is not sure if the program works correctly, so he needs your help. Your task is simple, write your own program to do the calculation, so that Percy can check his program's correctness by comparing the outputs of different queries with your program.
In this problem, please assume the definition of leap years mentioned above is true for all years between 1583 and 2 × 109, inclusive.
Input
The first line consists of a single integer, Q, denotes the number of queries. (1 ≤ Q ≤ 5000)
In the next Q lines, each describes a single query. The queries are in the format S E M D, which means you have to calculate the distribution of days of the week for the D-th day of the M-th month for all years between S and E, inclusive. (1583 ≤ S ≤ E ≤ 2 × 109, the days given are one of the 366 valid days)
Output
Output Q lines, each answers a query given.
In each line output 7 integers, the frequencies of days of the weeks in this order: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday.
The order of answers should follow the order of queries given.
Example
1
1999 2017 2 27
3 3 2 3 2 3 3
2
2017 2017 8 15
2017 2021 2 29
0 0 1 0 0 0 0
0 0 0 0 0 0 1
4
3141 5926 5 3
5897 9323 8 4
2718 2818 2 8
2222 2222 2 22
404 391 403 390 404 396 398
488 488 497 481 497 480 496
15 14 14 15 14 15 14
0 0 0 0 0 1 0
这个题根本就没有什么技术含量,但是我写T了,
基姆拉尔森计算公式不好用,慎用。
正解(不是我写的,我的T了,不想改了)
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<cmath>
6 #include<stack>
7 #include<map>
8 #include<vector>
9 #include<set>
10 #include<queue>
11 using namespace std;
12 typedef long long ll;
13 const int MAXN=1e5+10;
14 const double mod=1e16+7;
15 int isr(int n)
16 {
17 if(n%4==0&&n%100!=0||n%400==0)return 1;
18 else return 0;
19 }
20 int da[810][15][35];
21
22 void init()
23 {
24 int k[15],l=6;
25 k[1]=31,k[2]=28,k[3]=31,k[4]=30,k[5]=31,k[6]=30;
26 k[7]=31,k[8]=31,k[9]=30,k[10]=31,k[11]=30,k[12]=31;
27 memset(da,0,sizeof(da));
28 for(int i=0;i<=399;i++){
29 for(int j=1;j<=12;j++){
30 if(j==2)
31 for(int t=1;t<=k[j]+isr(i);t++){
32 if(l+1==8)l=0;
33 da[i][j][t]=++l,da[i+400][j][t]=l;
34 }
35 else
36 for(int t=1;t<=k[j];t++){
37 if(l+1==8)l=0;
38 da[i][j][t]=++l,da[i+400][j][t]=l;
39 }
40 }
41 }
42 }
43
44 int main()
45 {
46 int q,y1,y2,m,d,t;
47 ll s[10];
48 cin>>q;
49 init();
50 while(q--){
51 memset(s,0,sizeof(s));
52 scanf("%d%d%d%d",&y1,&y2,&m,&d);
53 if(y2-y1>=400){
54 t=(y2-y1)/400;
55 for(int i=1;i<=400;i++)
56 s[da[i][m][d]]+=t;
57 }
58 y1%=400,y2%=400;
59 if(y1>y2) y2+=400;
60 for(int i=y1;i<=y2;i++){
61 s[da[i][m][d]]++;
62 }
63 for(int i=1;i<=7;i++)
64 cout<<s[i]<<" ";
65 cout<<endl;
66 }
67 }
贴一下我的超时垃圾代码:
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cmath>
5 #include<math.h>
6 using namespace std;
7 int CaculateWeekDay(int y,int m, int d){
8 if(m==1||m==2){
9 m+=12;
10 y--;
11 }
12 int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;//基姆拉尔森计算公式根据日期判断星期几
13 if(m==2&&d==29) return iWeek+15;
14 return iWeek+1;
15 }
16 int b[30];
17 int year1=0,year2=0,month=0,day=0;
18 void isbb(){
19 memset(b,0,sizeof(b));
20 for(int i=1;i<=400;i++){
21 int temp=CaculateWeekDay(i,month,day);
22 b[temp]++;
23 }
24 }
25 int main(){
26 int a[10];
27 int t;
28 while(~scanf("%d",&t)){
29 while(t--){
30 scanf("%d%d%d%d",&year1,&year2,&month,&day);
31 memset(a,0,sizeof(a));
32 isbb();
33 if((year2-year1)/400){
34 int x=(year2-year1)/400;
35 if(month==2&&day==29){
36 int j=1;
37 for(int i=15;i<=22;i++)
38 a[j++]=b[i];
39 }
40 else{
41 for(int i=1;i<=7;i++)
42 a[i]=b[i];
43 }
44 for(int i=1;i<=7;i++)
45 a[i]*=x;
46 year1%=400;
47 if(year2%400<year1)year2=year2%400+400;
48 else year2%=400;
49 for(int i=year1;i<=year2;i++){
50 if(month==2&&day==29){
51 if(i%400==0){
52 int temp=CaculateWeekDay(i,month,day);
53 a[temp-15]++;
54 }
55 }
56 else{
57 int temp=CaculateWeekDay(i,month,day);
58 a[temp]++;
59 }
60 }
61 }
62 else{
63 for(int i=year1;i<=year2;i++){
64 int temp=CaculateWeekDay(i,month,day);
65 a[temp]++;
66 }
67 }
68 }
69 cout<<a[7];
70 for(int i=1;i<=6;i++)
71 cout<<" "<<a[i];
72 cout<<endl;
73 }
74 return 0;
75 }
心累。。。
Codeforces Gym101522 D.Distribution of Days-算日期 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)的更多相关文章
- Codeforces Gym101522 C.Cheering-字符串 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)
C.Cheering To boost contestants' performances in the 20th La Salle - Pui Ching Programming Challenge ...
- Codeforces Gym101522 A. Ambiguous Dates (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)
A. Ambiguous Dates There are two popular formats for representing a date: day/month/year or month/da ...
- gym101522 [小熊骑士限定]La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017
西瓜队(划掉),Kuma Rider久违的第一场训练,四小时瞎打.jpg A.水题,排序 #include<cstdio> #include<iostream> #includ ...
- Codeforces 1167C - News Distribution
题目链接:http://codeforces.com/problemset/problem/1167/C 题意:大概就是分成几个小团体,给每个人用1 - n编号,当对某个人传播消息的时候,整个小团体就 ...
- Codeforces 1090A - Company Merging - [签到水题][2018-2019 Russia Open High School Programming Contest Problem A]
题目链接:https://codeforces.com/contest/1090/problem/A A conglomerate consists of n companies. To make m ...
- 【Teradata】日期类型计算
1.EXTRACT(抽取年/月/日/时/分/秒) //抽取年/月/日/时/分/秒 SELECT EXTRACT (YEAR FROM CURRENT_DATE); SELECT EXTRACT (M ...
- Python datetime time 等时间 日期 之间的计算和相互转化
from datetime import datetime, date, timedelta, timezone from time import time, ctime, localtime, st ...
- Java8新特性--日期和时间API
如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...
- CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列
B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...
随机推荐
- 排序算法C语言实现——插入排序(优于冒泡)
为什么插入排序要优于冒泡? 插入排序在于向已排序序列中插入新元素,主要的动作是移动元素,涉及1次赋值,即data[j] = data[j-1]; 而冒泡排序在于相邻元素交换位置,涉及3条赋值,即iTm ...
- git 使用规范
git使用资料: https://github.com/peak-c/my-git 公司内部使用开发规范: 一. 代码库介绍 个人开发库(git@gitlab.adrd.sohuno.com:sper ...
- Linux下 导入导出数据库
1.怎么找到mysql下的bin? 1.1首先我在网上百度了一些Linux下如何导入导出数据.基本都是用mysqldump命令,但是如果没有到指定目录 下,执行这个命令是没有用的.一开始我还以为要在m ...
- Android 线程那些事儿
前言:前面写的线程简直是一坨废物,到现在依然一头雾水,真是一点点都没领悟,于是又打算下一番功夫了,必须要学好线程,不然今后也是一坨废物. 1.理解了一点调试时,到线程阶段总是报错的一个原因,就是系统会 ...
- 新手用WPF山寨QQ管家7.6(三)
由于一直忙工作,没有更新完博客,更可恨的是...在清理资料的时候不小心删除了之前自己做的各种效果的DEMO....好在项目中用到了大部分,也算有所保留,以后可不敢随便删东西了....太可怕了! 在 新 ...
- P2615 神奇的幻方
P2615 神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首 ...
- idea 安装findBugs 可以做代码扫描,也可以导出扫描结果生成扫描报告
idea 安装findBugs 可以做代码扫描,也可以导出扫描结果生成扫描报告 https://my.oschina.net/viakiba/blog/1838296 https://www.cnbl ...
- Couchbase I
Couchbase第一印象(架构特性) 面向文档 保存的字节流总有一个 DOCUMENT ID(Object_ID) 高并发性,高灵活性,高拓展性,容错性好 面向文档的集群存储系统 每个文档用一个唯一 ...
- Postgresql 查看建表语句 命令
pg_dump -U username databasename -W -s -t tablename -s, --schema-only 只转储模式, 不包括数据 -t, --table=TABLE ...
- 牛客多校第六场C
一个数很大,并不能预处理,所以要进行公式变换,存前一个的值就好 #include <bits/stdc++.h> using namespace std; typedef long lon ...