样例不过求调。
查看原帖
样例不过求调。
1296826
lcfollower楼主2024/8/23 16:37

rt。。。

当 nm=0\frac{n}{\sqrt{m}} = 0 的时候会 RE,但是先不要管。(

# include <bits/stdc++.h>

#define int long long
#define rint register int
#define YOU_AK_IOI exit(0);

using namespace std;

const int N = 5e4 + 10;
int n ,Q ,res ,a[N] ,block[N] ,cnt[N];
int ans[N];
struct queries{
  int l ,r ,id;
  queries() {}
  inline bool operator <(const queries &x) const {
    if(block[l] ^ block[x.l]) return block[l] < block[x.l];
    else if(block[l] & 1) return r < x.r;
    else return r > x.r;
  }
}q[N];
inline void add(int x){
  res -= cnt[a[x]] * cnt[a[x]];
  ++ cnt[a[x]];
  res += cnt[a[x]] * cnt[a[x]]; 
} inline void del(int x){
  res -= cnt[a[x]] * cnt[a[x]];
  -- cnt[a[x]];
  res += cnt[a[x]] * cnt[a[x]];
} signed main(){
  scanf("%lld %lld" ,&n ,&Q);
  int len = n / sqrt(Q);
  for(rint i = 1 ;i <= n;i ++)
    scanf("%lld", a + i) ,block[i] = (i - 1) / len + 1;
  for(rint i = 1; i <= Q;i ++){
    scanf("%lld %lld" ,&q[i].l ,&q[i].r);
    q[i].id = i;    
  } sort(q + 1 ,q + 1 + Q);
  int l = 1 ,r = 0;
  for(rint i = 1 ;i <= Q ;i ++){
    while(l > q[i].l) add(-- l);
    while(r < q[i].r) add(++ r);
    while(l < q[i].l) del(l ++);
    while(r > q[i].r) del(r --);
    ans[q[i].id] = res;
  } for(rint i = 1 ;i <= Q ;i ++) printf("%lld\n", ans[i]);
  YOU_AK_IOI
}
2024/8/23 16:37
加载中...