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 }

 

转载于:https://www.cnblogs.com/Hug-Sea/articles/2494871.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值