Mayors posters(线段树之点的成段更新加离散化)

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <set>#include <queue>#include <vector>#include <cstdlib>#include <algorithm>#define ls u << 1#define rs u << 1 | 1#define lson l, mid, u << 1#define rson mid + 1, r, u << 1 | 1#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const int M = 2e4 + 100;const int N = 1e7 + 100;int tmp[M << 2],vis[M],get_hash[N],a[M];struct Node{int l,r;void readin(){scanf("%d %d",&l,&r);}}p[M];void pushdown(int u){if(tmp[u]){tmp[ls] = tmp[rs] = tmp[u];tmp[u] = 0;}}void pushup(int u){if(tmp[ls] == tmp[rs]){tmp[u] = tmp[ls];}}void update(int L,int R,int c,int l,int r,int u){int mid = (l + r) >> 1;if(L <= l && R >= r){tmp[u] = c;}else {pushdown(u);if(L <= mid) update(L,R,c,lson);if(R > mid) update(L,R,c,rson);pushup(u);}}void query(int l,int r,int u){if(tmp[u]){vis[tmp[u]] = 1;}else {int mid = (l + r) >> 1;query(lson);query(rson);}}int main(){//freopen("in","r",stdin);int T,n,l,r;cin>>T;while(T–){scanf("%d",&n);int to = 0;memset(vis,0,sizeof(vis));memset(tmp,0,sizeof(tmp));for(int i = 0; i < n; i++){p[i].readin();a[to++] = p[i].l;a[to++] = p[i].r;}sort(a,a + to);to = unique(a,a + to) – a;for(int i = 0; i < to; i++) get_hash[a[i]] = i + 1; //离散化过程for(int i = 0; i < n; i++){ //离散化过程int l,r;l = get_hash[p[i].l];r = get_hash[p[i].r];update(l,r,i + 1,1,to,1);}query(1,to,1);int num = 0;for(int i = 1; i <= n; i++) if(vis[i]) num++;printf("%d\n",num);}return 0;}

,旅行,其实是需要具有一些流浪精神的,

Mayors posters(线段树之点的成段更新加离散化)

相关文章:

你感兴趣的文章:

标签云: