| ||||||||||
| 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 | |||||||||
Re:离散化+暴力 141ms 内牛满面……(附代码及算法)In Reply To:离散化+暴力 141ms 内牛满面……(附代码及算法) Posted by:xk_00948124 at 2010-07-02 11:37:20 >
> /*
> 算法:离散化+暴力
> 首先输入所有线段,将它的起点终点排序,得到离散化的点
> 将离散化的点从头到尾走一遍,得到每条线段对应的离散点编号
> 对每条线段,更新离散点的上的颜色
> */
>
> #include <stdio.h>
> #include <memory.h>
> #include <stdlib.h>
> #define MAX 10020
>
> struct poster{
> int start;
> int end;
> }l[MAX];
>
> int posters[MAX][2];
>
> struct point{ //离散点
> int pos;
> int colour; //对应的
> }p[2*MAX];
>
> int cmp(const void* a, const void* b){
> struct point*p = (struct point*)a;
> struct point*q = (struct point*)b;
> return p->pos - q->pos;
> }
>
> int n;
> int colour[2*MAX]; //离散点的颜色
> int used[MAX]; //出现过的海报颜色
>
> int main(){
> int out;
> scanf("%d",&out);
> while(out--){
> memset(l,0,sizeof(l));
> memset(posters,0,sizeof(posters));
> memset(colour, -1, sizeof(colour));
> memset(used,0,sizeof(used));
>
> scanf("%d",&n);
> int i,counter=0;
> for(i=0; i<n; i++){
> scanf("%d%d",&posters[i][0],&posters[i][1]);
> p[counter].pos = posters[i][0];
> p[counter++].colour = -i;
> p[counter].pos = posters[i][1];
> p[counter++].colour = i;
> }
> //离散化
> qsort(p,counter,sizeof(point),cmp);
> int real_point=0;
> int last_pos = -1; //与所有点都不同
> for(i=0; i<counter; i++){
> if(last_pos != p[i].pos) real_point++, last_pos = p[i].pos;
> if(p[i].colour < 0 ) l[-p[i].colour].start = real_point-1; //离散点的编号
> else l[p[i].colour].end = real_point-1;
> }
>
> for(i=0; i<n; i++)
> for(int j=l[i].start; j<= l[i].end; j++)
> colour[j] = i;
> int ans=0;
> for(i=0; i<real_point; i++)
> if(!used[colour[i]]) ans++,used[colour[i]] = true;
>
> printf("%d\n",ans);
>
> }
> return 0;
> }
thank you
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator