斐波那契+数颜色

来源:互联网 发布:linux 安装 jdk 编辑:程序博客网 时间:2024/06/05 07:18

QAQ
设小兔子编号为x
FBi<=x<=FBi+1
那么x的父亲即为XFBi
因为X之前有FBi生小兔啊
直接暴力模拟就行了

#include <cstdio>#include <iostream>#define ll long longusing namespace std;ll fb[200];int get(ll x){        for(int j=1;j<=61;j++)        {            if(fb[j]<=x&&x<=fb[j+1])            {                return j;            }        }}int main(){    fb[1]=1ll;    for(int i=2;i<=61;i++)    {        fb[i]=fb[i-1]+fb[i-2];        /*if(fb[i]>1e12)        printf("%d\n",i);*/    }    int m;    scanf("%d",&m);    for(int i=1;i<=m;i++)    {        ll a,b;        int tmpa,tmpb;        scanf("%lld%lld",&a,&b);        tmpa=get(a),tmpb=get(b);        while(a!=b)        {            if(a>b)             {                a-=fb[tmpa];                tmpa=get(a);            }            else            {                b-=fb[tmpb];                tmpb=get(b);            }        }        printf("%lld\n",a);    }}

存每个颜色的位置,查颜色 l,r多少个就行了。

#include <cstdio>#include <iostream>#include <vector>#include <algorithm>using namespace std;struct node{    int col,w;}a[3*110000];vector <int> c[3*110000];int find(int id,int x){    int l=1,r=c[id].size()-1;    int ans=0;    while(l<=r)    {        int mid=(l+r)/2;        if(c[id][mid]>=x) ans=mid,r=mid-1;        else l=mid+1;    }    return ans;}int main(){    int n,q;    scanf("%d%d",&n,&q);    /*for(int i=1;i<=3*1e5;i++)     c[i].push_back(0);*/    for(int i=1;i<=n;i++)    {        int x;        scanf("%d",&x);        c[x].push_back(i);        a[i].col=x,a[i].w=c[x].size()-1;    }    for(int i=1;i<=q;i++)    {        int opt;        scanf("%d",&opt);        if(opt==1)        {            int l,r,cr;            scanf("%d%d%d",&l,&r,&cr);            if(c[cr].size()==0)            {                printf("0\n");                continue;            }             int pos1=lower_bound(c[cr].begin(),c[cr].end(),l)-c[cr].begin();            int pos2=upper_bound(c[cr].begin(),c[cr].end(),r)-c[cr].begin();            printf("%d\n",pos2-pos1);        }        if(opt==2)        {            int x;            scanf("%d",&x);            if(a[x].col==a[x+1].col) continue;            int w1=a[x].w,w2=a[x+1].w;            int c1=a[x].col,c2=a[x+1].col;            a[x].col=c2,a[x+1].col=c1;            a[x].w=w2,a[x+1].w=w1;            c[c1][w1]=x+1;            c[c2][w2]=x;        }    }    return 0;}
原创粉丝点击