题解:CF245F Log Stream Analysis

· · 题解

终于 A 了这道题,不容易啊。

(点进这道题之前它还是黄的呢,怎么突然绿了?是我眼花了吗?)

思路

模拟即可。首先把一行里的数字都读出来,全部压进一个 long long。因为日志信息里没有数字,所以可以少判很多。然后滑动窗口进行判断,因为日志时间有序,所以令窗口大小为 m,只需判断首尾之差是否大于 n 即可。求差最麻烦了,要注意:

然后就是码代码时间了。

实现

别看它很长,有一大半都是在读写。

#include <cstdio>
using namespace std;
#define ll long long
#define ull unsigned long long

namespace io{
const int size=(1<<20)+1;
char buf[size],*p1=buf,*p2=buf;
char buffer[size];
int op1=-1;
const int op2=size-1;
inline char readchar() {
    if(p1!=p2) {
        return *p1++;
    }
    return p1==(p2=(p1=buf)+fread(buf,1,size-1,stdin))?EOF:*p1++;
}
inline void flush() {
    fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
    if(op1==op2) flush();
    buffer[++op1]=x;
}
#ifndef ONLINE_JUDGE
#define gc getchar
#else
#define gc readchar
#endif
#define pc writechar
#define el pc(10)
#define sp pc(32)
inline int readi(){
    int x=0;bool w=0;
    char ch=gc();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=1;
        ch=gc();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=gc();
    }
    return w?-x:x;
}

inline ll readull(){
    ll x=0;
    char ch=gc();
    while(ch>=32){
        if(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48);
        ch=gc();
    }
    if(ch==-1) x=-x;
    return x;
}

void writei(int x){
    if(x<0) pc('-'),x=-x;
    if(x>9) writei(x/10);
    pc((x%10)^48);
}
};// io
using namespace io;

const int months[]={0,31,29,31,30,31,30,31,31,30,31,30,31},
pre[]={0,31,60,91,121,152,182,213,244,274,305,335,366};
inline ll td(ll x,ll y){
    int xm=x/100000000%100,ym=y/100000000%100;
    int xd=pre[xm-1]+x/1000000%100,yd=pre[ym-1]+y/1000000%100;
    int xh=x/10000%100,yh=y/10000%100;
    int xmi=x/100%100,ymi=y/100%100;
    int xs=xh*3600+xmi*60+x%100,ys=yh*3600+ymi*60+y%100;
    return (0ll+xd)*86400+xs-((0ll+yd)*86400+ys);
}

ll a[50005];
int main(){
    int n=readi(),m=readi();
    int cnt=0;
    while((a[++cnt]=readull())>0);
    if(a[cnt]==0)cnt--;
    else a[cnt]=-a[cnt];
    for(int i=0;i<=cnt-m;i++){
//      writel(td(a[i+m],a[i+1]));el;
        if(td(a[i+m],a[i+1])<n){
            #define i i+m
            writei(2012);pc('-');
            pc(a[i]/1000000000%10^48);
            pc(a[i]/100000000%10^48);
            pc('-');
            pc(a[i]/10000000%10^48);
            pc(a[i]/1000000%10^48);
            sp;
            pc(a[i]/100000%10^48);
            pc(a[i]/10000%10^48);
            pc(':');
            pc(a[i]/1000%10^48);
            pc(a[i]/100%10^48);
            pc(':');
            pc(a[i]/10%10^48);
            pc(a[i]%10^48);
            el;
            flush();
            return 0;
            #undef i
        }
    }
    writei(-1);
    flush();return 0;
}