社区讨论
莫队TLE30pts求条(玄关)
P1494[国家集训队] 小 Z 的袜子参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m3ftghjq
- 此快照首次捕获于
- 2024/11/13 19:47 去年
- 此快照最后确认于
- 2025/11/04 14:48 4 个月前
RT,AC前30pts,后70pts全T。求助
CPP#include<bits/stdc++.h>
#define PII pair<int,int>
#define DB double
#define LL long long
#define comp complex<double>
#define int long long
//#define int __int128
//const int mod=1e9+7;
//const int mod=998244353;
const LL inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
const DB pi=acos(-1);
namespace FastIO{
inline int read(int mod=0){
int x=0,f=1;char ch=getchar();
if(mod==0){while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}}
else{while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x*10%mod+ch-48)%mod;ch=getchar();}}
return x*f;}
inline char cread(){char x;while(x==0||x==' '||x=='\n'||x=='\r')x=getchar();return x;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x==0)return;write(x/10),putchar(x%10+'0');}
}
using namespace FastIO;
using namespace std;
int n,m,blk;
struct Node{
int l,r;
int id,i,ans;
}q[50005];
int a[50005];
bool cmp(Node x,Node y){
if(x.id!=y.id)return x.id<y.id;
if(x.id&1){
if(x.l!=y.l)return x.l<y.l;
return x.r<y.r;
}
else{
if(x.l!=y.l)return x.l>y.l;
return x.r>y.r;
}
}
bool icmp(Node x,Node y){
return x.i<y.i;
}
int s[50005],ss[50005];
int sum(int x){
int res=0;
for(;x;x-=x&-x)
res+=ss[x];
return res;
}
void add(int x,int c){
int i=x;s[x]+=c;
for(;x<=n;x+=x&-x){
ss[x]-=(s[i]-c)*(s[i]-c-1)>>1;
ss[x]+=s[i]*(s[i]-1)>>1;
}
}
signed main(){
n=read(0),m=read(0),blk=sqrt(m);
for(int i=1;i<=n;++i)a[i]=read(0);
for(int i=1;i<=m;++i){
q[i].l=read(0),q[i].r=read(0);
q[i].id=(i-1)/blk+1,q[i].i=i;
}
sort(q+1,q+1+m,cmp);
int l=1,r=1;add(a[1],1);
for(int i=1;i<=m;++i){
if(q[i].l==q[i].r)continue;
while(r<q[i].r)++r,add(a[r],1);
while(l>q[i].l)--l,add(a[l],1);
while(l<q[i].l)add(a[l],-1),++l;
while(r>q[i].r)add(a[r],-1),--r;
q[i].ans=sum(n);
}
sort(q+1,q+1+m,icmp);
for(int i=1;i<=m;++i){
if(q[i].l==q[i].r){
printf("0/1\n");
continue;
}
int fz=q[i].ans,fm=(q[i].r-q[i].l+1)*(q[i].r-q[i].l)>>1;
int gcd=__gcd(fz,fm);fz/=gcd,fm/=gcd;
printf("%lld/%lld\n",fz,fm);
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...