zoukankan      html  css  js  c++  java
  • Bzoj3339 Rmq Problem

    Time Limit: 20 Sec  Memory Limit: 128 MB
    Submit: 1120  Solved: 580

    Description

    Input

    Output

    Sample Input

    7 5
    0 2 1 0 1 3 2
    1 3
    2 3
    1 4
    3 6
    2 7

    Sample Output

    3
    0
    3
    2
    4

    HINT

    Source

    询问分块 莫队 暴力

    只要记录每个数字出现的次数,修改的时候暴力更新答案即可。

    SX博主居然忘了cnt++的时候也可能使cnt变为0,然后就无比自信地写成了30行那样,然后光荣地成为了整个status里wa最多的人

    替自己的智商感到担忧.jpg

     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mxn=200010;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 int cnt[mxn*20];
    17 struct que{
    18     int l,r;
    19     int m,id;
    20 }q[mxn];
    21 int cmp(que a,que b){
    22     return (a.m<b.m)||(a.m==b.m && a.r<b.r);
    23 }
    24 int n,m,a[mxn];
    25 int ans[mxn];
    26 int nowans;
    27 inline void add(int x){
    28     if(x>n)return;
    29     ++cnt[x];
    30 //    while(cnt[nowans])nowans++;
    31     if(x<nowans)
    32     {
    33         if(!cnt[x])nowans=x;
    34     }
    35     else if(nowans==x)
    36     {
    37         while(cnt[nowans])nowans++;
    38     }
    39     return;
    40 }
    41 inline void del(int x){
    42     if(x>n)return;
    43     --cnt[x];
    44     if(!cnt[x])nowans=min(nowans,x);
    45     return;
    46 }
    47 void solve(){
    48     int i,j;
    49     int l=1,r=0;
    50     nowans=0;
    51     for(i=1;i<=m;i++){
    52         while(l<q[i].l){del(a[l]);l++;}
    53         while(l>q[i].l){l--;add(a[l]);}
    54         while(r>q[i].r){del(a[r]);r--;}
    55         while(r<q[i].r){r++;add(a[r]);}
    56         ans[q[i].id]=nowans;
    57     }
    58     return;
    59 }
    60 int main(){
    61     int i,j;
    62     n=read();m=read();
    63     for(i=1;i<=n;i++){
    64         a[i]=read();
    65     }
    66     int len=sqrt(n);
    67     for(i=1;i<=m;i++){
    68         q[i].l=read();    q[i].r=read();
    69         q[i].m=(q[i].l-1)/len+1;
    70         q[i].id=i;
    71     }
    72     sort(q+1,q+m+1,cmp);
    73     solve();
    74     for(i=1;i<=m;i++)printf("%d
    ",ans[i]);
    75     return 0;
    76 }
  • 相关阅读:
    linux安装redis 完整步骤
    java获取音频文件播放时长
    jar包部署在linux上后浏览器访问不到的问题
    FileRead方法
    FileWrite方法
    用Calendar方法知道月份的天数
    Calendar的用法
    两个时间相减(java简单用法)
    单列体现(Runtime)
    Random方法
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6601728.html
Copyright © 2011-2022 走看看