zoukankan      html  css  js  c++  java
  • luogu P1531 I hate it

    这是道裸的线段树题,而且不需要区间修改。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 int n,m,a[200001],ans[5001],f1,f2;
     6 char s;
     7 struct k1{
     8     int l;
     9     int r;
    10     int mid;
    11     int date;
    12 }tree[1000000];
    13 void build(int l,int r,int pos)
    14 {
    15     tree[pos].l=l;
    16     tree[pos].r=r;
    17     tree[pos].mid=(l+r)/2;
    18     if(l==r)
    19     tree[pos].date=a[l];
    20     else
    21     {
    22         build(l,tree[pos].mid,pos<<1);
    23         build(tree[pos].mid+1,r,(pos<<1)+1);
    24         tree[pos].date=max(tree[pos<<1].date,tree[(pos<<1)+1].date);
    25     }
    26 }
    27 int query(int l,int r,int pos)
    28 {
    29     if((tree[pos].l==l)&&(tree[pos].r==r))
    30     return tree[pos].date;
    31     if(r<=tree[pos].mid)
    32     return query(l,r,pos<<1);
    33     if(l>tree[pos].mid)
    34     return query(l,r,(pos<<1)+1);
    35     return max(query(l,tree[pos].mid,pos<<1),query(tree[pos].mid+1,r,(pos<<1)+1));
    36 }
    37 void update(int num,int pos)
    38 {
    39     if(tree[pos].l==tree[pos].r)
    40     tree[pos].date=a[num];
    41     else
    42     {
    43         if(num<=tree[pos].mid)
    44         {
    45             update(num,pos<<1);
    46             if(tree[pos<<1].date>tree[pos].date)
    47             tree[pos].date=tree[pos<<1].date;
    48         }
    49         else
    50         {
    51             update(num,(pos<<1)+1);
    52             if(tree[(pos<<1)+1].date>tree[pos].date)
    53             tree[pos].date=tree[(pos<<1)+1].date;
    54         }    
    55     }
    56 }
    57 int main()
    58 {
    59     scanf("%d%d",&n,&m);
    60     for(int i=1;i<=n;i++)
    61     scanf("%d",&a[i]);
    62     build(1,n,1);
    63     for(int i=1;i<=m;i++)
    64     {
    65         scanf("%s",&s);
    66         if(s=='Q')
    67         {
    68             scanf("%d%d",&f1,&f2);
    69             ans[i]=query(f1,f2,1);        
    70         }
    71         if(s=='U')
    72         {
    73             scanf("%d%d",&f1,&f2);
    74             if(a[f1]<f2)
    75             {
    76                 a[f1]=f2;
    77                 update(f1,1);                
    78             }
    79         }
    80     }
    81     for(int i=1;i<=m;i++)
    82     {
    83         if(ans[i]!=0)
    84         printf("%d
    ",ans[i]);
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    Ubuntu -- 安装、卸载程序的命令
    nodejs基础 -- 多进程
    nodejs基础 -- express框架
    nodejs基础 -- web模块
    nodejs基础 -- 常用工具util
    nodejs基础 -- 全局对象
    nodejs基础 -- 路由
    MVC4中下拉菜单和单选框的简单设计方法
    Uploadify在MVC中使用方法案例(一个视图多次上传单张图片)
    Uploadify在MVC中使用方法案例(上传单张图片)
  • 原文地址:https://www.cnblogs.com/-cym/p/8505268.html
Copyright © 2011-2022 走看看