码迷,mamicode.com
首页 > 其他好文 > 详细

luoguP3353 在你窗外闪耀的星星 x

时间:2017-07-09 19:39:49      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:技术分享   for   ==   线段   输入输出   美的   code   实现   http   

P3353 在你窗外闪耀的星星

题目描述

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

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

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

再见了,我的公主!

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

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

输入输出格式

输入格式:

 

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

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
6 3
1 2
2 4
3 8
4 4
5 2
1000 1
输出样例#1:
16

说明

样例说明:

技术分享

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

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

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

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

思路:

  1)线段树

  2)讲真这个题暴力完全可以过2333

坑点:

  在进行输入的时候一定要biling[x]+=bil!!!!!!!!!!!

  一定!!!

  一定啊!!!

代码:

技术分享
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#define lson rt<<1
#define rson rt<<1|1
#define m ((l+r)>>1)
using namespace std;

const int M = 100000;
int n,len,MAXX,MINX=233,ans,now;
int biling[M + 1];

struct A{
    int l,r;
    int num;
}t[M*4 + 1];

void build(int l,int r,int rt)
{
    t[rt].l=l,t[rt].r=r;
    if(l==r)
    {
        t[rt].num=biling[l];
        return;
    }
    build(l,m,lson);
    build(m+1,r,rson);
    t[rt].num=t[lson].num+t[rson].num;
}

void ask(int rt,int nowl,int nowr)
{
    int l=t[rt].l,r=t[rt].r;
    if(nowl<=l && nowr>=r)
    {
        now+=t[rt].num;
        return;
    }
    if(l==0 && r==0)
        return;
    int mv=(l+r)>>1;
    if(nowl<=mv) ask(lson,nowl,nowr);
    if(nowr>mv) ask(rson,nowl,nowr);
}

int main()
{
    scanf("%d%d",&n,&len);
    for(int i=1,x,bil;i<=n;i++)
    {
        scanf("%d%d",&x,&bil);
        biling[x]+=bil;
        MINX=min(MINX,x);
        MAXX=max(MAXX,x);
    }
    if(len==0)
    {
        printf("0");
        return 0;
    }
    build(1,n,1);
    for(int i=MINX;i<=MAXX-len+1;i++)///qi dian
    {
        now=0;
        ask(1,i,i+len-1);
        ans=max(ans,now);
    }
    printf("%d",ans);
    return 0;
}
线段树版
技术分享
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

const int N = 100010;
int n,w,MAXX,ans;
int awindow[N];
int a[N];

int main()
{
    scanf("%d%d",&n,&w);
    if(w==0)
    {
        printf("0");
        return 0;
    }
    for(int i=1,x,biling;i<=n;i++)
    {
        scanf("%d%d",&x,&biling);
        awindow[x]+=biling;
        MAXX=max(x,MAXX);
    }
    for(int i=1;i<=w;i++)
        ans+=awindow[i];
    a[w]=ans;
    for(int i=w+1;i<=MAXX;i++)
    {
        a[i]=a[i-1]+awindow[i]-awindow[i-w];
        ans=max(ans,a[i]);
    }
    printf("%d",ans);
    return 0;
}
baoli

 

luoguP3353 在你窗外闪耀的星星 x

标签:技术分享   for   ==   线段   输入输出   美的   code   实现   http   

原文地址:http://www.cnblogs.com/zxqxwnngztxx/p/7142404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!