poj 2528 Mayor's posters 线段树+离散化

本文详细介绍了如何使用C++语言实现复杂的数据结构(如二叉树、队列、栈等)和算法(如排序、动态规划等),并通过实例展示这些数据结构和算法在实际问题解决中的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio> #include<cstdlib> #include<cstring> int seq[10010][2],ans; bool visit[10010]; struct Line{ int begin; int num;//表示其为第几张海报的首尾,首位负,尾为正 }line[20010]; struct Tree{ int s; int t; int c; }tree[80010]; int cmp(const void * a,const void *b){ struct Line *aa=(struct Line *) a; struct Line *bb=(struct Line *) b; return aa->begin-bb->begin; } void build(int s,int t,int id){ tree[id].s=s; tree[id].t=t; tree[id].c=0; if(s!=t){ int mid=(tree[id].s+tree[id].t)>>1; build(s,mid,id*2); build(mid+1,t,id*2+1); } } void insert(int s,int t,int id,int colour){ if(tree[id].s==s && tree[id].t==t){ tree[id].c=colour; return ; }//否则的话从s到t的线段一定在tree[id]所表示的线段之内 if(tree[id].c>0 && tree[id].c!=colour){ tree[id*2].c=tree[id].c; tree[id*2+1].c=tree[id].c; tree[id].c=0; } int mid=(tree[id].s+tree[id].t)>>1; if(mid<s) insert(s,t,id*2+1,colour); else if(mid>=t) insert(s,t,id*2,colour); else{ insert(s,mid,id*2,colour); insert(mid+1,t,id*2+1,colour); } } void search(int id){ if(tree[id].c!=0){ if(visit[tree[id].c]==false){ ans++; visit[tree[id].c]=true; } return; } if(tree[id].s!=tree[id].t){ search(id*2); search(id*2+1); } } int main(){ int n,i,t,T; scanf("%d",&T); for(t=1;t<=T;t++){ scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d %d",&seq[i][0],&seq[i][1]); line[2*i-1].begin=seq[i][0]; line[2*i-1].num=-i; line[2*i].begin=seq[i][1]; line[2*i].num=i; } qsort(&line[1],2*n,sizeof(line[1]),cmp); int temp=line[1].begin,tp=1; for(i=1;i<=2*n;i++){ if(line[i].begin!=temp){ tp++; temp=line[i].begin; } if(line[i].num<0) seq[-line[i].num][0]=tp; else seq[line[i].num][1]=tp; }//离散化 build(1,tp,1); for(i=1;i<=n;i++){ insert(seq[i][0],seq[i][1],1,i); } ans=0; memset(visit,false,sizeof(visit)); search(1); printf("%d\n",ans); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值