https://www.nowcoder.com/acm/contest/124#question

题意  找第一个不小于K的数的下标,然后对它前一个数加一

解析   我们可以维护一个最大值数组  1到 i的 最大值 就是max[ i ]  二分找到最左边的值 但是 找到的前一个加1 要用线段树来维护最大值

但是 这么写会超时。。。

超时代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=,maxn=1e6+;
int sum[maxn<<];
int a[maxn],n,m;
void PushUP(int rt)
{
sum[rt]=max(sum[rt<<],sum[rt<<|]);
}
void Build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
return; }
int m=(l+r)>>;
Build(l,m,rt<<);
Build(m+,r,rt<<|);
PushUP(rt);
}
void Update(int L,int C,int l,int r,int rt)
{
if(l==r)
{
sum[rt]+=C;
return;
}
int m=(l+r)>>;
if(L<=m)
Update(L,C,l,m,rt<<);
else
Update(L,C,m+,r,rt<<|);
PushUP(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
int m=(l+r)>>;
int ans=-;
if(L<=m)
ans=max(ans,Query(L,R,l,m,rt<<));
if(R>m)
ans=max(ans,Query(L,R,m+,r,rt<<|));
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(sum,,sizeof(sum));
memset(a,,sizeof(a));
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
}
Build(,n,);
int l,r,k;
while(m--)
{
l=,r=n;
scanf("%d",&k);
//cout<<Query(1,n,1,n,1)<<endl;
if(Query(,n,,n,)<k)
{
printf("are you ok\n");
continue;
}
while(l<=r)
{
int mid=(l+r)>>;
// cout<<mid<<" "<<Query(1,mid,1,n,1)<<endl;
if(Query(,mid,,n,)>=k)
r=mid-;
else
l=mid+;
}
printf("%d\n",l-);
if(l-)
Update(l-,,,n,);
}
}
}

q的 询问比较多应该是卡了常数  我们要优化一下  因为 线段树查询的时候就是二分  区间最大值是递增的 我们直接利用这个特点来操作

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=,maxn=1e6+;
int sum[maxn<<];
int a[maxn],n,m;
void PushUP(int rt)
{
sum[rt]=max(sum[rt<<],sum[rt<<|]);
}
void Build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
return; }
int m=(l+r)>>;
Build(l,m,rt<<);
Build(m+,r,rt<<|);
PushUP(rt);
}
void Update(int L,int C,int l,int r,int rt)
{
if(l==r)
{
sum[rt]+=C;
return;
}
int m=(l+r)>>;
if(L<=m)
Update(L,C,l,m,rt<<);
else
Update(L,C,m+,r,rt<<|);
PushUP(rt);
}
int query(int L,int R,int l,int r,int rt,int p)
{
if(l==r)
{
return l;
}
int m=(l+r)>>;
if(sum[rt<<]>=p) //二分查询
return query(L,R,l,m,rt<<,p);
return query(L,R,m+,r,rt<<|,p);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(sum,,sizeof(sum));
memset(a,,sizeof(a));
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
}
Build(,n,);
int l,r,k;
while(m--)
{
l=,r=n;
scanf("%d",&k);
if(sum[]<k)
{
printf("are you ok\n");
continue;
}
int ans=query(,n,,n,,k);
printf("%d\n",ans-);
if(ans-)
Update(ans-,,,n,);
}
}
}

其实 还有更简单的做法 因为 修改的是前一个值 而且找的是满足条件中最左边的 所以前一个+1 并不会 影响数组的单调性 变得只有前面一个的最大值  更新一下就好了

#include<bits/stdc++.h>
using namespace std;
int a[],b[];
int n,q,k;
int main()
{
while(~scanf("%d%d",&n,&q))
{
int mx=;
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=mx=max(mx,a[i]);
}
while(q--)
{
scanf("%d",&k);
int l=lower_bound(b,b+n,k)-b;
if(l==n){
printf("are you ok\n");
continue;
}
printf("%d\n",l);
if(l==)continue;
a[l-]++;
b[l-]=max(a[l-],b[l-]);
}
}
}

牛客网 中南林业科技大学第十一届程序设计大赛J题 二分+线段树的更多相关文章

  1. 中南林业科技大学第十一届程序设计大赛 有趣的二进制 牛客网 java大数的一些方法

    链接:https://www.nowcoder.com/acm/contest/124/C来源:牛客网 题目描述 小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有 ...

  2. 中南林业科技大学第十一届程序设计大赛- I:背包问题

    链接:https://www.nowcoder.com/acm/contest/124/I来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 131072K,其他语言26214 ...

  3. 中南林业科技大学第十一届程序设计大赛-C:有趣的二进制

    链接:https://www.nowcoder.com/acm/contest/124/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言26214 ...

  4. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 G.路径-带条件的树的直径变形-边权最大,边数偶数的树上的最长路径-树形dp

    链接:https://ac.nowcoder.com/acm/contest/558/G 来源:牛客网 路径 小猫在研究树. 小猫在研究路径. 给定一棵N个点的树,每条边有边权,请你求出最长的一条路径 ...

  5. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)

    链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...

  6. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 C.二元-K个二元组最小值和最大-优先队列+贪心(思维)

    链接:https://ac.nowcoder.com/acm/contest/558/C来源:牛客网 小猫在研究二元组. 小猫在研究最大值. 给定N个二元组(a1,b1),(a2,b2),…,(aN, ...

  7. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题

    链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...

  8. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  9. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

随机推荐

  1. CROSS APPLY AND CROSS APPLY

    随着业务千奇百怪,DBA数据库设计各有不同,一对多关系存JSON或字符串逗号分隔... 今天小编给大家分享一下针对这个问题的解决办法 问题一.存储过程接受参数格式为XXX,XXX 解决办法:将字符转成 ...

  2. 来自锐动天地的直播ios SDK

    直播iOS SDK,可以在手机iOS端实时采集视频,同时在拍摄过程中支持多种实时滤镜效果,只要调用视频直播接口,通过3G.4G.WIFI等网络,推流发送给云端流媒体直播系统处理,并通过CDN视频加速分 ...

  3. 掌握Spark机器学习库-07-最小二乘法

    1)最小化残差平方和 2)原理,推导过程 3)例子

  4. php中字符与字节的区别

    字符: 字符是可使用多种不同字符方案或代码页来表示的抽象实体.例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字 ...

  5. 什么是BDD?

    BDD是TDD的一种衍生,通过特定的BDD框架,用自然语言或类自然语言,按照编写用户故事或者用户用例的方式,以功能使用者的视角,描述并编写测试用例. BDD源于TDD并优于测试驱动开发. 之所以说BD ...

  6. vue2.0 路由知识一(路由的创建的全过程)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。

    题意: 给一个由n*m个正方形格子组成的矩形,其中每个格子的边都是可以走的,长度给定,规定:如果在进入该路前需要拐弯,或者走完该路需要拐弯,都是需要付出双倍距离的(每条路最多算2倍).问从起点到终点的 ...

  8. PHP常量和数据类型考察点

    PHP 常量 常量是单个值的标识符(名称).在脚本中无法改变该值. 有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号). 注释:与变量不同,常量贯穿整个脚本是自动全局的. PHP常量的两种定 ...

  9. 自己编辑Nuget拓展包,并发布Nuget服务器,提供下载使用

    1. 在NuGet官网上注册并获取API Key 到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,如果没有则在API keys 页面创建一个就可以. 2. 下载 ...

  10. du查看文件大小

    du+文件名就可以查看文件大小 du+ -h + 文件名也是查看文件大小,只是-h会将文件大小转换成M,G等格式