map离散化有什么坑点码
查看原帖
map离散化有什么坑点码
311054
GoOAT楼主2020/9/1 23:11
#include <bits/stdc++.h>
using namespace std;
const int limit = 2e5 + 10;


int n, m;
struct node{
    int l, r, qid;
}query[limit];
int cnt[limit],a[limit],sum[limit];
int res;
void add(int x){
    --sum[cnt[a[x]]];//减去多余部分
    ++cnt[a[x]];//增加一个count
    res = max(res, cnt[a[x]]);
    ++sum[cnt[a[x]]];
}
void del(int x){
    if(res == cnt[a[x]] && sum[cnt[a[x]]] == 1) --res;//如果没有了那就增加
    --sum[cnt[a[x]]];//撤回一个count
    --cnt[a[x]];
    ++sum[cnt[a[x]]];
}
map<int, int> mp;
int pos[limit];
int tot, vis[limit];
int main(){
    // freopen("a.in","r",stdin);
    // freopen("a.txt","w",stdout);
    scanf("%d%d",&n,&m);
    tot = 0;
    for(int i = 1 ; i <= n ; i++ ){
        int input;
        scanf("%d",&input);
        if(mp.count(input)){
            a[i] = mp[input];
        }else{
            mp[input] = ++tot;
            a[i] = mp[input];
        }
    }
    int block = sqrt(n);//分块
    for(int i = 1 ; i <= n ; i++ )
        pos[i] = i / block + 1;
    for(int i = 1 ; i <= m ; i++ ){
        scanf("%d%d",&query[i].l,&query[i].r);
        query[i].qid = i;
    }
    sort(query + 1, query + 1 + m,[](node a,node b){
        if(pos[a.l] ^ pos[b.l]) return pos[a.l] < pos[b.l];
        return (pos[a.l] & 1) ? a.r < b.r : a.r > b.r;
    });
    int L = 1 , R = 0;
    for(int i = 1 ; i <= m ; i++ ){
        while(L > query[i].l) add(--L);
        while(L < query[i].l) del(L++);//缩进
        while(R > query[i].r) del(R--);
        while(R < query[i].r) add(++R);
        vis[query[i].qid] = res;
    }
    for(int i = 1 ; i <= m ; i++ ){
        printf("%d\n", -vis[i]);
    }
    return 0;
}

上面的wa了,下面的AC

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn = 2e5 + 10;
struct node{
    int l,r,id;
};
node Q[maxn];
int arr[maxn],pos[maxn];
int cnt[maxn],t[maxn],v[maxn];
int ans[maxn];
int n,m,c;

void add(int x);
void del(int x);
int main(){
    // freopen("a.in","r",stdin);
    // freopen("name.txt","w",stdout);
    scanf("%d%d",&n,&m);
    int ns = sqrt(n);
    for(int i = 1 ; i <= n ; i++ ){
        scanf("%d",&arr[i]);
        v[i] = arr[i];
        pos[i] = i / ns + 1;
    }
    sort(v + 1,v + 1 + n);
    int cntv = unique(v + 1,v + 1 + n) - v - 1;
    for(int i = 1 ; i <= n ; i++ )
        arr[i] = lower_bound(v + 1,v + 1 + cntv,arr[i]) - v;
    for(int i = 1 ; i <= m ; i++ ){
        scanf("%d%d",&Q[i].l,&Q[i].r);
        Q[i].id = i;
    }
    sort(Q + 1,Q + 1 + m,[](node a,node b){
        if(pos[a.l] ^ pos[b.l]) return pos[a.l] < pos[b.l];
        return a.r < b.r;
    });
    int L = 1,R = 0;
    for(int i = 1 ; i <= m ; i++ ){
        while(Q[i].l < L) add(--L);
        while(Q[i].l > L) del(L++);
        while(Q[i].r < R) del(R--);
        while(Q[i].r > R) add(++R);
        ans[Q[i].id] = c;
    }
    for(int i = 1 ; i <= m ; i++ ){
        printf("%d\n", -ans[i]);
    }
    return 0;
}

void add(int x){
    --t[cnt[arr[x]]];
    ++cnt[arr[x]];
    c = max(c,cnt[arr[x]]);
    ++t[cnt[arr[x]]];
}
void del(int x){
    if(t[cnt[arr[x]]] == 1 && c == cnt[arr[x]]){
        --c;
    }
    --t[cnt[arr[x]]];
    --cnt[arr[x]];
    ++t[cnt[arr[x]]];
}

2020/9/1 23:11
加载中...