当前位置: 代码迷 >> 综合 >> ASC 41 Problem D. Data Mining
  详细解决方案

ASC 41 Problem D. Data Mining

热度:76   发布时间:2024-01-12 05:16:19.0


ASC 41

题意:给n个数,q个查询,每次询问序列中以第L个数为开头的后缀中,第x个数在这个后缀中是第几个出现的。


离线查询。

将查询按L从小到大排序,预处理每个数上一次出现的位置。

每次插入上一次出现位置在L之前的数,显然会将所有L之前的数都加入,然后查询这个数在后缀中第一次出现的位置(设为p)之前的前缀和。

由于L之前所有数都被加入,且[L,p]之间的所有数有且仅有被插入一次,所以就能得到了这个询问的答案。



#include <bits/stdc++.h>
using namespace std;
const int MAXN=200005;
int a[MAXN], ans[MAXN], disc[MAXN];
int last[MAXN], bit[MAXN];
vector<int> pos[MAXN];
pair<int, int> pre[MAXN];
struct query{int pos, p, idx, num;bool operator < (const query& Rhs) const{return pos < Rhs.pos;}
}q[MAXN];
void add(int x, int v){while(x<MAXN){bit[x]+=v;x+=x&(-x);}
}
int query(int 
  相关解决方案