• cdoj 1324 卿学姐与公主 线段树裸题


    卿学姐与公主

    Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
     

    某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏

    在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中。

    英勇的卿学姐拔出利刃冲向了拯救公主的道路。

    走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关。

    在这个城关面前的是魔王的精锐部队,这些士兵成一字排开。

    卿学姐的武器每次只能攻击一个士兵,并造成一定伤害,卿学姐想知道某时刻从LLRR这个区间内,从开始到现在累计受伤最严重的士兵受到的伤害。

    最开始每个士兵的受到的伤害都是0

    Input

    第一行两个整数N,QN,Q表示总共有NN个士兵编号从11NN,和QQ个操作。

    接下来QQ行,每行三个整数,首先输入一个tt,如果tt11,那么输入p,xp,x,表示卿学姐攻击了pp这个位置的士兵,并造成了xx的伤害。如果tt22,那么输入L,RL,R,表示卿学姐想知道现在[L,R][L,R]闭区间内,受伤最严重的士兵受到的伤害。

    1N1000001≤N≤100000

    1Q1000001≤Q≤100000

    1pN1≤p≤N

    1x1000001≤x≤100000

    1LRN1≤L≤R≤N

    Output

    对于每个询问,回答相应的值

    Sample input and output

    Sample InputSample Output
    5 4
    2 1 2
    1 2 4
    1 3 5
    2 3 3
    
    0
    5
    

    Hint

    注意可能会爆int哦

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define mod 1000000007
    #define esp 0.00000000001
    const int N=2e5+10,M=1e6+10,inf=1e9;
    ll maxx[N<<2];
    void buildtree(int l,int r,int pos)
    {
        if(l==r)
        {
            maxx[pos]=0;
            return;
        }
        int mid=(l+r)>>1;
        buildtree(l,mid,pos<<1);
        buildtree(mid+1,r,pos<<1|1);
        maxx[pos]=max(maxx[pos<<1],maxx[pos<<1|1]);
    }
    void update(int p,ll c,int l,int r,int pos)
    {
        if(l==p&&r==p)
        {
            maxx[pos]+=c;
            return;
        }
        int mid=(l+r)>>1;
        if(p>mid)
        update(p,c,mid+1,r,pos<<1|1);
        else
        update(p,c,l,mid,pos<<1);
        maxx[pos]=max(maxx[pos<<1],maxx[pos<<1|1]);
    }
    ll query(int L,int R,int l,int r,int pos)
    {
        if(L<=l&&R>=r)
        return maxx[pos];
        int mid=(l+r)>>1;
        ll ans=0;
        if(L<=mid)
        ans=max(ans,query(L,R,l,mid,pos<<1));
        if(R>mid)
        ans=max(ans,query(L,R,mid+1,r,pos<<1|1));
        return ans;
    }
    int main()
    {
        int x,y,i,t;
        while(~scanf("%d%d",&x,&t))
        {
            buildtree(1,x,1);
            for(i=0;i<t;i++)
            {
                int flag;
                scanf("%d",&flag);
                if(flag==1)
                {
                    int p;
                    ll c;
                    scanf("%d%lld",&p,&c);
                    update(p,c,1,x,1);
                }
                else
                {
                    int u,v;
                    scanf("%d%d",&u,&v);
                    printf("%lld
    ",query(u,v,1,x,1));
                }
            }
        }
        return 0;
    }

    卿学姐与公主

    Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
     

    某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏

    在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中。

    英勇的卿学姐拔出利刃冲向了拯救公主的道路。

    走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关。

    在这个城关面前的是魔王的精锐部队,这些士兵成一字排开。

    卿学姐的武器每次只能攻击一个士兵,并造成一定伤害,卿学姐想知道某时刻从LLRR这个区间内,从开始到现在累计受伤最严重的士兵受到的伤害。

    最开始每个士兵的受到的伤害都是0

    Input

    第一行两个整数N,QN,Q表示总共有NN个士兵编号从11NN,和QQ个操作。

    接下来QQ行,每行三个整数,首先输入一个tt,如果tt11,那么输入p,xp,x,表示卿学姐攻击了pp这个位置的士兵,并造成了xx的伤害。如果tt22,那么输入L,RL,R,表示卿学姐想知道现在[L,R][L,R]闭区间内,受伤最严重的士兵受到的伤害。

    1N1000001≤N≤100000

    1Q1000001≤Q≤100000

    1pN1≤p≤N

    1x1000001≤x≤100000

    1LRN1≤L≤R≤N

    Output

    对于每个询问,回答相应的值

    Sample input and output

    Sample InputSample Output
    5 4
    2 1 2
    1 2 4
    1 3 5
    2 3 3
    
    0
    5
    

    Hint

    注意可能会爆int哦

  • 相关阅读:
    《Java并发编程的艺术》 第9章 Java中的线程池
    《Java并发编程的艺术》第6/7/8章 Java并发容器与框架/13个原子操作/并发工具类
    java锁总结
    《Java并发编程的艺术》第5章 Java中的锁 ——学习笔记
    《Java并发编程的艺术》第4章 Java并发编程基础 ——学习笔记
    Java并发编程的艺术(一、二章) ——学习笔记
    redis缓存使用SpringDataRedis
    商城06——solr索引库搭建&solr搜索功能实现&图片显示问题解决
    商城05——首页轮播图显示实现&Redis环境搭建&Redis实现缓存
    商城04——门户网站介绍&商城首页搭建&内容系统创建&CMS实现
  • 原文地址:https://www.cnblogs.com/jhz033/p/5673230.html
Copyright © 2020-2023  润新知