-线段树- [洛谷 P3353]在你窗外闪耀的星星

题目描述

飞逝的的时光不会模糊我对你的记忆。难以相信从我第一次见到你以来已经过去了3年。我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀着你玫瑰色的脸颊。我明白,我已经沉醉于你了。之后,经过几个月的观察和窥探,你的优雅与智慧,你对待生活的态度和你对未来的愿望深切地在我心中留下了印象。你是迷人的阳光女孩,我总是梦想着与你分享余生。唉,实际上你远远超过了我最疯狂的梦想。我不知道如何桥起我与你之间的鸿沟。所以我没有任何计划,仅仅只是等待,等待一个适当的机会到来。直到现在,毕业的到来,我意识到我是个傻瓜,我应该创造机会并且抓住它而不只是等待。

这些日子里,我和我的朋友、室友、同学一个接一个地分开。我仍无法相信,在挥手之后,这些熟悉的面孔很快就会从我们的生活中消失,仅仅留下回忆。我明天就将离开学校。你已经计划远走高飞,追求你的未来,实现你的梦想。如果没有命运,也许我们不会再次相遇。所以今晚,我正在你的宿舍楼下徘徊,希望能偶然遇见你。但矛盾的是,你的美貌一定会使我心跳加速,我笨拙的舌头也许无法吐出一个字。我不记得我曾多少次经过你的宿舍楼,每次都希望看到你出现在阳台上或是窗台上。我不记得这个想法曾多少次在我的脑海中涌出:打电话叫她一起吃晚饭或是聊聊天。但每次,考虑到你的优秀和我的平凡,胆怯的优势超越勇气驱使我静静地离开。

毕业,意味着中学生活的终结。这些光荣与浪漫的时代结束。你可爱的微笑是我原来努力学习的动力,这单相思的爱情会被密封,作为一个我心灵深处的记忆。毕业,也意味着新生活的开始,一个到达光明未来的足迹。我真希望你在国外天天开心,一切顺利。同时,我将努力从幼稚中走出来,变得更加成熟。我的理想将是在现实中追求我的爱与幸福,我永远不会放弃。

再见了,我的公主!

如果有一天,在某个天涯海角,我们有机会相聚,即使是白发苍苍的男人和女人,在那个时候,我希望我们可以成为好朋友来自豪地分享这个记忆,重温年轻快乐的激情。如果这个机会永远没有到来,我希望我是天空中的星星,在你的窗外闪烁。远远地保佑着你,就像一个朋友,每天晚上陪伴在你左右,一同分享甜美的梦亦或是一同经历可怕的梦。

现在问题来了:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置Xi和自身的亮度Bi。而窗户所能看到的范围是一个给出的参数W,我们看到的星星也包括窗户边缘的星星。现在,要你求出调整窗户位置后能看到星星的亮度之和最大值。

输入格式

一行N,W,分别代表星星的数量和窗户的宽度

余下N行,输入Xi和Bi,代表星星的坐标和亮度

输出格式

一个数字,代表能看到星星的最大亮度和

输入输出样例

输入样例

6 3
1 2
2 4
3 8
4 4
5 2
1000 1

输出样例

16

说明

对于10%的数据,W=0(没有边缘)

对于40%的数据,W<=1000

对于100%的数据,N<=100000,W<=100000,Xi<=100000,1<=Bi<=100

除W=0的情况外,W均为>=3的奇数

Solution

看完这个题面我都快要被甜死了,不得不说原题作者的文笔非常好。

他也许能得全国作文比赛一等奖

好了,下面进入正题

这道题直接用线段树可做,把星星的坐标和位置表示出来就可以了。

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
#include<iostream>
#include<cstdio>
#define MAX 1000005
#define ll long long
#define ls(x) ((x)<<1)
#define rs(x) (((x)<<1)+1)
using namespace std;
unsigned ll a[MAX],ans[MAX*4],t[MAX*4];
ll max(ll a,ll b){
return a>b?a:b;
}
inline void pd(ll p) {
ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r) {
t[p]=0;
if(l==r) {
ans[p]=a[l];
return;
}
ll mid=(l+r)/2;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pd(p);
}
inline void f(ll p,ll l,ll r,ll k) {
t[p]=t[p]+k;
ans[p]=ans[p]+k*(r-l+1);
}
inline void p_d(ll p,ll l,ll r) {
ll mid=(l+r)>>1;
f(ls(p),l,mid,t[p]);
f(rs(p),mid+1,r,t[p]);
t[p]=0;
}
ll sum(ll x,ll y,ll l,ll r,ll p) {
ll s=0;
if(x<=l&&r<=y){
return ans[p];
}
ll mid=(l+r)>>1;
p_d(p,l,r);
if(x<=mid)s+=sum(x,y,l,mid,ls(p));
if(y>mid) s+=sum(x,y,mid+1,r,rs(p));
return s;
}
int main() {
ll a1,b,c,d,f,m,n;
int e;
cin>>n>>m;
ll len=0;
if(m==0){
cout<<0<<endl;
return 0;
}
for(ll i=1;i<=n;i++){
scanf("%d%lld",&e,&f);
a[e]+=f;
len=max(len,e);
}
build(1,1,len);
ll maxa=0;
for(ll i=1;i<=len-m+1;i++){
ll q=sum(i,i+m-1,1,len,1);
maxa=max(q,maxa);
}
printf("%lld\n",maxa);
return 0;
}
文章作者: RiverFun
文章链接: https://stevebraveman.github.io/blog/2018/08/24/24/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 RiverFun

评论