| ||||||||||
| 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:我用线段树,为什么会超时呢?是不是进入死循环了?In Reply To:我用线段树,为什么会超时呢?是不是进入死循环了? Posted by:elendtest at 2010-02-06 13:09:59 太暴力了,优化一下
> #include <stdio.h>
>
> #define MAXN 410000
>
> struct Node
> {
> __int64 sum ;
> int begin, end ;
> Node () {sum = 0 ; begin = end = 0 ;}
> } tree[MAXN] ;
>
>
> void Build (int subroot, int b, int e)
> {
> tree[subroot].begin = b ;
> tree[subroot].end = e ;
> if (b < e)
> {
> int mid = (b + e) / 2 ;
> Build (2 * subroot, b, mid) ;
> Build (2 * subroot + 1, mid + 1, e) ;
> }
> }
>
> void Insert (int subroot, int b, int e, int value)
> {
>
> tree[subroot].sum += value * (e - b + 1) ;
> if (tree[subroot].begin < tree[subroot].end)
> {
> int mid = (tree[subroot].begin + tree[subroot].end) / 2 ;
> if (e <= mid) Insert (2 * subroot, b, e, value) ;
> else if (b > mid) Insert (2 * subroot + 1, b, e, value) ;
> else
> {
> Insert (2 * subroot, b, mid, value) ;
> Insert (2 * subroot + 1, mid + 1, e, value) ;
> }
> }
> }
>
> __int64 Query (int subroot, int b, int e)
> {
> if (tree[subroot].begin == b && tree[subroot].end == e)
> return tree[subroot].sum ;
> else
> {
> int mid = (tree[subroot].begin + tree[subroot].end) / 2 ;
> if (e <= mid) return Query (2 * subroot, b, e) ;
> else if (b > mid) return Query (2 * subroot + 1, b, e) ;
> else
> return Query (2 * subroot, b, mid) + Query (2 * subroot + 1, mid + 1, e) ;
> }
> }
>
> int main ()
> {
> int N, Q, a, b, c, i, temp ;
> int root = 1 ;
> char choice[10] ; ;
>
> scanf ("%d%d", &N, &Q) ;
> Build (root, 1, N) ;
>
> for (i = 1 ; i <= N ; i++)
> {
> scanf ("%d", &temp) ;
> Insert (root, i, i, temp) ;
> }
>
> while (Q--)
> {
> getchar () ;
> scanf ("%s", choice) ;
> if (choice[0] == 'Q')
> {
> scanf ("%d%d", &a, &b) ;
> printf ("%I64d\n", Query (root, a, b)) ;
> }
> else
> {
> scanf ("%d%d%d", &a, &b, &c) ;
> Insert (root, a, b, c) ;
> }
> }
>
> return 0 ;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator