• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Hug_Sea
博客园    首页    新随笔    联系   管理    订阅  订阅

2746 Problem F: Actualist - 离散化

题意:区间染色,求染色次数大于等于k的长度。

思路:因为n的范围比较小,直接离散化。----经典好题!!

题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2746

例:

 

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <string>
 5 #include <algorithm>
 6 #include <iostream>
 7 #include <map>
 8 using namespace std;
 9 const int N=10010;
10 const int inf=100000000;
11 
12 typedef struct In{
13     int x;
14     int y;
15     char op[2];
16 }In;
17 In c[N];
18 int sum[N];
19 map<int,int>mp;
20 map<int,int>::iterator it;
21 int par[N];
22 
23 int main(){
24     
25 //    freopen("data.in","r",stdin);
26 //    freopen("data.out","w",stdout);
27     
28     int i,j,n,k,y;
29     while(scanf("%d%d",&n,&k),n||k){
30         mp.clear();
31         memset(sum,0,sizeof(sum));
32         for(i=1;i<=n;i++){
33             scanf("%d%d%s",&c[i].x,&c[i].y,c[i].op);
34             if(c[i].x>c[i].y) swap(c[i].x,c[i].y);
35             mp[c[i].x]=1;
36             mp[c[i].y]=1;
37         }
38         mp[-inf]=1;
39         mp[inf]=1;
40         for(i=1,it=mp.begin();it!=mp.end();it++,i++){
41             it->second=i;
42             par[i]=it->first;
43         }
44         int z=i;
45         for(i=1;i<=n;i++){
46             if(c[i].op[0]=='<'){
47                 y=mp[c[i].y];
48                 for(j=mp[c[i].x];j<y;j++)    //注意!若直接写成j<mp[c[i].y](不要y);会超时!! 
49                     sum[j]++;                //题限3s,AC时间0.16s,坑爹的超时- -! 
50             }
51             else{
52                 y=mp[c[i].x];
53                 for(j=1;j<y;j++) sum[j]++;    //与上面情况相同 
54                 y=mp[c[i].y];
55                 for(j=y;j<z;j++) sum[j]++;    //与上面情况相同 
56             }
57         }
58         int ans=0;
59         for(i=1;i<z-1;i++){
60             if(sum[i]>=k)
61                 ans+=par[i+1]-par[i];
62         }
63         printf("%d\n",ans);
64     }
65     return 0;
66 }

 

posted @ 2012-05-10 19:40  Hug_Sea  阅读(121)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3