HH的項鍊

這題數據加強以後是真讓人感受HHios

LG1972 HH的項鍊數據結構

改數據以後應該用西安段素或者梳妝十足,然而我也懶得改了,就發一個如今過不了的墨對算fa(然而卡一卡說不定能過)spa

 

一 墨對是什麼指針

墨對是一個叫莫濤的dalao fa明的,是一種極其暴力的處理區間問題的數據結構(其實分塊(逃。code

主要利用了分塊blog

 

二 思想排序

將詢問的區間排序,而後用兩個指針X**跳(沒了)。ci

 

codestring

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 500010;
int col[maxn],ans[maxn],sum[1000003],n,m,base,answer;
int l,r;  

struct Q {
  int left;
  int right;
  int id;
} ques[maxn]; 
int q_sum = 0;

bool comp(Q a,Q b) {
  if(a.left/base!=b.left/base)      
    return a.left<b.left;
  else
    return a.right<b.right;                        
}

inline void add(int x) {          
  if(++ sum[x] == 1) 
        answer ++;
} 

inline void del(int x) {
  if(-- sum[x] == 0) 
        answer --;
} 

int main() {
  ios::sync_with_stdio(false);
  cin>>n;
  base=sqrt(n);
  for(int i=1; i<=n; i++)
    cin>>col[i];
  cin>>m;
  for(int i=1; i<=m; i++) {
    cin>>ques[++q_sum].left; 
    cin>>ques[q_sum].right; 
    ques[q_sum].id=q_sum;     
  }
  sort(ques+1,ques+q_sum+1,comp); 
  l = ques[1].left;
  r = l-1; 
  for(int i=1; i<=q_sum; i++) {
    while(l<ques[i].left)
      del(col[l++]);
    while(l>ques[i].left)
      add(col[--l]);
    while(r>ques[i].right)
      del(col[r--]);
    while(r<ques[i].right)
      add(col[++r]);          
    ans[ques[i].id]=answer; 
  }
  for(int i=1; i<=q_sum; i++)
    cout<<ans[i]<<endl;      
  return 0;
}
相關文章
相關標籤/搜索