题目链接: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. DB2多行转一行【XML方式】

    分组然后合并,然后去除XML标签 SELECT replace(replace(replace(xml2clob(xmlagg(xmlelement(name A, [字段]))),'</A&g ...

  2. VC++使用CSocket发送HTTP Request时需要注意发送数据的编码格式

    VS2010以及更高版本中新建的MFC项目字符集默认是Unicode,CString创建的字符串默认是Unicode. 使用CSocket时,若以CString组织需要发送的HTTP Head时,那么 ...

  3. 腾讯企业邮箱POP,SMTP分别是什么

    腾讯企业邮箱在做域名解析的时候不用做pop3和 smtp设置,可以使用下列的协议:   POP3/SMTP协议 接收邮件服务器:pop.exmail.qq.com (端口 110),使用SSL,端口号 ...

  4. Ubuntu 12.04/13.04 安装 Oracle11gR2:该笔记已经陈旧!请参考后续的笔记

    注意点: 在 ubuntu的 /bin 下建立以下几个基本命令的链接: basename awk sh->bash | sh -> ksh 安装以下几个必须的包: binutils bui ...

  5. Android 下使用 JSON 实现 HTTP 请求

    不得不说,JSON 格式的确是非常美妙的,速度快而且简化了很多操作在 Android 下,Android SDK 已经为我们封装好了整个与 JSON 有关的操作,使用非常方便 以下就是一个标准的 JS ...

  6. dedecms的arclist循环中判断第一个li添加css,否则不加

    dedecms的arclist循环中,判断如果是第一个li,则添加固定的css,否则不加   写法如下: {dede:arclist row=4 flag='p'} <li [field:glo ...

  7. How to Setup Cordova for Windows 7

    Setup Cordova Text Editor / IDE You may need to prepare an IDE or Editor for working. Here for examp ...

  8. SQLServer------如何快速插入几万条测试数据

    方法一: 1.建表 if OBJECT_ID('test') is not null drop table test go create table test (id ,),vid ), constr ...

  9. NodeJS-003-自动刷新

    修改index.js之后,发现刷新浏览器,没有任何更改,需要关闭应用重新启动. 为了避免每次修改代码后要自动重启.通过安装supervisor来监控代码修改. 安装:npm install -g su ...

  10. Linux 远程同步:rsync

    rsync 简介: (1) rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件(2) rsync 使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步 ...