标签:单词 tput jpg 选择 http ring 时间复杂度 images 一个
题解:样例脑残系列。
我们将每一天看成点,方案看成线段,考虑用线段树维护,对于每个区间,我们记录在这段区间中最优的线段以及区间中点的最大值。如果在这段区间中新加入了一条线段,我们进行讨论:
如果新线段的两端点都比旧线段优,则直接用新线段即可;如果新线段的两端点都不如旧线段优,则直接用旧线段即可;如果新线段的一侧比旧线段优,则我们递归处理下去即可。最后用新线段在两端点处的取值以及lson和rson的最值来更新区间最值即可。
时间复杂度$O(nlogn)$
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #define lson x<<1 #define rson x<<1|1 using namespace std; const int maxn=100010; const int N=50000; int n; double sa[N<<2],sb[N<<2]; char str[10]; void updata(int l,int r,int x,double a,double b) { int mid=(l+r)>>1; if(sa[x]*l+sb[x]<a*l+b&&sa[x]*r+sb[x]<a*r+b) sa[x]=a,sb[x]=b; else if(sa[x]*l+sb[x]<a*l+b||sa[x]*r+sb[x]<a*r+b) updata(l,mid,lson,a,b),updata(mid+1,r,rson,a,b); } double query(int l,int r,int x,int a) { int mid=(l+r)>>1; double ret=a*sa[x]+sb[x]; if(l==r) return ret; if(a<=mid) ret=max(ret,query(l,mid,lson,a)); else ret=max(ret,query(mid+1,r,rson,a)); return ret; } int main() { scanf("%d",&n); int c; double a,b; while(n--) { scanf("%s",str); if(str[0]==‘Q‘) scanf("%d",&c),printf("%d\n",int(floor(query(1,N,1,c)/100))); else scanf("%lf%lf",&a,&b),updata(1,N,1,b,a-b); } return 0; }
【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树
标签:单词 tput jpg 选择 http ring 时间复杂度 images 一个
原文地址:http://www.cnblogs.com/CQzhangyu/p/7898238.html