首页 > 其他 > 详细

P1637 三元上升子序列

时间:2019-08-29 00:57:48      阅读:67      评论:0      收藏:0      [点我收藏+]

题面

https://www.luogu.org/problem/P1637

题解

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
  int x,val;
  bool operator < (const node rhs) const {
    return val<rhs.val;
  }
} a[30500];
int tree[30500],f[30500],n;

long long cha(int x){
  int i;
  long long sum=0;
  for (i=x;i>=1;i-=i&(-i)) sum+=tree[i];
  return sum;
}

void add(int x,int s){
  for (int i=x;i<=n;i+=i&(-i)) tree[i]+=s;
}

int main(){
  int x,i,j;
  scanf("%d",&n);
  for (i=1;i<=n;i++) {
    scanf("%d",&x);
    a[i]=(node){i,x};
  }
  sort(a+1,a+n+1);
  long long ans=0,xx;
  for (i=1;i<=n;i++) {
    for (j=i;a[j].val==a[i].val;j++) {
      xx=cha(a[j].x);
      f[j]=xx;
    }
    for (j=i;a[j].val==a[i].val;j++) add(a[j].x,1);
    i=j-1;
  }
  memset(tree,0,sizeof(tree));

  for (i=1;i<=n;i++) {
    for (j=i;a[j].val==a[i].val;j++) {
      xx=cha(a[j].x);
      ans+=xx;
    }
    for (j=i;a[j].val==a[i].val;j++) add(a[j].x,f[j]);
    i=j-1;
  }
  cout<<ans<<endl;
  return 0;
}

 

P1637 三元上升子序列

原文:https://www.cnblogs.com/shxnb666/p/11427381.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!