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 懒得写了. [代码] ...
随机推荐
- web.xml中 /和/*的区别
< url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url< url-patter ...
- 最全的MonkeyRunner自动化测试从入门到精通(2)
一.Python环境变量的配置 步骤一:在官网进行下载python安装包,官网下载的路径:https://www.python.org/,如图所示: 步骤二:下载完成后,双击安装包,进行如下安装的界面 ...
- BouncyCastle 密钥转换 - Java
转自: https://blog.csdn.net/a351945755/article/details/63707040 1. PKCS#8 转 PKCS#1 You will need Bounc ...
- cudnn升级之后caffe无法训练的问题
由于安装新版本的TensorFlow需要cudnn6.0因此用6.0将原来的 5.0替换了,后来又用之前编译好的caffe进行训练,发现caffe会去找5.0的cudnn,然后就报错了,不能正常训练. ...
- document数据路由
(1)document数据路由的理解:我们知道,一个index的数据会被分为多片,每片都在一个shard中,所以说,一个document,只能存在于一个shard中.当客户端创建document的时候 ...
- 20180824 SSRS Line Chart 绘制
(很多时候我都会只记录遇到的问题点,很少详细的写整个过程) 1. 安装ReportBulider 客户端,不需要填写server url ,可以先放空,后面再维护. 安装包官网可以下载,是免费的,现在 ...
- 004-linux命令-搜索命令find、locate、whereis、which、type
一.概述 使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索. 1.1.find 语法:find <指定目录> <指定条件> <指定动作& ...
- oracle对日期date类型操作的函数
无论是DATE还是timestamp都可以进行加减操作 加一个简单的数来增加天 max,min来求其最大最小日期 avg,sum就只能先转成数字类型才可用 使用内置函数add_months来增加年和月 ...
- Spark中repartition和partitionBy的区别
repartition 和 partitionBy 都是对数据进行重新分区,默认都是使用 HashPartitioner,区别在于partitionBy 只能用于 PairRDD,但是当它们同时都用于 ...
- 《全栈性能Jmeter》-3JMeter体系结构