我不会ST表

智推推到这个题
发现标签中居然有线段树。。?
于是贸然来了一发线段树
众所周知,线段树的查询是log(n)的
题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)"
然后草草打完代码竟然AC了。。exm??
最慢也不过400ms

数据好水

好吧,不多说上代码
首先是数据存贮,分别是左子节点,右子节点,maxx存贮当前节点的最大值

struct node{
    int left,right,maxx;
}tree[100000*4+10];

建树,和常规一样

void build(int index,int l,int r)
{
    tree[index].left=l,tree[index].right=r;
    if(l==r)
    {
        int x=read();
        tree[index].maxx=x;
        return ;
    }
    int mid=(l+r)>>1;
    build(index<<1,l,mid),build(index<<1|1,mid+1,r);
    tree[index].maxx=max(tree[index<<1].maxx,tree[index<<1|1].maxx);
}

区间查询,记录每个和目标区间有交集的区间的最大值

int intervalask(int index,int l,int r)
{
    if(tree[index].left>=l&&tree[index].right<=r)
        return tree[index].maxx;
    int tempmax=-0x7fffffff;
    if(tree[index<<1].right>=l)
        tempmax=max(intervalask(index<<1,l,r),tempmax);
    if(tree[index<<1|1].left<=r)
        tempmax=max(intervalask(index<<1|1,l,r),tempmax);
    return tempmax;
}

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
struct node{
    int left,right,maxx;
}tree[100000*4+10];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-f;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return f*x;
}

void build(int index,int l,int r)
{
    tree[index].left=l,tree[index].right=r;
    if(l==r)
    {
        int x=read();
        tree[index].maxx=x;
        return ;
    }
    int mid=(l+r)>>1;
    build(index<<1,l,mid),build(index<<1|1,mid+1,r);
    tree[index].maxx=max(tree[index<<1].maxx,tree[index<<1|1].maxx);
}

int intervalask(int index,int l,int r)
{
    if(tree[index].left>=l&&tree[index].right<=r)
        return tree[index].maxx;
    int tempmax=-0x7fffffff;
    if(tree[index<<1].right>=l)
        tempmax=max(intervalask(index<<1,l,r),tempmax);
    if(tree[index<<1|1].left<=r)
        tempmax=max(intervalask(index<<1|1,l,r),tempmax);
    return tempmax;
}

int main()
{
    n=read(),m=read();
    build(1,1,n);
    for(register int i=1,l,r;i<=m;i++)
    {
        l=read(),r=read();
        printf("%d\n",intervalask(1,l,r));
    }
}

就这么多,学学半,如果有不理解的地方可以私信

最新文章

  1. salesforce 零基础学习(二十一)workflow Q&amp;A
  2. vs.net 2005 C# WinForm GroupBOX 的BUG?尝试读取或写入受保护的内存。这通常指示其他内存已损坏
  3. tomcat和mysql安装配置总结
  4. iOS 基础 第三天(0807)
  5. 29、activity横竖屏切换细节问题
  6. logstash multiline
  7. GB2312引进和使用的字体
  8. 动手学习TCP:数据传输(转)
  9. 聊聊RocksDB Compact
  10. 采用SmartQQ 协议可制作聊天机器人
  11. textarea高度自适应,随着内容增加高度增加
  12. JAVA 数组作为方法参数—传递地址
  13. redis-list操作
  14. Quartz基础知识了解(一)
  15. c++为什么要面向对象?
  16. Spark记录-SparkSQL一些操作
  17. CCF CSP认证考试试题
  18. Python:SQLMap的工作流程
  19. LeetCode--203--删除链表中的节点
  20. ASP.NET在请求中检测到包含潜在危险的数据,因为它可能包括 HTML标记或脚本

热门文章

  1. Elasticsearch之探索集群信息
  2. python入门之流程控制
  3. 用注解@DelcareParents实现引用增强
  4. HDU 3117 Fibonacci Numbers 数学
  5. Unity EditorWindow知识记录
  6. Semi-prime H-numbers
  7. 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比
  8. 优秀Java程序员的四大忌,你避免了吗?
  9. JS小游戏
  10. linux_base-f10-10_7 linuxulator is not (kld)loaded