一个问题
做题的时候碰到的,不太明白为什么。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4585
如果用我注释的写法就会超时,而我用注释上面的写法就会快很多,目前的猜测是set的lower_bound做了针对性的优化。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 set<int> s; 4 map<int,int> mp; 5 int main(){ 6 int n; 7 while(scanf("%d",&n) && n){ 8 s.clear(); 9 mp.clear(); 10 s.insert(1000000000); 11 mp[1000000000] = 1; 12 int id,grade; 13 for(int i = 0;i<n;i++){ 14 scanf("%d%d",&id,&grade); 15 16 set<int>::iterator it1 = s.lower_bound(grade),it2; 17 //这样写不知道为什么会超时 18 //set<int>::iterator it1,it2; 19 //it1 = lower_bound(s.begin(),s.end(),grade); 20 if(it1 == s.begin()){ 21 printf("%d %d\n",id,mp[*it1]); 22 s.insert(grade); 23 mp[grade] = id; 24 continue; 25 } 26 it2 = it1; 27 it1--; 28 if(it2 == s.end()){ 29 printf("%d %d\n",id,mp[*it1]); 30 }else if(grade-*it1 <= *it2-grade){ 31 printf("%d %d\n",id,mp[*it1]); 32 }else{ 33 printf("%d %d\n",id,mp[*it2]); 34 } 35 s.insert(grade); 36 mp[grade] = id; 37 } 38 } 39 return 0; 40 }