显然如果卖出的话肯定要在同一天卖出.
那么我们只需维护 $max(y_{i}prod x_{i})$ 即可.
乘法维护不了,取一个对数就好了.
code:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 500003 #define ll long long #define mod 1000000007 #define lson now<<1 #define rson now<<1|1 #define setIO(s) freopen(s".in","r",stdin) using namespace std; double a[N],b[N]; int X[N],Y[N],n; struct node { int id,sum2; double maxv,sum; }s[N<<2]; void pushup(int now) { s[now].sum=s[lson].sum+s[rson].sum; s[now].sum2=(ll)s[lson].sum2*s[rson].sum2%mod; if(s[lson].maxv>s[rson].maxv+s[lson].sum) { s[now].maxv=s[lson].maxv; s[now].id=s[lson].id; } else { s[now].maxv=s[lson].sum+s[rson].maxv; s[now].id=(ll)s[lson].sum2*s[rson].id%mod; } } void build(int l,int r,int now) { if(l==r) { s[now].maxv=a[l]+b[l]; s[now].sum=a[l]; s[now].sum2=X[l]%mod; s[now].id=(ll)X[l]*Y[l]%mod; return; } int mid=(l+r)>>1; build(l,mid,lson),build(mid+1,r,rson),pushup(now); } void update_x(int l,int r,int now,int p,int v) { if(l==r) { X[p]=v; a[p]=log2(v); s[now].maxv=a[l]+b[l]; s[now].sum=a[l]; s[now].sum2=X[l]%mod; s[now].id=(ll)X[l]*Y[l]%mod; return; } int mid=(l+r)>>1; if(p<=mid) update_x(l,mid,lson,p,v); else update_x(mid+1,r,rson,p,v); pushup(now); } void update_y(int l,int r,int now,int p,int v) { if(l==r) { Y[p]=v; b[p]=log2(v); s[now].maxv=a[l]+b[l]; s[now].sum=a[l]; s[now].id=(ll)X[l]*Y[l]%mod; return; } int mid=(l+r)>>1; if(p<=mid) update_y(l,mid,lson,p,v); else update_y(mid+1,r,rson,p,v); pushup(now); } int main() { // setIO("input"); int i,j,m; scanf("%d",&n); for(i=1;i<=n;++i) scanf("%d",&X[i]),a[i]=log2(X[i]); for(i=1;i<=n;++i) scanf("%d",&Y[i]),b[i]=log2(Y[i]); build(1,n,1); scanf("%d",&m); printf("%dn",s[1].id); while(m--) { int w,e,r; scanf("%d%d%d",&w,&e,&r),++e; if(w==1) { update_x(1,n,1,e,r); } else { update_y(1,n,1,e,r); } printf("%dn",s[1].id); } return 0; }
最后
以上就是仁爱板栗最近收集整理的关于BZOJ 4370: [IOI2015]horses马 线段树+贪心+对数的全部内容,更多相关BZOJ内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复