A - 三元上升子序列
#include <bits/stdc++.h>
#define int long long int
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
int n;
int a[N], tr[N];
PII p[N];
int lowbit(int x)
{
return x & -x;
}
void add(int id, int c)
{
for(int i = id; i <= N; i += lowbit(i))
tr[i] += c;
}
int sum(int id)
{
int ans = 0;
for(int i = id; i; i -= lowbit(i))
ans += tr[i];
return ans;
}
int query(int l, int r)
{
return (sum(r) - sum(l - 1));
}
void sovle()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> a[i];
for(int i = 1; i <= n; i ++)
{
add(a[i], 1);
p[i].first = query(1, a[i] - 1);
}
memset(tr, 0, sizeof tr);
for(int i = n; i; i --)
{
add(a[i], 1);
p[i].second = query(a[i] + 1, N);
}
int ans = 0;
for(int i = 1; i <= n; i ++)
ans += (1LL * p[i].first * p[i].second);
cout << ans << endl;
}
signed main(void)
{
IOS;
int t;
t = 1;
while(t --)
sovle();
}
#include<cstdio>
#include<iostream>
using namespace std;
int n,a[500010],c[500010];
long long ans;
void msort(int b,int e)//归并排序
{
if(b==e)
return;
int mid=(b+e)/2,i=b,j=mid+1,k=b;
msort(b,mid),msort(mid+1,e);
while(i<=mid&&j<=e)
if(a[i]<=a[j])
c[k++]=a[i++];
else
c[k++]=a[j++],ans+=mid-i+1;//统计答案
while(i<=mid)
c[k++]=a[i++];
while(j<=e)
c[k++]=a[j++];
for(int l=b;l<=e;l++)
a[l]=c[l];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
msort(1,n);
printf("%lld",ans);
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;//虽然不知道这题不开long long会不会见祖宗,但保险起见还是开一下吧
ll tree[1000005];//树状数组
int n;
//树状数组的“老三件”:lowbit,修改,求和
int lowbit(int x){
return x&-x;
}
void update(int x,int y){
while(x<=n){
tree[x]+=y;
x+=lowbit(x);
}
}
ll query(int x){
ll sum=0;
while(x){
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
const ll wyx=998244353;//懒人专用
ll jc[1000005]={1,1};//存阶乘的数组
int a[1000005];//存数的
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){//预处理阶乘数组和树状数组
jc[i]=(jc[i-1]*i)%wyx;
update(i,1);
}
ll ans=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ans=(ans+((query(a[i])-1)*jc[n-i])%wyx)%wyx;//计算ans
update(a[i],-1);//把a[i]变成0(原来是1,减1不就是0嘛)
}
printf("%lld",ans+1);//别忘了+1
return /*2333333333*/ 0;
}