B. Factory Repairs--cf627B(线段树)

http://codeforces.com/problemset/problem/627/B

题目大意:  n代表天数 ,k代表每一次维修持续的天数,a代表维修过后每天能生产a件产品,b代表维修之前每天只能生产b件产品  q代表q次查询 

每次查询  都会先输入一个数  

1 ,第d天接到a个订单

2,从第p天开始维修  这几天(往后的k天不工作  在第p天之前每天只能生产b件产品,p+k天之后都维修过了,所以之后的每一天能生产a件产品)

 

刚开始一直没有读懂题目  后来上cf上看了看 呢上面有提示  然后就是线段树

我觉得我的方法比较笨  我把每一个>a || >b 的都用一个变量保存下来,我还保存了不大于a和不大于b的和

最后更新点就行了

我刚开开始写 忽略了如果他加上一个数如果大于a的话  他的和应该减去他本身的值

 

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<ctype.h>
using namespace std;
#define N 200005
#define met(a,b) memset(a,b,sizeof(b))
#define Lson r<<1|1
#define Rson r<<1
int n,k,x,y;

struct node
{
    int L,R,e;
    long long int Lsum,Rsum,Ls,Rs;
    int mid()
    {
        return (L+R)/2;
    }
}a[N*4];

void BuildTree(int r,int L,int R)
{
    a[r].L=L;
    a[r].R=R;
    a[r].e=0;
    a[r].Lsum=0;
    a[r].Rsum=0;
    a[r].Ls=0;
    a[r].Rs=0;
    if(L==R)
        return;
    BuildTree(Lson,L,a[r].mid());
    BuildTree(Rson,a[r].mid()+1,R);
    a[r].Lsum=a[Lson].Lsum+a[Rson].Lsum;
    a[r].Rsum=a[Lson].Rsum+a[Rson].Rsum;
    a[r].Ls=a[Lson].Ls+a[Rson].Ls;
    a[r].Rs=a[Lson].Rs+a[Rson].Rs;
}

void Update(int r,int L,int v)
{
    if(a[r].L==a[r].R && a[r].L==L)
    {
        int kk=a[r].e;
        a[r].e+=v;
        if(a[r].e>=y && kk<y)
        {
            a[r].Lsum++;
            a[r].Ls-=kk;
        }
        if(a[r].e>=x && kk<x)
        {
            a[r].Rs-=kk;
            a[r].Rsum++;
        }
        if(a[r].e<y)
            a[r].Ls=a[r].e;
        if(a[r].e<x)
            a[r].Rs=a[r].e;
        return;
    }
    if(L>a[r].mid())
        Update(Rson,L,v);
    else
        Update(Lson,L,v);
    a[r].Lsum=a[Lson].Lsum+a[Rson].Lsum;
    a[r].Rsum=a[Lson].Rsum+a[Rson].Rsum;
    a[r].Ls=a[Lson].Ls+a[Rson].Ls;
    a[r].Rs=a[Lson].Rs+a[Rson].Rs;
}

long long int Qurry(int r,int L,int R,int b)
{
    if(L>R)
        return 0;
    if(a[r].L==L && a[r].R==R)
    {
        if(b==1)
            return a[r].Lsum*y+a[r].Ls;
        else if(b==2)
            return a[r].Rsum*x+a[r].Rs;
    }

    if(L>a[r].mid())
        return Qurry(Rson,L,R,b);
    else if(R<=a[r].mid())
        return Qurry(Lson,L,R,b);
    else
    {
        long long a1=Qurry(Lson,L,a[r].mid(),b);
        long long a2=Qurry(Rson,a[r].mid()+1,R,b);
        return a1+a2;
    }
}

int main()
{
    int q;
    while(scanf("%d",&n)!=EOF)
    {
        met(a,0);
        int u,v;
        BuildTree(1,1,n);
        scanf("%d %d %d %d",&k,&x,&y,&q);
        while(q--)
        {
            int kk;
            scanf("%d",&kk);
            if(kk==1)
            {
                scanf("%d %d",&u,&v);
                Update(1,u,v);
            }
            else
            {
                scanf("%d",&u);
                long long int sum1=Qurry(1,1,u-1,1);
                long long int sum2=Qurry(1,u+k,n,2);
                printf("%lld\n",sum1+sum2);
            }
        }
    }
    return 0;
}

 

posted @ 2016-05-12 12:04  啦咯  阅读(381)  评论(0编辑  收藏  举报