其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客

Description

现在请求你维护一个数列,要求提供以下两种操作:

1、 查询操作。

语法:Q L

功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

限制:L不超过当前数列的长度。(L>=0)

2、 插入操作。

语法:A n

功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。

限制:n是整数(可能为负数)并且在长整范围内。

注意:初始时数列是空的,没有一个数。

Input&Output

Input

第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0<D<2,000,000,000)

接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。

Output

对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

Sample

Input

5 100
A 96
Q 1
A 97
Q 1
Q 2

Output

96
93
96

Solution

  • 本来一开始打的线段树,但洛谷的加强数据T了最后一个点,所以改用了树状数组。因为只在队列末尾插入数据,所以其实线段树有点大材小用了。树状数组可以维护区间最大值,查询时通过不断更新ret即可。
  • 90分线段树(也可能是本蒟蒻太水了):

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define maxm 200001
    using namespace std;
    typedef long long ll;
    struct node{
    ll mx;
    int l,r,lc,rc;
    node(){
        lc=rc=-1;
    }
    }tree[maxm<<1];
    ll m,d,L,n,sum,t;
    char c;
    inline ll rd()
    {
    ll x=0;bool f=0;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return f?-x:x;
    }
    int cnt;
    int rt=cnt++;
    void pushup(int cur)
    {
    int lc=tree[cur].lc,rc=tree[cur].rc;
    tree[cur].mx=max(tree[lc].mx,tree[rc].mx);
    tree[cur].l=tree[lc].l;
    tree[cur].r=tree[rc].r;
    }
    void build(int l,int r,int cur)
    {
    if(l==r){
        tree[cur].mx=0;
        tree[cur].l=tree[cur].r=l;
        return;
    }
    int mid=(l+r)>>1;
    tree[cur].lc=cnt++;
    tree[cur].rc=cnt++;
    build(l,mid,tree[cur].lc);
    build(mid+1,r,tree[cur].rc);
    pushup(cur);
    }
    void upd(int pos,ll c,int cur)
    {
    if(tree[cur].l==tree[cur].r)
    {
        tree[cur].mx=c;
        return;
    }
    int mid=(tree[cur].l+tree[cur].r)>>1;
    if(pos<=mid)upd(pos,c,tree[cur].lc);
    if(pos>mid)upd(pos,c,tree[cur].rc);
    pushup(cur);
    }
    ll query(int l,int r,int cur)
    {
    if(tree[cur].l>=l&&tree[cur].r<=r){
        return tree[cur].mx;
    }
    int mid=(tree[cur].l+tree[cur].r)>>1;
    ll mx=0;
    if(l<=mid)mx=max(mx,query(l,r,tree[cur].lc));
    if(r>mid)mx=max(mx,query(l,r,tree[cur].rc));
    return mx;
    }
    int main()
    {
    m=rd();
    d=rd();
    build(1,200000,rt);
    for(int i=1;i<=m;++i)
    {
        cin>>c;
        if(c=='Q'){
            L=rd();
            t=query(sum-L+1,sum,rt);
            printf("%d\n",t);
        }
        else if(c=='A'){
            n=rd();
            ll tmp=(n%d+t%d)%d;
            upd(sum+1,tmp,rt);
            sum++;
        }
    }
    return 0;
    }
  • 树状数组:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define maxn 200005
    using namespace std;
    typedef long long ll;
    ll mx(ll a,ll b)
    {
    return (a>b)?a:b;
    }
    inline ll rd()
    {
    ll x=0;char c=getchar();
    bool f=false;
    while(c<'0'||c>'9'){
        if(c=='-')f=true;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return f?-x:x;
    }
    ll b[maxn],d;
    int sum;
    int lowbit(int x)
    {
    return x&-x;
    }
    int add(ll v)
    {
    for(int x=sum;x;x-=lowbit(x))
        b[x]=mx(b[x],v);
    }
    int query(int pos)
    {
    ll ans=0;
    for(int x=sum-pos+1;x<=sum;x+=lowbit(x))
        ans=mx(ans,b[x]);
    return ans;
    }
    int main()
    {
    int m,p;
    char q;
    ll t=0;
    scanf("%d%lld",&m,&d);
    for(int i=1;i<=m;++i)
    {
        cin>>q;
        if(q=='A'){
            sum++;
            ll n;
            scanf("%lld",&n);
            add((n+t)%d);
        }
        else{
            scanf("%d",&p);
            t=query(p);
            printf("%lld\n",t);
        }
    }
    return 0;
    }

    写了快读居然没用上

[洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

    题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...

  7. 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)

    维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ...

  8. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  9. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

随机推荐

  1. 问题排查:The requested URL /test/index.jsp was not found on this server

    问题描述 添加一个新模块,部署在服务器上.服务器上还部署有其他模块且访问正常,新模块和其他模块共用同一个域名.服务部署之后,请求如下: http://my.domain.com/test/index. ...

  2. 剑指Offer-不用加减乘除做加法

    package Other; /** * 不用加减乘除做加法 * 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. * 思路:位运算 * 1.两个数异或:相当于每一位相加 ...

  3. 常用的Maven依赖

    一.数据库类型 1.mysql驱动 <!-- mysql驱动支持 --> <dependency> <groupId>mysql</groupId> & ...

  4. Mycat 分片规则详解--ER关系表分片

    ER模型是实体关系模型,基本元素是实体.关系和属性,Mycat 针对ER关系表的切分规则中,使得有相互依赖的表能够按照某一个规则切分到相同的节点上,避免垮库 Join 关系查询,下面的示例为订单(or ...

  5. 前端的UI设计与交互之数据录入篇

    数据录入是获取对象信息的重要交互方式,用户会频繁的增加.修改或删除信息.多种多样的文本录入和选择录入方式帮助用户更加清晰和高效的完成这项体验.设计者应当注意这几点:为初级用户/偶尔访问的用户提供简单易 ...

  6. 前端的UI设计与交互之字体篇

    跨平台的字体设定,力求在各个操作系统下都有最佳展示效果.字体是界面设计中最重要的基本构成之一,用户通过文本来消化内容和完成工作,优雅的字体将大大提升用户的阅读体验及工作效率.在满足不同终端始终保持良好 ...

  7. python装饰器使用

    看了不少python关于装饰器文章,觉得还挺实用,发贴来mark一下(以前做笔记总会长时间不看就忘记,放这里应该不会忘了吧 - -) 先来看一个简单的知识点: def a(): print(" ...

  8. 网络通信 --> CRC校验

    CRC校验 一.什么是CRC校验     循环校验码(Jyclic Redundancy Check,简称CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意 ...

  9. java开源安全框架-------Apache Shiro--第一天

    1.1.简介 Apache Shiro 是Java的一个安全框架.目前使用Apache Shiro 的人越来越多,因为它相当简单,对比Spring Security,可能没有没有Spring Secu ...

  10. python多进程并发redis

    Redis支持两种持久化方式RDB和AOF,RDB持久化能够快速的储存和回复数据,但在服务器停机时会丢失大量数据,AOF持久化能够高效的提高数据的安全性,但在储存和恢复数据方面要耗费大量的时间,最好的 ...