今儿练了一下莫队
先是死活过不了样例,后面是一直 t
大概调了半小时
直接全文匹配正确代码
最后发现几个不易察觉的错误
我想看和做算法是截然不同的概念
不去真正的敲一遍是做不出一类题的
对于本题小B的询问
排序方法是 若右端点在同一个块,则以左端点从小到大,否则右端点总小到大
还有inline要尽量加上
还有l要置1,r置0
中途sort还给加了n参数,很伤
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[50005],b[50005],anss[50005];
ll block;
ll ans=0;
struct node {
ll l,r,id;
}p[50005];
bool cmp(node x,node y){
return (x.r/block)==(y.r/block)?x.l<y.l:x.r<y.r;//(((x.l/block)&1)?x.r<y.r:x.r>y.r)
}
inline void add(int x){
b[a[x]]++;
ans+=b[a[x]]*2-1;
}
inline void del(int x){
b[a[x]]--;
ans-=b[a[x]]*2+1;
}
int main(){
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
block=sqrt(n);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<=m;i++){
scanf("%lld%lld",&p[i].l,&p[i].r);
p[i].id=i;
}
sort(p+1,p+m+1,cmp);
int l=1,r=0;
for(ll i=1;i<=m;i++){
while(l<p[i].l){
del(l);
l++;
}
while(l>p[i].l){
l--;
add(l);
}
while(r<p[i].r){
r++;
add(r);
}
while(r>p[i].r){
del(r);
r--;
}
anss[p[i].id]=ans;
}
for(ll i=1;i<=m;i++){
printf("%lld\n",anss[i]);
}
return 0;
}
这个排序方法还需斟酌
如果排还是会T