zoukankan      html  css  js  c++  java
  • 3339: Rmq Problem

    Time Limit: 20 Sec  Memory Limit: 128 MB
    Submit: 1269  Solved: 665
    [Submit][Status][Discuss]

    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

    By X

    裸地莫队题目,

    每次加入一个数,如果当前答案等于加入的数,就暴力向上加

    每次删除一个数,如果删除的那个数比当前的答案小,那么当前的答案就赋值程这个数

    因此

    add和dele函数都非常好些。

    但是,,,,,

    我写的莫队各种RE,WA,TLE,MLE。。。。。。。。。。。。

    和标称拍了一头午也没拍出错误来。。。。

    也是醉了。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 const int MAXN=3000011;
     9 /*inline void read(int &n)
    10 {
    11     char c='+';int x=0;bool flag=0;
    12     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
    13     while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
    14     n=flag==1?-x:x;
    15 }*/
    16 const int BUF=30000010;
    17 char Buf[BUF],*buf=Buf;int BUFflag; 
    18 inline void read(int &now)
    19 {
    20     for(now=0; ! isdigit (*buf); ++buf);
    21     for(; isdigit ( *buf );now = now * 10+ (*buf-'0') ,++buf);
    22 }
    23 struct node
    24 {
    25     int l,r,bh,ans;
    26 }ask[MAXN];
    27 int n,q;
    28 int a[MAXN];
    29 int pos[MAXN];
    30 int base;
    31 inline int comp(const node &a,const node &b)
    32 {
    33     if(pos[a.l]==pos[a.l])     return pos[a.r]<pos[b.r];
    34     else     return pos[a.l]<pos[b.l];
    35 }
    36 int happen[MAXN];
    37 int out[MAXN];
    38 int now=0;
    39 inline void dele(int p)
    40 {
    41     happen[a[p]]--;
    42     if(happen[a[p]]==0&&a[p]<now)
    43         now=a[p];
    44 }
    45 inline void add(int p)
    46 {
    47     happen[a[p]]++;
    48     if(now==a[p])
    49     while(happen[now])
    50         now++;
    51 }
    52 int modui()
    53 {
    54     int ll=1,rr=0;
    55     for(int i=1;i<=q;i++)
    56     {
    57         for(;ask[i].l<ll;ll--)
    58             add(ll-1);
    59         for(;ask[i].l>ll;ll++)
    60             dele(ll);
    61         for(;ask[i].r<rr;rr--)
    62             dele(rr);
    63         for(;ask[i].r>rr;rr++)
    64             add(rr+1);
    65         ask[i].ans=now;
    66     }
    67     for(int i=1;i<=q;i++)
    68         out[ask[i].bh]=ask[i].ans;
    69     for(int i=1;i<=q;i++)
    70         printf("%d
    ",out[i]);
    71 }
    72 int main()
    73 {
    74     //freopen("a.in","r",stdin);
    75 //    freopen("b.out","w",stdout);
    76     fread(buf,1,BUF,stdin);
    77     read(n);read(q);
    78     base=sqrt(n);
    79     for(int i=1;i<=n;i++)
    80         read(a[i]),pos[i]=(i-1)/base+1;
    81     for(int i=1;i<=q;i++)
    82     {
    83         int ll,rr;read(ll);read(rr);
    84         ask[i].l=ll;ask[i].r=rr;ask[i].bh=i;
    85     }
    86     sort(ask+1,ask+q+1,comp);
    87     modui();
    88     return 0;
    89 }
    自己写的
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1000005;
     4 inline int read()
     5 {
     6     int x=0,f=1;char ch=getchar();
     7     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
     8     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     9     return x*f;
    10 }
    11 int a[maxn],pos[maxn],c[maxn],Ans[maxn];
    12 int ans,n,m;
    13 struct query
    14 {
    15     int l,r,id;
    16 }Q[maxn];
    17 bool cmp(query a,query b)
    18 {
    19     if(pos[a.l]==pos[b.l])
    20         return a.r<b.r;
    21     return pos[a.l]<pos[b.l];
    22 }
    23 void Update(int x)
    24 {
    25     c[x]++;
    26     if(ans==x)
    27         while(c[ans])
    28             ans++;
    29 }
    30 void Delete(int x)
    31 {
    32     c[x]--;
    33     if(c[x]==0&&x<ans)ans=x;
    34 }
    35 int main()
    36 {
    37     freopen("a.in","r",stdin);
    38     freopen("c.out","w",stdout);
    39     n=read(),m=read();
    40     int sz =ceil(sqrt(1.0*n));
    41     for(int i=1;i<=n;i++)
    42     {
    43         a[i]=read();
    44         pos[i]=(i-1)/sz;
    45     }
    46     for(int i=1;i<=m;i++)
    47     {
    48         Q[i].l=read();
    49         Q[i].r=read();
    50         Q[i].id = i;
    51     }
    52     sort(Q+1,Q+1+m,cmp);
    53     int L=1,R=0;ans=0;
    54     for(int i=1;i<=m;i++)
    55     {
    56         int id = Q[i].id;
    57         while(R<Q[i].r)R++,Update(a[R]);
    58         while(L>Q[i].l)L--,Update(a[L]);
    59         while(R>Q[i].r)Delete(a[R]),R--;
    60         while(L<Q[i].l)Delete(a[L]),L++;
    61         Ans[id]=ans;
    62     }
    63     for(int i=1;i<=m;i++)
    64         printf("%d
    ",Ans[i]);
    65 }
    标称
  • 相关阅读:
    vmodel.lazy详解
    import Vue from 'vue'如何解释?
    ubuntu安装deb文件包
    vue安装
    多线程和多进程的区别
    SLH(Location Sensitive Hash)学习
    hadoop学习笔记(一)简介
    [转]关于协同过滤的好文章
    Linear Regression练习
    regularized 线性回归练习
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7348940.html
Copyright © 2011-2022 走看看