求ABC的G正解

学术版

莫队
by S00021 @ 2023-03-11 21:42:37


把莫队拍上去
by devans @ 2023-03-11 21:42:40


预处理组合数+莫队板子
by 2949767807qwer @ 2023-03-11 21:43:12


莫队
by Esawkm @ 2023-03-11 21:43:21


@[2949767807qwer](/user/577066) 所以可以帮我看看哪里有问题吗 ```cpp #include<bits/stdc++.h> using namespace std; int n,m,bl,nl=1,nr,cnt[100001],a[100001],ans[100001]; struct ask{ int l,r,id; }q[100001]; set<int> se; bool cmp(ask a,ask b){ if(a.l/bl==b.l/bl) return a.r<b.r; else return a.l<b.l; } void add(int pos){ if((++cnt[a[pos]])==1){ se.insert(a[pos]); } } void del(int pos){ if(!(--cnt[a[pos]])){ se.erase(a[pos]); } } int C(int x){ return x*(x-1)*(x-2)/6; } int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>m; bl=sqrt(n); for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=m;i++){ cin>>q[i].l>>q[i].r; q[i].id=i; } sort(q+1,q+1+m,cmp); for(int i=1;i<=m;i++){ int L=q[i].l,R=q[i].r; while(nl<L){ del(nl); nl++; } while(nl>L){ nl--; add(nl); } while(nr<R){ nr++; add(nr); } while(nr>R){ del(nr); nr--; } int sum=0; for(set<int>::iterator it=se.begin();it!=se.end();it++){ int k=*it; //cout<<k<<","<<cnt[k]<<","<<C(cnt[k])<<" "; if(cnt[k]>=3) sum+=C(cnt[k]); } ans[q[i].id]=sum; //cout<<q[i].id<<"="<<sum<<endl; } for(int i=1;i<=m;i++){ cout<<ans[i]<<endl; } return 0; } ```
by luqyou @ 2023-03-11 21:44:38


莫队。
by _Ad_Astra_ @ 2023-03-11 21:45:07


不会超时吗?
by DaiRuiChen007 @ 2023-03-11 21:45:13


~~你对着P1494打一遍准没错~~
by Hell0_W0rld @ 2023-03-11 21:45:17


@[luqyou](/user/464732) 数据范围2e5你数组1e5。。。
by Hell0_W0rld @ 2023-03-11 21:45:52


@[luqyou](/user/464732) 你这莫队复杂度是假的吧 考虑 $$ \dfrac{(k+1)k(k-1)}{6}=\dfrac{k(k-1)(k-2)}{6}+\dfrac{k(k-1)}{2} $$
by bykem @ 2023-03-11 21:46:03


| 下一页