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:nuciedh at 2007-06-28 09:00:59 > #include <cstdio> > #include <algorithm> > using namespace std; > > #define nocol -1 > #define mulcol -2 > > int n, p[10000][2], cn[20000]; > bool v[10001]; > int Len; > > struct segment > { > int l, r, col; > segment *lchild, *rchild; > void construct (int , int); > void insert (int ,int , int); > int find (); > }*root, tree[320010]; > > void segment :: construct (int left, int right) > { > if (left == right) {l = left; r= right; lchild = rchild = NULL; return;} > l = left; r = right; > lchild = &tree[Len ++]; rchild = &tree[Len ++]; > if (left + 1 < right) > { > lchild->construct (left, (left + right)/2); > rchild->construct ((left + right)/2 + 1, right); > } > else > { > lchild->construct (left, left); > rchild->construct (right, right); > } > } > > void segment :: insert (int left, int right, int k) > { > if (left <= cn[l] && cn[r] <= right) > { > col = k; > } > else > { > if (col != k) col = mulcol; > int mid = (l + r) / 2; > if (left <= cn[mid] && lchild) lchild->insert (left, right, k); > if (right >= cn[mid + 1] && rchild) rchild->insert (left, right, k); > } > } > > int segment :: find () > { > int tmp1, tmp2; > if (col >= 0 && !v[col]) {v[col] = true; return 1;} > > if (col == nocol || v[col]) return 0; > else if (col == mulcol) > { > tmp1 = tmp2 = 0; > if (lchild) tmp1 += lchild->find (); > if (rchild) tmp2 += rchild->find (); > return tmp1 + tmp2; > } > } > > void solve () > { > int i, j, k, num; > scanf ("%d", &n); > for (i = 0, j = 0; i < n; i ++) > { > scanf ("%d %d", &p[i][0], &p[i][1]); > cn[j ++] = p[i][0]; cn[j ++] = p[i][1]; > } > num = j; > sort(cn, cn + num); > int tmp; 你下面这里的程序是O(n^2)的,很慢,在这超时了,另外你的程序结果也不对 > for (i = 0; i < num; i ++) > { > for (j = i + 1; j < num; j ++) > if (cn[i] != cn[j]) break; > tmp = j - i - 1; > for (; j < num; j ++) > cn[j - tmp] = cn[j]; > num -= tmp; > } > Len = 0; > root = &tree[Len ++]; > root->construct(0, num - 1); > root->col = -1; > for (i = 0; i < n; i ++) > { > root->insert (p[i][0], p[i][1], i); > } > memset (v, false, sizeof (v)); > > int sum = root->find (); > printf ("%d\n", sum); > } > > int main () > { > int c; > scanf ("%d", &c); > while (c --) > solve (); > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator