问题:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置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的奇数

  

 在此主要讲线段树做法,若要没接触过的小伙伴建议去了解学习一下:http://www.cnblogs.com/rmy020718/p/8832889.html

思路:
  明显的线段树板子呗,一段区间最亮,那不就是求一段区间和最大嘛。
#include<cstdio>
#include<iostream>
using namespace std;
int a[];
long long n,m,ans,x,y,ch,MAX;
struct ahah{
long long l,r,sum;
}tree[<<];
void build(int k,int l,int r) //建树。
{
tree[k].l=l;tree[k].r=r;
if(tree[k].l==tree[k].r)
{
tree[k].sum=;
return ;
}
long long mid=(tree[k].l+tree[k].r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
// tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum; 开始不需要修改区间和。
}
void update(int k) //此处为单点修改
{
if(tree[k].l==tree[k].r)
{
tree[k].sum+=y;
return ;
}
long long mid=(tree[k].l+tree[k].r)>>;
if(x<=mid)update(k<<);
else update(k<<|);
tree[k].sum=tree[k<<].sum+tree[k<<|].sum;
}
void query(int k) //区间求和。
{
if(x<=tree[k].l&&y>=tree[k].r)
{
ans+=tree[k].sum;
return ;
}
long long mid=(tree[k].l+tree[k].r)>>;
if(x<=mid)query(k<<);
if(y>mid)query(k<<|);
}
int main()
{
scanf("%lld%lld",&n,&m);
build(,,); //感觉在后边建树会比较麻烦,就在此建吧,也慢不了多少。
for(int i=;i<=n;i++)
{
cin>>x>>y;
update(); //每个亮度依靠单点修改来完成。
MAX=max(MAX,x);
}
long long u=;
for(int i=;i<=MAX-m+;i++) //枚举每段合适区间。
{
ans=;
x=i;y=i+m-;
query(); //求取区间和 。
u=max(u,ans); // 记录区间最大和。
}
printf("%lld",u); //输出就好了;
}
此为个人略解,转载请标明出处:http://www.cnblogs.com/rmy020718/p/8832897.html
  本人永久联系QQ:2240560936
  那年你倾尽天下白衣无暇,可曾记得我静月未成一轮春夏,一语落罢,却是了无牵挂。 

最新文章

  1. 使用Akka.net开发第一个分布式应用
  2. SublimeText的奇特应用
  3. C# 获取当前路径方法
  4. 删除mysql
  5. dataTable/dataSet转换成Json格式
  6. Linux中文件描述符fd和文件指针flip的理解
  7. C# BackgroundWorker的使用【转-http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html】
  8. Oracle笔记 十二、PL/SQL 面向对象oop编程
  9. NOJ1066-堆排序
  10. 使用命令行编译、打包、运行WordCount--不用eclipse
  11. [转]system函数返回值探究
  12. Android+Junit单元测试1
  13. laravel安装 笔记
  14. Microsoft Visual C++ Package Server 已停止工作
  15. kafka HA
  16. set_false_path的用法
  17. pandas的时间戳
  18. Object-c基本语法
  19. C# 中文判断
  20. ASP.NET MVC BundleConfig介绍和使用

热门文章

  1. 洛谷 - P2657 - windy数 - 数位dp
  2. C++笔试题(七)
  3. Codeforces 378C
  4. bzoj 1060: [ZJOI2007]时态同步【树形dp】
  5. 手机测试用例-wap测试用例
  6. hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)
  7. 关于协程:nodejs和golang协程的不同
  8. 使用Git分布式版本控制系统
  9. C# 多线程(转)
  10. jquery html() 和text()的用法