zoukankan      html  css  js  c++  java
  • zoj 3633 Alice's present

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4801

    离线做,将查询区间从小到大排序,具体处理见代码

    My Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 #define maxn 50002
     6 struct op 
     7 {
     8     int l,r,id;
     9 }mes[maxn];
    10 int num[maxn*10],pos[maxn*10];
    11 int sorted[maxn*10];
    12 int ans[maxn];
    13 int deal(int n)
    14 {
    15     int k=2;
    16     for(int i=2;i<=n;i++)
    17     if(sorted[i]!=sorted[i-1])
    18     sorted[k++]=sorted[i];
    19     return k-1;
    20 }
    21 bool cmp(struct op a,struct op b)
    22 {
    23     return a.r<b.r;
    24 }
    25 int binsearch(int l,int r,int key)
    26 {
    27     int m=(l+r)>>1;
    28     if(sorted[m]==key)
    29     return m;
    30     if(key<sorted[m])
    31     return binsearch(l,m-1,key);
    32     return binsearch(m+1,r,key);
    33 }
    34 int main()
    35 {
    36     int n;
    37     while(~scanf("%d",&n)){
    38         memset(ans,-1,sizeof(ans));
    39         memset(pos,-1,sizeof(pos));
    40         for(int i=1;i<=n;i++){
    41             scanf("%d",num+i);
    42             sorted[i]=num[i];
    43         }
    44         sort(sorted+1,sorted+n+1);
    45         int k=deal(n),j=1,l=-1,r=-1;
    46         int m;
    47         scanf("%d",&m);
    48         for(int i=0;i<m;i++){
    49             scanf("%d%d",&mes[i].l,&mes[i].r);
    50             mes[i].id=i;
    51         }
    52         sort(mes,mes+m,cmp);
    53         for(int i=0;i<m;i++){
    54             while(j<=mes[i].r){
    55                 int posj=binsearch(1,k,num[j]);
    56                     if(pos[posj]>l){
    57                         l=pos[posj];
    58                         r=j;
    59                     }
    60                         pos[posj]=j;
    61                         j++;
    62                 }
    63                 if(l>=mes[i].l)
    64                 ans[mes[i].id]=num[r];
    65             }
    66         for(int i=0;i<m;i++){
    67             if(ans[i]==-1)
    68             printf("OK\n");
    69             else
    70             printf("%d\n",ans[i]);
    71         }
    72         printf("\n");
    73     }
    74     return 0;
    75 }

    看了一下题解,貌似可以用线段树在线查询,想了很久都没想到,就直接按自己的来做了。

  • 相关阅读:
    【20211012】以确定去适应不确定
    【20211011】工作之余
    【20211009】二孩的心思
    【20211010】幸福声响
    【20211007】连岳摘抄
    【读书笔记】《创新与企业家精神》
    【20211006】连岳摘抄
    【20211008】生活规律,事情也好解决
    ASP.NET中DataGrid的简单用法
    无限级分类的实现
  • 原文地址:https://www.cnblogs.com/kim888168/p/2910298.html
Copyright © 2011-2022 走看看