| ||||||||||
| 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 | |||||||||
为什么gcc跑的比Pascal还慢!PASCAL:
const
nmax = 100000;
type
keytype = int64;
rangetree = record
l,r : longint;
key,delta : keytype;
end;
var
cmd : char;
tree : array[1..nmax+nmax] of rangetree;
n,q : longint;
i,a,b,c : longint;
key : array[1..nmax] of keytype;
procedure maketree(k : longint);
begin
if tree[k].l < tree[k].r then begin
tree[k+k].l := tree[k].l; tree[k+k+1].r := tree[k].r;
tree[k+k].r := (tree[k].l+tree[k].r) shr 1; tree[k+k+1].l := tree[k+k].r+1;
maketree(k+k); maketree(k+k+1);
tree[k].key := tree[k+k].key+tree[k+k+1].key;
end
else tree[k].key := key[tree[k].l];
end;
procedure settle(k : longint; x : keytype);
begin
inc(tree[k].key,(tree[k].r-tree[k].l+1)*x); inc(tree[k].delta,x);
end;
procedure refresh(k : longint);
begin
if tree[k].l <> tree[k].r then begin
settle(k+k,tree[k].delta); settle(k+k+1,tree[k].delta);
end;
tree[k].delta := 0;
end;
procedure modify(k,a,b : longint; c : keytype);
begin
if (a <= tree[k].r) and (b >= tree[k].l) then begin
if (a <= tree[k].l) and (b >= tree[k].r) then begin
settle(k,c);
end
else begin
refresh(k);
modify(k+k,a,b,c); modify(k+k+1,a,b,c);
tree[k].key := tree[k+k].key+tree[k+k+1].key;
end;
end;
end;
function ask(k,a,b : longint) : keytype;
begin
if (a > tree[k].r) or (b < tree[k].l) then ask := 0
else if (a <= tree[k].l) and (b >= tree[k].r) then begin
ask := tree[k].key;
end
else begin
refresh(k);
ask := ask(k+k,a,b)+ask(k+k+1,a,b);
end;
end;
begin
readln(n,q);
for i := 1 to n do read(key[i]); readln;
tree[1].l := 1; tree[1].r := n;
maketree(1);
for i := 1 to q do begin
read(cmd);
if cmd = 'C' then begin
readln(a,b,c); modify(1,a,b,c);
end
else begin
readln(a,b); writeln(ask(1,a,b));
end;
end;
close(input); close(output);
end.
GCC:
#include <stdio.h>
#define nmax 150000
typedef long long keytype;
typedef struct sRangeTree
{
int l,r;
keytype key,delta;
}rangetree;
int key[nmax],n,q;
rangetree tree[nmax+nmax];
char buffer[255];
void maketree(int k)
{
if(tree[k].l==tree[k].r)
tree[k].key=key[tree[k].l];
else
{
tree[k+k].l=tree[k].l; tree[k+k+1].r=tree[k].r;
tree[k+k].r=(tree[k].l+tree[k].r)>>1; tree[k+k+1].l=tree[k+k].r+1;
maketree(k+k); maketree(k+k+1);
tree[k].key=tree[k+k].key+tree[k+k+1].key;
}
}
void settle(int k,keytype delta)
{
tree[k].delta+=delta;
tree[k].key+=delta*(tree[k].r-tree[k].l+1);
}
void refresh(int k)
{
if(tree[k].l<tree[k].r)
{
settle(k+k,tree[k].delta);
settle(k+k+1,tree[k].delta);
}
tree[k].delta=0;
}
void modify(k,a,b,c)
int k,a,b; keytype c;
{
if(a<=tree[k].r && b>=tree[k].l)
{
if(a<=tree[k].l && b>=tree[k].r)
settle(k,c);
else
{
refresh(k);
modify(k+k,a,b,c); modify(k+k+1,a,b,c);
tree[k].key=tree[k+k].key+tree[k+k+1].key;
}
}
}
keytype ask(k,a,b)
int k,a,b;
{
if(a>tree[k].r || b<tree[k].l) return 0;
if(a<=tree[k].l && b>=tree[k].r) return tree[k].key;
refresh(k);
return ask(k+k,a,b)+ask(k+k+1,a,b);
}
int main(int argc, char *argv[])
{
scanf("%d%d",&n,&q);
register int i;
for(i=1; i<=n; scanf("%d",&key[i++]))
;
gets(&buffer);
tree[1].l = 1; tree[1].r = n; maketree(1);
char cmd; int a,b; keytype c;
for(i=1; i<=q; i++)
{
scanf("%c",&cmd);
if(cmd=='Q')
{
scanf("%d%d",&a,&b); gets(&buffer);
printf("%lld\n",ask(1,a,b));
}
else
{
scanf("%d%d%lld",&a,&b,&c); gets(&buffer);
modify(1,a,b,c);
}
}
fclose(stdin); fclose(stdout);
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator