没过的代码如下:
#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;
});
然后就过了? 为啥。