记录编号 589410 评测结果 AAAAAAAAAA
题目名称 充电宝 最终得分 100
用户昵称 Gravatarflyfree 是否通过 通过
代码语言 C++ 运行时间 0.666 s
提交时间 2024-07-05 12:59:47 内存使用 126.66 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MAXN 4000005
  5. ll a[MAXN],used[MAXN],s[MAXN];
  6. ll n,ans,cnt;
  7. struct node{
  8. ll l,r;
  9. }line[MAXN];
  10. bool cmp(node a,node b){
  11. return a.l<b.l;
  12. }
  13. ll lowbit(ll idx){
  14. return idx&(-idx);
  15. }
  16. ll ad_(ll idx,ll f){
  17. while(idx<=n){
  18. s[idx]+=f;
  19. idx+=lowbit(idx);
  20. }
  21. }
  22. ll re_(ll idx){
  23. ll ans=0;
  24. while(idx>0){
  25. ans+=s[idx];
  26. idx-=lowbit(idx);
  27. }
  28. return ans;
  29. }
  30. int main(){
  31. freopen("charger.in","r",stdin);
  32. freopen("charger.out","w",stdout);
  33. cin>>n;
  34. for(int i=1;i<=n;i++){
  35. cin>>a[i];
  36. if(!used[a[i]]){
  37. used[a[i]]=i;
  38. }else{
  39. line[++cnt].l=used[a[i]],line[cnt].r=i;
  40. used[a[i]]=i;
  41. ad_(i,1);
  42. }
  43. }
  44. sort(line+1,line+1+cnt,cmp);
  45. line[cnt+1].l=n,line[cnt+1].r=n;
  46. ll num=1;
  47. for(int i=1;i<n;i++){
  48. while(num<=cnt){
  49. if(line[num].l<i){
  50. ad_(line[num].r,0-1);
  51. num++;
  52. }else break;
  53. }
  54. if(line[num].l==i){
  55. ans+=line[num].r-i-re_(line[num].r);
  56. }else{
  57. ans+=n-i-re_(n);
  58. }
  59. }
  60. cout<<ans;
  61. return 0;
  62. }