HDU 3450 线段树+二分

来源:互联网 发布:什么命令linux死机 编辑:程序博客网 时间:2024/06/05 05:05

点击打开链接

题意:给一个数字序列,问你长度大于2的且相邻两个数的差的绝对值不大于d的情况对9901取余

思路:看了根本不会,都没想到是线段树的题目,弱哭~~~,看了大牛们的题解,算是知道怎么回事了,对于当前的数A,那么以它为最后一个元素可以组成的情况是A-d到A+d的和,也可以这样想,A-d的已经组成了m种情况,那么在不影响小于d的情况下,可以直接将A放到A-d组成的左右序列中,那么直接加就可以了,而后更新A可以组成的情况,数据太大还需要离散化,然后二分找一下A-d和A+d的位置,数据可能没有这两个位置,那么找到第一个大于等于A-d和第一个小于等于A+d的位置更新就行,且不会影响结果,自己写个数据看看就会懂了    PS:多校的题目好难,想着一天刷一套自己部分的题目,而且太难的直接放弃(毕竟太弱),还是有点难以完成啊

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const ll INF=0x3f3f3f3f3f3f3f3fll;const int maxn=100010;const int mod=9901;int num[maxn<<2],A[maxn],B[maxn];int n,m;int lower_1(int val,int k){    int le=0,ri=k;    while(ri-le>1){        int mid=(le+ri)>>1;        if(B[mid]<=val) le=mid;        else ri=mid;    }    return le+1;}void update(int pos,int add,int le,int ri,int node){    if(le==ri){        num[node]+=add;        num[node]%=mod;        return ;    }    int t=(le+ri)>>1;    if(pos<=t) update(pos,add,le,t,node<<1);    else update(pos,add,t+1,ri,node<<1|1);    num[node]=(num[node<<1]+num[node<<1|1])%mod;}int query(int l,int r,int le,int ri,int node){    if(l<=le&&ri<=r) return num[node];    int ans=0,t=(le+ri)>>1;    if(l<=t) ans+=query(l,r,le,t,node<<1);    if(r>t) ans+=query(l,r,t+1,ri,node<<1|1);    return ans%mod;}int main(){    while(scanf("%d%d",&n,&m)!=-1){        int k=1,ans=0;        memset(num,0,sizeof(num));        for(int i=0;i<n;i++){            scanf("%d",&A[i]);            B[i]=A[i];        }        sort(B,B+n);        for(int i=1;i<n;i++){            if(B[i]!=B[i-1]) B[k++]=B[i];        }        for(int i=0;i<n;i++){            int le=lower_bound(B,B+k,A[i]-m)-B+1;            int ri=lower_1(A[i]+m,k);            int pos=lower_bound(B,B+k,A[i])-B+1;            int ans1=query(le,ri,1,k,1);            ans=(ans+ans1)%mod;            update(pos,ans1+1,1,k,1);        }        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾照c1年审过期怎么办 驾驶证忘了年检怎么办 驾照快要到期了怎么办 驾照过期90天怎么办 异地驾迁回本地怎么办 驾照外地转本地怎么办 车转回老家保险怎么办 考驾照一直不过怎么办 驾照2年没考出来怎么办 驾考体检色盲怎么办 杭州居住告知单怎么办 郑州有房怎么办暂住证 郑州买车怎么办暂住证 在青岛办暂住证怎么办 异地买车暂住证怎么办 广州暂住证过期了怎么办 杭州暂住证过期了怎么办 居住卡到期了怎么办 居住卡过期了怎么办 在合肥办暂住证怎么办 在西安办暂住证怎么办 杭州没办暂住证怎么办 暂住证超过2月怎么办 机动车大本丢了怎么办 北京老年卡2018怎么办 暂住卡过期了怎么办 我暂住证过期了怎么办 我没租房怎么办暂住证 孩子异地入学籍怎么办 孩子入不了学籍怎么办 常州没有暂住证怎么办牌照 东莞居住证过期了怎么办 杭州告知单过期怎么办 杭州暂住证到期了怎么办 在杭州租房怎么办暂住证 杭州暂住证丢了怎么办 在宾馆住怎么办暂住证 上海学车暂住证怎么办 环保车贴丢了怎么办 交通事故交警不处理怎么办 哈尔滨冰雪大世界夏天怎么办