• 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
    ",sum1+sum2);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    macOS 修改键盘重复按键延迟
    stdout 与 stderr 区别
    E. 1-Trees and Queries
    Codeforces Round #615 (Div. 3)
    Codeforces Round 613(div 2)
    Codeforces Edu80
    SPOJ
    快读
    《货车运输》题解--最大生成树&倍增
    倍增思想求lca
  • 原文地址:https://www.cnblogs.com/linliu/p/5485147.html
Copyright © 2020-2023  润新知