您的位置:首页 > 理论基础 > 数据结构算法

数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

2016-06-13 11:31 471 查看

1568: [JSOI2008]Blue Mary开公司

Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 602 Solved: 214
[Submit][Status][Discuss]

Description



Input


一行 :一个整数N ,表示方案和询问的总数。 接下来N行,每行开头一个单词“Query”或“Project”。
若单词为Query,则后接一个整数T,表示Blue Mary询问第T天的最大收益。
若单词为Project,则后接两个实数S,P,表示该种设计方案第一天的收益S,以及以后每天比上一天多出的收益P。

Output

对于每一个Query,输出一个整数,表示询问的答案,并精确到整百元(以百元为单位,例如:该天最大收益为210或290时,均应该输出2)。

Sample Input

10

Project 5.10200 0.65000

Project 2.76200 1.43000

Query 4

Query 2

Project 3.80200 1.17000

Query 2

Query 3

Query 1

Project 4.58200 0.91000

Project 5.36200 0.39000

Sample Output

0

0

0

0

0

HINT

约定: 1 <= N <= 100000 1 <= T <=50000 0 < P < 100,| S | <= 10^6 提示:本题读写数据量可能相当巨大,请选手注意选择高效的文件读写方式。

  

  一种特殊的线段树……

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=50010;
struct Node{
double a,b;
Node(double a_=0.0,double b_=0.0){
a=a_;b=b_;
}
double Val(int p){
return a*p+b;
}
int CmP(int l,int r,Node x){
if(Val(l)>=x.Val(l)&&Val(r)>=x.Val(r))return 1;
if(Val(l)<=x.Val(l)&&Val(r)<=x.Val(r))return -1;
return 0;
}
}T[maxn<<2];

double Query(int x,int l,int r,int g){
if(l==r)return T[x].Val(l);
int mid=(l+r)>>1;
double ret=T[x].Val(g);
if(mid>=g)return max(ret,Query(x<<1,l,mid,g));
else return max(ret,Query(x<<1|1,mid+1,r,g));
}

void Modify(int x,int l,int r,Node p){
int tmp=p.CmP(l,r,T[x]);
if(tmp==1)T[x]=p;
if(tmp!=0)return;
int mid=(l+r)>>1;

tmp=p.CmP(l,mid,T[x]);
if(tmp!=1&&l!=r)Modify(x<<1,l,mid,T[x]);
if(tmp!=-1&&l!=r)Modify(x<<1,l,mid,p);
tmp=p.CmP(mid+1,r,T[x]);
if(tmp!=1&&l!=r)Modify(x<<1|1,mid+1,r,T[x]);
if(tmp!=-1&&l!=r)Modify(x<<1|1,mid+1,r,p);
}

char op[10];
int main(){
int Q,p,n=50000;
double s,t;
scanf("%d",&Q);
while(Q--){
scanf("%s",op);
if(!strcmp(op,"Project")){
scanf("%lf%lf",&s,&t);
Modify(1,1,n,Node(t,s-t));
}
else{
scanf("%d",&p);
printf("%d\n",(int)(Query(1,1,n,p)/100));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: