蓝桥杯小朋友排队java_[蓝桥杯][历届试题]小朋友排队 (C++代码)
#include
#define?maxn?100010
struct?data
{
int?num,cnt;
}A[maxn],temp[maxn];
int?n;
//long?long?ans;
long?long?ANS[100];
void?merge(int?L1,int?R1,int?L2,int?R2)
{
int?k=0,i=L1,j=L2;
while(i<=R1?&&?j<=R2)
{
if(A[i].num<=A[j].num)//如果A[i].num
{
A[i].cnt+=j-L2;
temp[k++]=A[i++];
}
else?if(A[i].num>A[j].num)//A[i,R1]都大于A[j]
{
A[j].cnt+=R1-i+1;
temp[k++]=A[j++];
}
}
//剩下上數組,那么剩下的元素都要移動下數組的元素個數
while(i<=R1)
{
A[i].cnt+=R2-L2+1;
temp[k++]=A[i++];
}
while(j<=R2)?temp[k++]=A[j++];?//剩下下數組,就不需要移動
for(i=0;i
}
void?mergeSort(int?L,int?R)
{
if(L
{
int?mid?=?(L+R)/2;
mergeSort(L,mid);
mergeSort(mid+1,R);
merge(L,mid,mid+1,R);
}
}
int?main(void)
{
//FILE?*in?=?fopen("input10.txt","r");
//fscanf(in,"%d",&n);
//for(int?i=0;i
scanf("%d",&n);
for(int?i=0;i
mergeSort(0,n-1);
for(int?i=0;i
{
long?long?s?=?A[i].cnt;
//ans+=s*(s+1)/2;
ANS[1]+=s*(s+1)/2;
int?length=1;
while(ANS[length]/10!=0)
{
ANS[length+1]+=ANS[length]/10;
ANS[length]%=10;
length++;
}
if(ANS[0]
}
//printf("%lld",ans);
for(int?i=ANS[0];i>=1;i--)?printf("%d",ANS[i]);
//printf("\n");
return?0;
}
總結
以上是生活随笔為你收集整理的蓝桥杯小朋友排队java_[蓝桥杯][历届试题]小朋友排队 (C++代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 服务端口查询,linux 怎
- 下一篇: C 语言 运算符怎么使用,详解C++编程