比赛 2024暑假C班集训5 评测结果 EEAEEEEEEE
题目名称 充电宝 最终得分 10
用户昵称 flyfree 运行时间 1.591 s
代码语言 C++ 内存使用 43.88 MiB
提交时间 2024-07-05 10:20:34
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MAXN 1000005
  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){
  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. ll num=1;
  46. for(int i=1;i<n;i++){
  47. while(num<=cnt){
  48. if(line[num].l<i){
  49. ad_(line[num].r,-1);
  50. num++;
  51. }else break;
  52. }
  53. if(line[num].l==i){
  54. ans+=line[num].r-i-re_(line[num].r);
  55. }else{
  56. ans+=n-i-re_(n);
  57. }
  58. }
  59. cout<<ans;
  60. return 0;
  61. }