| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:我什么wa了啊In Reply To:我什么wa了啊 Posted by:zw7840 at 2010-02-19 21:32:19 給组数据也好
下面是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long n,head[50]={0},totm=0;
long long answer[505]={0};
struct case1
{
long long amount;
long long sum_amount;
long num;
long use;
long child[2];
}treap[500005]={{0,0,0,0,{0}}};
void set(long *p,long num,long long amount)
{
treap[++totm].amount=treap[totm].sum_amount=amount;
treap[totm].num=num;
treap[totm].use=rand();
treap[totm].child[0]=treap[totm].child[1]=0;
*p=totm;
}
void turn(long *p,long flag)
{
long now=*p,t;
t=treap[now].child[flag];
treap[now].child[flag]=treap[t].child[flag^1];
treap[t].child[flag^1]=now;
treap[now].sum_amount=treap[now].amount+treap[treap[now].child[0]].sum_amount+treap[treap[now].child[1]].sum_amount;
treap[t].sum_amount=treap[t].amount+treap[now].sum_amount+treap[treap[t].child[flag]].sum_amount;
*p=t;
}
long long insert(long *p,long num,long long amount)
{
long now=*p;
long long s=0;
if(!now)
{
set(p,num,amount);
return 0;
}
if(num==treap[now].num)
{
treap[now].amount+=amount;
treap[now].sum_amount+=amount;
return treap[treap[now].child[0]].sum_amount;
}
else if(num<treap[now].num)
{
s=insert(&treap[now].child[0],num,amount);
treap[now].sum_amount+=amount;
if(treap[treap[now].child[0]].use<treap[now].use)
turn(p,0);
}
else
{
s=insert(&treap[now].child[1],num,amount)+treap[now].amount+treap[treap[now].child[0]].sum_amount;
treap[now].sum_amount+=amount;
if(treap[treap[now].child[1]].use<treap[now].use)
turn(p,1);
}
return s;
}
void add(long long a[55],long long b)
{
long i;
a[0]+=b;
for(i=0;i<=50;i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
}
void work()
{
long number,i,j;
long long last;
totm=0;
for(i=1;i<=4;i++)
head[i]=0;
for(i=0;i<=50;i++)
answer[i]=0;
for(i=1;i<=n;i++)
{
scanf("%ld",&number);
for(j=1,last=1;j<=4;j++)
last=insert(&head[j],number,last);
add(answer,last);
}
for(i=50;!answer[i]&&i>0;i--);
for(;i>=0;i--)
printf("%I64d",answer[i]);
printf("\n");
}
int main()
{
for(srand((unsigned)time(NULL));scanf("%ld",&n)!=EOF;work());
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator