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:我的程序能过,但还是WAIn Reply To:我的程序能过,但还是WA Posted by:kensin2 at 2008-10-30 11:10:55 > #include <stdio.h> > #define N 100000 > > int n; > __int64 total; > > struct node > { > __int64 sum; > int addPerElmt; > }; > > struct node line_tree[4 * N + 3]; > > void build_tree(int q, int left, int right); > > void update(int q, int left, int right, int li, int ri, int value); > > void question(int q, int left, int right, int li, int ri); > > int main() > { > int qn; > int i; > int tmp; > char tc; > int begin, end, add; > > scanf("%d %d", &n, &qn); > build_tree(0, 1, n); > for (i = 1; i <= n; i++) > { > scanf("%d", &tmp); > update(0, 1, n, i, i, tmp); > } > > for (i = 0; i < qn; i++) > { > getchar(); > scanf("%c", &tc); > if (tc == 'C') > { > scanf("%d %d %d", &begin, &end, &add); > update(0, 1, n, begin, end, add); > } > else > { > scanf("%d %d", &begin, &end); > total = 0; > question(0, 1, n, begin, end); > printf("%I64d\n", total); > } > } > > return 0; > } > > void build_tree(int q, int left, int right) > { > int mid = (left + right) >> 1; > > line_tree[q].addPerElmt = 0; > line_tree[q].sum = 0; > > if (left < right) > { > build_tree(q * 2 + 1, left, mid); > build_tree(q * 2 + 2, mid + 1, right); > } > } > > void update(int q, int left, int right, int li, int ri, int value) > { > int mid = (left + right) >> 1; > > if (left == li && right == ri) > { > line_tree[q].addPerElmt += value; > line_tree[q].sum += (ri - li + 1) * value; > > return; > } > > line_tree[q].sum += (ri - li + 1) * value; > > if (li <= mid) > { > if (ri <= mid) > { > update(q * 2 + 1, left, mid, li, ri, value); > } > else > { > update(q * 2 + 1, left, mid, li, mid, value); > update(q * 2 + 2, mid + 1, right, mid + 1, ri, value); > } > } > else > update(q * 2 + 2, mid + 1, right, li, ri, value); > } > > void question(int q, int left, int right, int li, int ri) > { > int mid = (left + right) >> 1; > > if (left == li && right == ri) > { > total += line_tree[q].sum; > return; > } > > if (line_tree[q].addPerElmt) > total += line_tree[q].addPerElmt * (ri - li + 1); > > if (li <= mid) > { > if (ri <= mid) > { > question(q * 2 + 1, left, mid, li, ri); > } > else > { > question(q * 2 + 1, left, mid, li, mid); > question(q * 2 + 2, mid + 1, right, mid + 1, ri); > } > } > else > question(q * 2 + 2, mid + 1, right, li, ri); > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator