过了,但是不理解
查看原帖
过了,但是不理解
858145
hdmgydkn楼主2024/11/26 08:20

没过的代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <utility>
#define N 500000005
using namespace std;
vector<pair<pair<size_t,size_t>,size_t>> vec;
size_t n,m,va[N],buck[N],blg,l,r,i=1,j=0,ans,sum;
void update(size_t pos,long va){
    if(buck[pos]>1) ans-=buck[pos]*(buck[pos]-1)/2;
    buck[pos]+=va;
    // for(size_t i=1;i<=n;i++)
    //     cout<<buck[i]<<' ';
    // cout<<endl;
    if(buck[pos]>1)ans+=buck[pos]*(buck[pos]-1)/2;
    sum+=va;
}
size_t gcd(size_t a,size_t b){
    if(!b) return a;
    return gcd(b,a%b);
}
void get_ans(size_t up,size_t down){
    if(!down){
        cout<<"0/1"<<endl;
        return;
    }
    size_t gd=gcd(up,down);
    if(gd==0){cout<< "WTH"<<endl;return;}
    up/=gd,down/=gd;
    cout<<up<<'/'<<down<<endl;
}
size_t ans1[N],ans2[N];
int main(){
    //reopen("/Users/Downloads/P1494_1.in","r",stdin);
    cin>>n>>m;
    // cout<<n<<m<<endl;
    for(size_t i=1;i<=n;i++)
        cin>>va[i];
    blg=sqrt(n);
    if(!blg) blg=1;
    for(size_t i=1;i<=m;i++){
        cin>>l>>r;
        vec.push_back({{l,r},i});
    }
    // cout<<"INN"<<endl;
    size_t jud;
    sort(vec.begin(),vec.end(),[jud](const pair<pair<size_t,size_t>,size_t>& p1,const pair<pair<size_t,size_t>,size_t>& p2)mutable->bool{
        if((jud=(p1.first.first-1)/blg+1)==(p2.first.first-1)/blg+1) return ((p1.first.second<p2.first.second)^(jud&1));
        return p1.first.first<p2.first.first;
    });
    // cout<<"In"<<endl;
    // for(size_t i=0;i<m;i++){
    //     cout<<"lr"<<vec[i].first<<' '<<vec[i].second<<endl;
    // }
    for(size_t w=0;w<m;w++){
        // cout<<ans<<endl;
        if(vec[w].first.first==vec[w].first.second){
            ans1[vec[w].second]=0;
            ans2[vec[w].second]=1;
            continue;
        }
        while(j<vec[w].first.second) update(va[++j],1);
        while(j>vec[w].first.second) update(va[j--],-1);
        while(i<vec[w].first.first) update(va[i++],-1);
        while(i>vec[w].first.first) update(va[--i],+1);
        ans1[vec[w].second]=ans;
        ans2[vec[w].second]=sum*(sum-1)/2;
        // get_ans(ans,sum*(sum-1)/2);
    }
    for(size_t i=1;i<=m;i++){
        get_ans(ans1[i],ans2[i]);
    }
    return 0;
}

我把其中的

sort(vec.begin(),vec.end(),[jud](const pair<pair<size_t,size_t>,size_t>& p1,const pair<pair<size_t,size_t>,size_t>& p2)mutable->bool{
        if((jud=(p1.first.first-1)/blg+1)==(p2.first.first-1)/blg+1) return ((p1.first.second<p2.first.second)^(jud&1));
        return p1.first.first<p2.first.first;
    });

中的小于号都改为<=,如下

sort(vec.begin(),vec.end(),[jud](const pair<pair<size_t,size_t>,size_t>& p1,const pair<pair<size_t,size_t>,size_t>& p2)mutable->bool{
        if((jud=(p1.first.first-1)/blg+1)==(p2.first.first-1)/blg+1) return ((p1.first.second<=p2.first.second)^(jud&1));
        return p1.first.first<=p2.first.first;
    });

然后就过了? 为啥。

2024/11/26 08:20
加载中...