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

卿学姐与公主

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

某日,百无聊赖的卿学姐打开了某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\n",query(u,v,1,x,1));
            }
        }
    }
    return 0;
}

 

卿学姐与公主

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

某日,百无聊赖的卿学姐打开了某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哦

转载于:https://www.cnblogs.com/jhz033/p/5673230.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值