玄关求卡常
查看原帖
玄关求卡常
1379742
Xiaohaoyu1020明天见_xj楼主2024/12/11 22:57
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,M = 7e5+10;
int n,m,q,limit;
vector<int> bian[N];
set<pair<int,int> > ext;
int cnt[N];
pair<int,int> uo(int u,int v){
    if(u > v)swap(u,v);
    return make_pair(u,v);
}
pair<int,int> op1[N];
vector<pair<int,int> > op2[N];
int ans1[N],ans2[N];
int ty1,ty2;
struct{
    bool type;
    int pos,act;
} idx[N];
map<pair<int,int>,int> mp,mp1;
bitset<200010> point[50000];
int ps[N*2],pnt,pps[N];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>q;
    limit = sqrt((long double)m/q * n/32/log2(m));
    for(int i = 1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        bian[u].push_back(v);
        bian[v].push_back(u);
        cnt[u]++,cnt[v]++;
        ext.insert(uo(u,v));
    }
    for(int i = 1;i<=q;i++){
        int u,v;
        cin>>u>>v;
        int act = cnt[u];
        if(cnt[u] > cnt[v]){
            swap(u,v);
        }
        if(cnt[u] > limit){
            idx[i].type = true;
            idx[i].act = act - ext.count(uo(u,v));
            if(mp.count(make_pair(u,v))){
                idx[i].pos = mp[make_pair(u,v)];
                continue;
            }
            op1[++ty1] = make_pair(u,v);
            ps[++pnt] = u;
            ps[++pnt] = v;
            idx[i].pos = ty1;
            mp[make_pair(u,v)] = ty1;
        }else{
            idx[i].type = false;
            idx[i].act = act;
            if(mp1.count(make_pair(u,v))){
                idx[i].pos = mp1[make_pair(u,v)];
                continue;
            }
            op2[u].push_back(make_pair(v,++ty2));
            idx[i].pos = ty2;
            mp1[make_pair(u,v)] = ty2;
        }
    }
    sort(ps+1,ps+1+pnt);
    int tot = unique(ps+1,ps+1+pnt) - ps - 1;
    for(int i = 1;i<=tot;i++){
        pps[ps[i]] = i;
    }
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=tot;j++){
            if(ext.count(uo(i,ps[j]))){
                point[j][i] = 1;
            }
        }
    }
    for(int i = 1;i<=ty1;i++){
        ans1[i] = -(point[pps[op1[i].first]] & point[pps[op1[i].second]]).count();
    }
    for(int i = 1;i<=n;i++){
        
        for(pair<int,int> o2 : op2[i]){
            int at = o2.second,g = o2.first;
            for(int v : bian[i]){
                if(v == g || ext.count(uo(v,g))){
                    ans2[at]--;
                }
            }
        }
    }
    for(int i = 1;i<=q;i++){
        if(idx[i].type){
            cout<<idx[i].act + ans1[idx[i].pos]<<'\n';
        }else{
            cout<<idx[i].act + ans2[idx[i].pos]<<'\n';
        }
    }
}
/*
nblogm + qblogm <= 
*/
2024/12/11 22:57
加载中...