题目链接:http://codeforces.com/problemset/problem/627/B

题意:有一个工厂生产零件,但是机器是不正常的,需要维修,维修时间是 k 天,在维修期间不能生产,如果是正常情况下每天可生产A个零件,不正常情况下也可以生产,但是只能生产B(B<A)件,

现有2个操作,1和2

1 x y 表示第x天分配的工作量是y;

2 x 表示假如在第x天进行维修机器,那么这n天共能生产多少个零件;

现在有q个这样的操作,问当2操作时当前的结果是多少;

由于数据范围比较大,所以不能暴力,用线段树

sum表示当前区间的所有工作量,sum1表示机器正常情况下所能生产的总工作量,sum2是不正常情况下的;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
#define PI 4*atan(1.0)
#define N 210500
#define met(a, b) memset(a, b, sizeof(a)) #define Lson r<<1
#define Rson r<<1|1 struct node
{
int L, R, sum, sum1, sum2;///sum1是好的情况下,sum2是坏的情况下;
int Mid(){ return (L+R)/; }
}a[N*]; int A, B; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R;
a[r].sum = a[r].sum1 = a[r].sum2 = ; if(L == R)return ; Build(Lson, L, a[r].Mid());
Build(Rson, a[r].Mid()+, R);
} void Update(int r, int pos, int num)
{
if(a[r].L == a[r].R && a[r].L == pos)
{
a[r].sum += num;
if(a[r].sum >= A)
{
a[r].sum1 = A;
a[r].sum2 = B;
}
else if(a[r].sum < A && a[r].sum >= B)
{
a[r].sum1 = a[r].sum;
a[r].sum2 = B;
}
else
a[r].sum1 = a[r].sum2 = a[r].sum;
return;
}
if(pos<=a[r].Mid())
Update(Lson, pos, num);
else
Update(Rson, pos, num); a[r].sum = a[Lson].sum + a[Rson].sum;
a[r].sum1 = a[Lson].sum1 + a[Rson].sum1;
a[r].sum2 = a[Lson].sum2 + a[Rson].sum2;
} int Query(int r, int L, int R, int op)
{
if(L > R) return ; if(a[r].L == L && a[r].R == R)
{
if(op == )
return a[r].sum1;
return a[r].sum2;
}
if(R<=a[r].Mid())
return Query(Lson, L, R, op);
else if(L>a[r].Mid())
return Query(Rson, L, R, op);
else
{
int ans1 = Query(Lson, L, a[r].Mid(), op);
int ans2 = Query(Rson, a[r].Mid()+, R, op);
return ans1+ans2;
}
} int main()
{
int n, k, q, op, x, y;
while(scanf("%d %d %d %d %d", &n, &k, &A, &B, &q)!=EOF)
{
Build(, , n);
while(q--)
{
scanf("%d", &op);
if(op==)
{
scanf("%d %d", &x, &y);
Update(, x, y);
}
else
{
scanf("%d", &x); int ans1 = Query(, , x-, );///0没修好之前的;
int ans2 = Query(, x+k, n, );///1修好之后的; printf("%d\n", ans1 + ans2);
}
}
}
return ;
}

B. Factory Repairs---cf627B(线段树)的更多相关文章

  1. codeforces 627B B. Factory Repairs(线段树)

    B. Factory Repairs time limit per test 4 seconds memory limit per test 256 megabytes input standard ...

  2. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) D. Factory Repairs 树状数组

    D. Factory Repairs 题目连接: http://www.codeforces.com/contest/635/problem/D Description A factory produ ...

  3. Codeforces 777E Hanoi Factory(线段树维护DP)

    题目链接 Hanoi Factory 很容易想到这是一个DAG模型,那么状态转移方程就出来了. 但是排序的时候有个小细节:b相同时看a的值. 因为按照惯例,堆塔的时候肯定是内半径大的在下面. 因为N有 ...

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

    http://codeforces.com/problemset/problem/627/B 题目大意:  n代表天数 ,k代表每一次维修持续的天数,a代表维修过后每天能生产a件产品,b代表维修之前每 ...

  5. Codeforces 777E(离散化+dp+树状数组或线段树维护最大值)

    E. Hanoi Factory time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  7. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  8. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  9. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

随机推荐

  1. rdesktop连接远程windows

    $ info rdesktop   //看一下帮助信息吧$rdesktop 192.168.1.1 //打开了一个8位色彩的,$rdesktop -a 16 192.168.1.1 //这个是16位色 ...

  2. Linux下密码抓取神器mimipenguin

    前有Mimikatz,今有mimipenguin,近日国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,可以说弥补了Linux下密码抓取的空缺. ...

  3. Git 基础 - 查看提交历史

    查看提交历史 在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看. 接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源 ...

  4. oracle解决多表关联分组查询问题

    做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid ...

  5. delphi7中添加QuickRep

    具体的方法是: delphi主菜单的Project|Options命令, 在Package选项卡的Desing packages列表中如果可以看到QuickReport Components选项, 那 ...

  6. MongoDB(一)-- 简介、安装、CRUD

    一.Mongodb简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供可 ...

  7. 钟意Action

    package com.j1.mai.action; import com.github.pagehelper.PageInfo; import com.j1.app.mysql.model.Appr ...

  8. PyQt4网格布局

    最通用的布局类别是网格布局(QGridLayout).该布局方式将窗口空间划分为许多行和列.要创建该布局方式,我们需要使用QGridLayout类. #!/usr/bin/python # -*- c ...

  9. Django学习笔记 创建应用

    django中使用应用来分割功能.比如:做一个游戏网站,包含4块不同的功能:游戏新闻.游戏论坛.Blog系统.在线商城.使得结构清晰了,每一个应用实现不同的功能:便于复用:游戏新闻.游戏论坛.Blog ...

  10. Runtime应用(三)实现NSCoding的自动归档和自动解档

    当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法.例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NS ...