您的位置:首页 > 其它

Mayor's posters 【POJ - 2528】【线段树+离散化】

2019-07-26 13:52 134 查看

题目链接

 

  这道题主要处理的就是一个离散化加上区间查询的问题,因为这里空出来的点是比较的多的,所以我们可以离散化所有的点来维护这样的关系。

[code]#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 10005;
int N, bit[maxN<<1], cnt, diff, tree[maxN<<3];
bool cmp_bit(int e1, int e2) { return e1<e2; }
bool vis[maxN<<1];
int ans;
struct node
{
int l, r, id;
node(int a=0, int b=0, int c=0):l(a), r(b), id(c) {}
}a[maxN];
void init()
{
cnt=0;
ans=0;
memset(vis, false, sizeof(vis));
}
void buildTree(int rt, int l, int r)
{
tree[rt] = 0;
if(l == r) return;
int mid = (l + r)>>1;
buildTree(rt<<1, l, mid);
buildTree(rt<<1|1, mid+1, r);
}
void pushdown(int rt)
{
if(tree[rt])
{
tree[rt<<1] = tree[rt<<1|1] = tree[rt];
tree[rt] = 0;
}
}
void update(int rt, int l, int r, int ql, int qr, int val)
{
if(ql<=l && qr>=r)
{
tree[rt] = val;
return;
}
pushdown(rt);
int mid = (l + r)>>1;
if(ql<=mid) update(rt<<1, l, mid, ql, qr, val);
if(qr>mid) update(rt<<1|1, mid+1, r, ql, qr, val);
}
void query(int rt, int l, int r, int ql, int qr)
{
if(tree[rt])
{
if(!vis[tree[rt]]) ans++;
vis[tree[rt]] = true;
return;
}
if(l == r)
{
if(!vis[tree[rt]] && tree[rt]) ans++;
vis[tree[rt]] = true;
return;
}
int mid = (l + r)>>1;
query(rt<<1, l, mid, ql, mid);
query(rt<<1|1, mid+1, r, mid+1, qr);
}
int main()
{
int T;  scanf("%d", &T);
while(T--)
{
scanf("%d", &N);
init();
for(int i=1; i<=N; i++)
{
scanf("%d%d", &a[i].l, &a[i].r);
a[i].id = i;
bit[++cnt] = a[i].l;
bit[++cnt] = a[i].r;
}
sort(bit+1, bit+1+cnt, cmp_bit);
diff = (int)(unique(bit+1, bit+cnt+1) - bit - 1);
buildTree(1, 1, diff);
for(int i=1; i<=N; i++)
{
update(1, 1, diff, (int)(lower_bound(bit+1, bit+1+diff, a[i].l) - bit), (int)(lower_bound(bit+1, bit+1+diff, a[i].r) - bit), i);
}
query(1, 1, diff, 1, diff);
printf("%d\n", ans);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: