zoukankan      html  css  js  c++  java
  • sequence

    惨遭卡常

      1 #include <bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 typedef pair<int,pair<int,int> > pp;
      6 const int N = 501000;
      7 
      8 int read(){
      9     int x = 0;char ch = getchar();
     10     while (ch < '0' || '9' < ch) ch = getchar();
     11     while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0',ch = getchar();
     12     return x;
     13 }
     14 
     15 pp seg[N<<2];
     16 int mx[N<<2];
     17 struct Node{
     18     int x,y;
     19     Node(){}
     20     Node(int x,int y):x(x),y(y){}
     21 }nod[N],sta[N];
     22 struct Node2{
     23     int x,y,z;
     24     Node2(){}
     25     Node2(int x,int y,int z):x(x),y(y),z(z){}
     26 }ques[N];
     27 
     28 int n,q,a[N],len,cnt,ans[N];
     29 void init(int,int,int);
     30 void update(int);
     31 void insert(int,int,int,int,int);
     32 int getans(int,int,int,int,int);
     33 pp get(int,int,int,int,int);
     34 pp merge(pp,pp);
     35 bool cmp1(const Node &a,const Node &b){
     36     return a.x < b.x;
     37 }
     38 bool cmp2(const Node &a,const Node &b){
     39     return a.y < b.y;
     40 }
     41 bool cmp3(const Node2 &a,const Node2 &b){
     42     return a.x > b.x;
     43 }
     44 bool cmp4(const Node2 &a,const Node2 &b){
     45     return a.y < b.y;
     46 }
     47 bool cmp5(const Node &a,const Node &b){
     48     return a.x > b.x;
     49 }
     50 
     51 int main(){
     52     n = read();q = read();
     53     for (int i = 1;i <= n;i++) {
     54         a[i] = read();
     55         nod[i] = Node(a[i],i);
     56     }
     57     for (int i = 1;i <= q;i++){
     58         int x,y;x = read();y = read();
     59         ques[i] = Node2(x,y,i);
     60     }
     61     sort(nod+1,nod+1+n,cmp1);
     62     int ncnt = 1;
     63     for (int i = 2;i <= n;i++)
     64         if (nod[i].x == nod[i-1].x) nod[i-1].x = ncnt;
     65         else nod[i-1].x = ncnt++; 
     66     nod[n].x = ncnt;
     67     for (int i = 1;i <= n;i++)
     68         a[nod[i].y] = nod[i].x;
     69     
     70     init(1,1,n);
     71     
     72     
     73     len = 1;sta[1] = Node(a[1],1);cnt = 0;
     74     for (int i = 2;i <= n;i++) {
     75         while (len && a[i] > sta[len].x){
     76             int u = sta[len].x,v = sta[len].y;len--;
     77             while (len && sta[len].x == u){
     78                 nod[++cnt] = Node(sta[len].y,v);
     79                 len--;
     80             }
     81         }
     82         sta[++len] = Node(a[i],i);
     83     }
     84     while (len){
     85         int u = sta[len].x,v = sta[len].y;len--;
     86         while (len && sta[len].x == u){
     87             nod[++cnt] = Node(sta[len].y,v); 
     88             len--;
     89         }
     90     }
     91     
     92     sort(nod+1,nod+1+cnt,cmp2);
     93     sort(ques+1,ques+1+q,cmp4);
     94     int head1 = 1,head2 = 1;
     95     memset(mx,0,sizeof(mx));
     96     for (int i = 1;i <= n;i++){
     97         while (head1 <= cnt && nod[head1].y == i){
     98             int u = nod[head1].x;
     99             insert(1,1,n,u,i-u+1);
    100             head1++;
    101         }
    102         while (head2 <= q && ques[head2].y == i){
    103             int x = ques[head2].x,z = ques[head2].z;
    104             ans[z] = max(ans[z],getans(1,1,n,x,i));
    105             head2++;
    106         }
    107     }
    108     
    109     //part2
    110     
    111     len = 1;sta[1] = Node(a[n],n);cnt = 0;
    112     for (int i = n-1;i >= 1;i--) {
    113         while (len && a[i] > sta[len].x){
    114             int u = sta[len].x,v = sta[len].y;len--;
    115             while (len && sta[len].x == u){
    116                 nod[++cnt] = Node(v,sta[len].y);
    117                 len--;
    118             }
    119         }
    120         sta[++len] = Node(a[i],i);
    121     }
    122     while (len){
    123         int u = sta[len].x,v = sta[len].y;len--;
    124         while (len && sta[len].x == u){
    125             nod[++cnt] = Node(v,sta[len].y); 
    126             len--;
    127         }
    128     }
    129     
    130     sort(nod+1,nod+1+cnt,cmp5);
    131     sort(ques+1,ques+1+q,cmp3);
    132     head1 = 1;head2 = 1;
    133     memset(mx,0,sizeof(mx));
    134     for (int i = n;i >= 1;i--){
    135         while (head1 <= cnt && nod[head1].x == i){
    136             int u = nod[head1].y;
    137             insert(1,1,n,u,u-i+1);
    138             head1++;
    139         }
    140         while (head2 <= q && ques[head2].x == i){
    141             int y = ques[head2].y,z = ques[head2].z;
    142             ans[z] = max(ans[z],getans(1,1,n,i,y));
    143             head2++;
    144         }
    145     }
    146     
    147     
    148 //    part3
    149     for (int i = 1;i <= q;i++){
    150         int x = ques[i].x,y = ques[i].y,z = ques[i].z;
    151         pp g = get(1,1,n,x,y);
    152         ans[z] = max(ans[z],g.second.second - g.second.first + 1);
    153         /*
    154             如果单个点不算答案,这里要特判无解 
    155             否则恰好包含单个点的情况(原来没考虑到 
    156         */
    157     }
    158     for (int i = 1;i <= q;i++) printf("%d
    ",ans[i]);
    159     return 0;
    160 }
    161 void init(int p,int l,int r){
    162     if (l == r){
    163         seg[p].first = a[l];
    164         seg[p].second = make_pair(l,l);
    165         return;
    166     }
    167     int mid = l + r >> 1;
    168     init(p<<1,l,mid);
    169     init(p<<1|1,mid+1,r);
    170     update(p);
    171 }
    172 void update(int p){
    173     int u = p<<1,v = u|1;
    174     if (seg[u].first < seg[v].first) seg[p] = seg[v];
    175     else if (seg[u].first > seg[v].first) seg[p] = seg[u];
    176     else{
    177         seg[p].first = seg[u].first;
    178         seg[p].second.first = seg[u].second.first;
    179         seg[p].second.second = seg[v].second.second;
    180     }
    181 }
    182 void insert(int p,int l,int r,int x,int y){
    183     mx[p] = max(mx[p],y);
    184     if (l == r) return;
    185     int mid = l + r >> 1;
    186     if (x <= mid) insert(p<<1,l,mid,x,y);
    187     else insert(p<<1|1,mid+1,r,x,y);
    188 }
    189 int getans(int p,int l,int r,int x,int y){
    190     if (l == x && r == y) return mx[p];
    191     int mid = l + r >> 1;
    192     if (y <= mid) return getans(p<<1,l,mid,x,y);
    193     else if (mid < x) return getans(p<<1|1,mid+1,r,x,y);
    194     else return max(getans(p<<1,l,mid,x,mid),getans(p<<1|1,mid+1,r,mid+1,y));
    195 }
    196 pp get(int p,int l,int r,int x,int y){
    197     if (l == x && r == y) return seg[p];
    198     int mid = l + r >> 1;
    199     if (y <= mid) return get(p<<1,l,mid,x,y);
    200     else if (mid < x) return get(p<<1|1,mid+1,r,x,y);
    201     else return merge(get(p<<1,l,mid,x,mid),get(p<<1|1,mid+1,r,mid+1,y));
    202 }
    203 pp merge(pp x,pp y){
    204     pp z;
    205     if (x.first > y.first) return x;
    206     else if (x.first < y.first) return y;
    207     else {
    208         z.first = x.first;
    209         z.second.first = x.second.first;
    210         z.second.second = y.second.second;
    211         return z;
    212     }
    213 }
  • 相关阅读:
    hdu 4614 线段树 二分
    cf 1066d 思维 二分
    lca 最大生成树 逆向思维 2018 徐州赛区网络预赛j
    rmq学习
    hdu 5692 dfs序 线段树
    dfs序介绍
    poj 3321 dfs序 树状数组 前向星
    cf 1060d 思维贪心
    【PAT甲级】1126 Eulerian Path (25分)
    【PAT甲级】1125 Chain the Ropes (25分)
  • 原文地址:https://www.cnblogs.com/victbr/p/6710372.html
Copyright © 2011-2022 走看看