关于typedef
  • 板块学术版
  • 楼主chenbinggang
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/6/17 21:35
  • 上次更新2023/11/4 21:47:13
查看原帖
关于typedef
141331
chenbinggang楼主2021/6/17 21:35
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,c[500010];
long long ans;//插入当前这个数在原序列的位置,然后往上更新,当要计算逆序对的时候,当前这个数等于多少就说明前面插入过多少个数 
struct point{
long long	val,num;
}a[500010];
inline bool cmp(point q,point w)
{
    if(q.val==w.val)
        return q.num<w.num;
    return q.val<w.val;
}
inline void insert(int p,int d)
{
    for(;p<=n;p+=p&-p)
        c[p]+=d; 
}
inline int query(int p)
{
    int sum=0;
    for(;p;p-=p&-p)
        sum+=c[p];
    return sum;
}
int main()
{
//	freopen("P1908.in","r",stdin);
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)
	scanf("%lld",&a[i].val),a[i].num=i;
sort(a+1,a+1+n,cmp);
for(long long i=1;i<=n;i++)
{
	insert(a[i].num,1);
	ans+=i-query(a[i].num);//已经包含自己 
}
 printf("%lld",ans);
 return 0;
 } 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef int ll;
ll n,c[500010],ans;//插入当前这个数在原序列的位置,然后往上更新,当要计算逆序对的时候,当前这个数等于多少就说明前面插入过多少个数 
struct point{
ll	val,num;
}a[500010];
inline bool cmp(point q,point w)
{
    if(q.val==w.val)
        return q.num<w.num;
    return q.val<w.val;
}
inline void insert(int p,int d)
{
    for(;p<=n;p+=p&-p)
        c[p]+=d; 
}
inline int query(int p)
{
    int sum=0;
    for(;p;p-=p&-p)
        sum+=c[p];
    return sum;
}
int main()
{
//	freopen("P1908.in","r",stdin);
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++)
	scanf("%lld",&a[i].val),a[i].num=i;
sort(a+1,a+1+n,cmp);
for(ll i=1;i<=n;i++)
{
	insert(a[i].num,1);
	ans+=i-query(a[i].num);//已经包含自己 
}
 printf("%lld",ans);
 return 0;
 } 

用了typedef50分,不用就AC了,不知道为什么 题号是P1908

2021/6/17 21:35
加载中...