这次考试就不骂自己了,毕竟骂了也没用。T1是水题。。用map手卡30分,我tm。。。。然后以为这就结束了,然后去改T2,T2WA40,我写的主席树但是修改是自己yy的,以为就是错了,然后把离散化去了,WA80?????!!!然后加上WA40。。。。然后我好好研究了一下,突然想到它可能询问从没出现过的颜色,然后判了一句,A了。。。。因为没出现过就是0,主席树查不出来。。。T3考场上吃屎一会再说。

  T1:这是一道规律题,找的话其实打个父亲表,看一下就能知道,一个数的父亲就是这个数之前减去离他最近的斐波数,我们又可以知道这个斐波数增长飞快,见过通项的都知道,这玩意是指数级的,所以就可以打个表知道大概60多个就到13位了,找父亲log60,抬lca是60,一次操作就是常数,m次绝对可以接受,结果忘了之前搞得一个map没删,就死了30分。

  

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
long long f[10000];    
long long rd()
{
    long long s=0,w=1;
    char cc=getchar();
    while(cc<'0'||cc>'9') {if(cc=='-') w=-1;cc=getchar();}
    while(cc>='0'&&cc<='9') s=(s<<3)+(s<<1)+cc-'0',cc=getchar();
    return s*w;
}
long long fa(long long x)
{
    long long id=lower_bound(f+1,f+64,x)-f-1;
    return x-f[id];
}
long long getdep(long long tmp)
{
    long long ans=0,x=tmp;
    while(x!=1)
    {
        ++ans;
        x=fa(x);
    }
    return ans;
}
long long lca(long long a,long long b)
{
    int depa=getdep(a),depb=getdep(b);
    if(depa<depb) swap(a,b),swap(depa,depb);
    while(depa>depb) a=fa(a),depa--;
    if(a==b) return a;
    while(fa(a)!=fa(b)) a=fa(a),b=fa(b);
    return fa(a);
}
int main()
{
    f[0]=1;f[1]=1;
    for(int i=2;i<=63;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
    int m=rd();
    for(int i=1;i<=m;i++)
    {
        long long a=rd(),b=rd();
        if(a==1||b==1)
        {
            puts("1");
            continue;
        }
        printf("%lld\n",lca(a,b));
    }
    return 0;
}
/*
g++ 1.cpp -o 1
./1
5
1 1
2 3
5 7
7 13
4 12
*/
View Code

相关文章: