| ||||||||||
| 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 | |||||||||
线段树+离散化超时了 哪位帮忙看看 ?In Reply To:光是离散化会超时吧 Posted by:nuciedh at 2007-06-27 23:38:15 #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;
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