题意:区间染色,求染色次数大于等于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 }