BZOJ 1012: [JSOI2008]最大数maxnumber

来源:互联网 发布:countdown.js 使用 编辑:程序博客网 时间:2024/06/04 20:04

http://www.lydsy.com/JudgeOnline/problem.php?id=1012

这题,好像应该用线段树

但后来我发现 树状数组也可以过

我才知道,树状数组可以求 区间最值!!!
就是一个一个往前扫,遇到可以跳的,就跳一下
(时间复杂度应该是log级别的)

#include<stdio.h>typedef long long ll;ll n=1,m,d;ll num[200005];ll tree[200005];ll max(ll a,ll b){return a>b?a:b;}void fix(ll k,ll x){    for(ll i=k;i<=200005;i+=i&-i)    {        tree[i]=max(tree[i],x);    }}ll read(ll k)//k~n{    ll ans=0;    for(ll i=n;i>=k;i--)    {        if(i-(i&-i)>=k) //**重要**        {            ans=max(tree[i],ans);            i-=(i&-i)-1; //**重要**        }        else        {            ans=max(num[i],ans);        }    }    return ans;}int main(){    scanf("%lld%lld",&m,&d);    ll t=0;    for(ll i=1;i<=m;i++)    {        char c;        ll x;        scanf(" %c%lld",&c,&x);        if(c=='A')        {            num[++n]=(x+t)%d;            fix(n,(x+t)%d);        }        else if(c=='Q')        {            t=read(n-x+1);            printf("%lld\n",t);        }    }    return 0;}
0 0
原创粉丝点击