| ||||||||||
| 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