hdu5439 二分
题意
初始给了 1 2 两个数
第二步 因为第2个数是2 所以 在序列后面放上2个2 包括他自己之前有的 序列变成 1 2 2
第三步 因为第3个数是2 所以 在序列后面放上2个3 就变成了 1 2 2 3 3
第4步 第4个数为3 所以 在序列后面放上3个4 变成 1 2 2 3 3 4 4 4
以此类推 序列就是 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8。。。
求的是n的最后出现位置 的最后出现位置, 也就是说 如果 n最后一次出现在第k位 那么 k的最后一次出现在哪里
我们可以知道 如果答案询问的是n 那么我们就可以知道 回答的肯定是 n最后所在的位置的前K项和,可想而知 !!!比如查询 3 那么就是求前5项的和
但是好像100000000那么多不太如意
在分解
1*1+(2+3)*2 这个答案是3的答案
那么 10呢?
就是 1*1+(2+3)*2+(4+5)*3+(6+7+8)*4+(9+10)*5;
好像知道了 最后要计算的就是 括号里面最大的那个值得为止的上式的和 那么但是我并不知道 后面乘的那个k得有多大 可以使得括号里面的最大值为1000000000,打了一下表发现 500000足够了
于是 用二分 +求和了
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn=;
const LL MOD=;
struct elem{
LL L,R;
elem(LL cL=,LL cR=)
{
L=cL; R=cR;
}
}P[maxn];
int cnt;
LL sum[maxn];
int look(LL d)
{
int L=,R=cnt-;
int ans=;
while(L<=R){
int mid=(L+R)>>;
if(P[mid].L<=d&&P[mid].R>=d){
ans=mid;break;
}
if(P[mid].L>d){
R=mid-;
}else{
L=mid+;
}
}
return ans;
}
void init()
{
cnt=;
P[cnt++]=elem(,);
P[cnt++]=elem(,);
LL loc=;
for(int i=; i<=; i++)
{
int d=look(i);
P[cnt++]=elem(loc,loc+d-);
loc=loc+d;
}
sum[]=;
for(LL i= ; i<cnt; i++)
{
LL nu=P[i].R-P[i].L+;
LL s= (P[i].L+P[i].R)*nu/;
s=(s*i)%MOD;
sum[i]=(s+sum[i-])%MOD;
}
}
int main()
{
init();
int cas;
scanf("%d",&cas);
for(int cc=; cc<=cas; cc++)
{
LL loc;
scanf("%I64d",&loc);
LL d=look(loc);
LL ans=sum[d-];
LL s=1LL*(loc-P[d].L+)*(loc+P[d].L)/;
s=((s%MOD)*d)%MOD;
ans=(ans+s)%MOD;
printf("%I64d\n",ans);
}
return ;
}
hdu5439 二分的更多相关文章
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- [bzoj2653][middle] (二分 + 主席树)
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
随机推荐
- 继承数组的slice方法
<script> var arr=[1,2,3,4,5]; console.log(Array.prototype.slice.call(arr,1)); </script> ...
- 别让Open Sans字体拖慢wordpress后台速度
最近打开wordpress后台是不是很慢?国内GG登不上了?这两者有没什么直接的联系?没错,WordPress后台是自动加载的谷歌Open Sans字体,据说gg服务器已经迁移到阿嘛丽可,需要一些小手 ...
- centos安装Django之三:安装python
这是centos安装Django系列第三篇,安装python.centos系统已经自带了python2.6,但是它被系统很多程序所依赖,不建议删除.我们可以使用以下命令来查看我们使用的Python版本 ...
- Linux软件包的安装(rpm+yum)
概述: 1.rpm软件包管理命令软件包的获取a.光盘镜像中有很多软件包可以使用:先挂载光盘,再查看软件包b.从软件的官网获取 .rpm 安装rpm包 ipm -ivh 软件包名称删除rpm包 ipm ...
- react 脚手架--create-react-app
1.yarn add -g create-react-app 2.create-react-app demo cd demo yarn start 可以跑起来整个项目了 一般都会用到路由,需要 yar ...
- 用jquery将多个页面中相似页面显示到一个页面并实现来回跳转
今天遇到一个问题,客户说页面来回跳转太麻烦了,需要把相似的页面做到一个页面上去. 接下来说一下记录一下解决方法. 首先这是三个页面中相似的Div: <div class="wenti& ...
- Spark Sql之ThriftServer和Beeline的使用
概述 ThriftServer相当于service层,而ThriftServer通过Beeline来连接数据库.客户端用于连接JDBC的Server的一个工具 步骤 1:启动metastore服务 . ...
- Day2 Python基础学习——字符串、列表、元组、字典、集合
Python中文学习大本营:http://www.pythondoc.com/ 一.字符串操作 一.用途:名字,性格,地址 name = 'wzs' #name = str('wzs')print(i ...
- NgDL:【第二周】NN基础
1.计算图的导数计算 正向比如说是计算代价函数值,反向就是增大多少a/b/c对J的影响,也就是导数的意义,这里讲的是求导链式法则. 2.向量化 节约大量计算时间 简直是100倍的时间,看来之前实现的那 ...
- JS 8-1 OOP概念与继承
function Foo(){ this.y=2; } typeof Foo.prototype; Foo.prototype.x = 1; var obj3= new Foo(); obj3.x; ...