SDUT 3915 从零开始的异世界生活【线段树,区间求和】

题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3915.html


线段树水过…(蕾姆好可爱啊 我做这道题就是为了蕾姆

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll ans,add[4*N],sum[4*N];
int n,m,x,y,hurt[N];
struct node
{
    int ret,num,deth;
}p[N];
bool cmp(node a,node b)
{return a.deth<=b.deth;}
void build(int i,int l,int r)
{
    if(l==r)
    {
        sum[i]=hurt[l];
        return;
    }
    int mid=l+r>>1;
    build(2*i,l,mid);
    build(2*i+1,mid+1,r);
    sum[i]=sum[2*i]+sum[2*i+1];
}
void Add(int i,int l,int r,int k)
{
    add[i]=add[i]+k;
    sum[i]=sum[i]+(r-l+1)*k;
}
void pushdown(int i,int l,int r,int mid)
{
    if(add[i]==0)return;
    Add(2*i,l,mid,add[i]);
    Add(2*i+1,mid+1,r,add[i]);
    add[i]=0;
}
ll query(int i,int l,int r,int x,int y)
{
    if(l>y||r<x)return 0;
    if(l>=x&&r<=y)return sum[i];
    int mid=l+r>>1;
    pushdown(i,l,r,mid);
    return query(2*i,l,mid,x,y)+query(2*i+1,mid+1,r,x,y);
}
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m)
    {
        for(int i=1;i<=n;i++)
            cin>>hurt[i];
        build(1,1,n);
        for(int i=1;i<=m;i++)
            cin>>p[i].deth>>p[i].ret>>p[i].num;
        sort(p+1,p+m+1,cmp);x=1;ans=0;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=p[i].num;j++)
            {
                y=p[i].deth;
                ans=ans+query(1,1,n,x,y);
                x=p[i].ret;
            }
        }
        ans=ans+query(1,1,n,x,n);
        printf("%lld\n",ans);
    }
    return 0;
}
全部评论

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务