离散化很讲究,相邻差1,不相邻差2
例如这组数据 3 1 10 1 3 6 10 显然有三个poster可见,1-3,4-5,6-10 但排序离散化之后: 排序后:1 1 3 6 10 离散化后:1对应1,3对应2,6对应3,10对应4 原始数据的三个区间就变为: 1 4 1 2 3 4 结果可见的poster就只有两个,1-2,3-4。。。。。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; struct T { int num,id,flag,t; }s[20010]; int x[10001],y[10001],f[20010*2],n; bool flag[20010*2]; bool cmp(T a, T b) { return a.num<b.num; } int main() { int T; scanf("%d",&T); while(T--) { memset(flag,false,sizeof(flag)); memset(f,0,sizeof(f)); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&x[i],&y[i]); s[2*i].id=i; s[2*i].num=x[i]; s[2*i].flag=0; s[2*i+1].id=i; s[2*i+1].num=y[i]; s[2*i+1].flag=1; } sort(s,s+2*n,cmp); s[0].t=0; /*for(int i=1;i<2*n;i++) { if(s[i].num!=s[i-1].num) s[i].t=s[i-1].t+1; else s[i].t=s[i-1].t; }注意这是错误的,虽然能过*/ for(int i=1;i<2*n;i++) { if(s[i].num!=s[i-1].num) { if(s[i].num-1>s[i-1].num) s[i].t=s[i-1].t+2; else s[i].t=s[i-1].t+1; } else s[i].t=s[i-1].t; } for(int i=0;i<2*n;i++) { if(s[i].flag==0) x[s[i].id]=s[i].t; else y[s[i].id]=s[i].t; } for(int i=0;i<n;i++) for(int j=x[i];j<=y[i];j++) f[j]=i; int sum=0; for(int i=0;i<=s[2*n-1].t;i++) if(!flag[f[i]]) { flag[f[i]]=true; sum++; } printf("%d/n",sum); } return 0; }