当前位置:   article > 正文

Acwing2024蓝桥杯区间合并

Acwing2024蓝桥杯区间合并

模板:

  1. #define x first
  2. #define y second
  3. typedef pair<int, int>pii;
  4. pii seg[N];
  5. sort(seg,seg+n);
  6. int l=seg[0].x,r=seg[0].y;
  7. for (int i=1;i<n;i++){
  8. if (seg[i].x<=r) r=max(r,seg[i].y);
  9. else l=seg[i].x,r=seg[i].y;
  10. }

题目:

AcWing 1343. 挤牛奶

  1. #include<iostream>
  2. #include<algorithm>
  3. #define x first
  4. #define y second
  5. using namespace std;
  6. const int N=5005;
  7. typedef pair<int,int>pii;
  8. pii seg[N];
  9. int n,ans1,ans2;
  10. int main(){
  11. cin>>n;
  12. for(int i=0;i<n;i++) cin>>seg[i].x>>seg[i].y;
  13. sort(seg,seg+n);
  14. int l=seg[0].x,r=seg[0].y;
  15. for(int i=0;i<n;i++){
  16. if(seg[i].x<=r){
  17. r=max(r,seg[i].y);
  18. ans1=max(ans1,r-l);
  19. }
  20. else{
  21. ans2=max(ans2,seg[i].x-r);
  22. l=seg[i].x,r=seg[i].y;
  23. ans1=max(ans1,r-l);
  24. }
  25. }
  26. cout<<ans1<<" "<<ans2<<endl;
  27. return 0;
  28. }

AcWing 803. 区间合并

  1. #include<iostream>
  2. #include<algorithm>
  3. #define x first
  4. #define y second
  5. using namespace std;
  6. const int N=1e5+5;
  7. typedef pair<int,int>pii;
  8. pii seg[N];
  9. long long ans=1;
  10. int main(){
  11. int n;cin>>n;
  12. for(int i=0;i<n;i++) cin>>seg[i].x>>seg[i].y;
  13. sort(seg,seg+n);
  14. int l=seg[0].x,r=seg[0].y;
  15. for(int i=0;i<n;i++){
  16. if(seg[i].x<=r) r=max(r,seg[i].y);
  17. else l=seg[i].x,r=seg[i].y,ans++;
  18. }
  19. cout<<ans<<endl;
  20. return 0;
  21. }

AcWing 422. 校门外的树

  1. #include<iostream>
  2. #include<algorithm>
  3. #define x first
  4. #define y second
  5. using namespace std;
  6. const int N=105;
  7. typedef pair<int,int>pii;
  8. pii seg[N];
  9. int ans;
  10. int main(){
  11. int len,n;cin>>len>>n;
  12. for(int i=0;i<n;i++) cin>>seg[i].x>>seg[i].y;
  13. sort(seg,seg+n);
  14. int l=seg[0].x,r=seg[0].y;
  15. for(int i=0;i<n;i++){
  16. if(seg[i].x<=r) r=max(r,seg[i].y);
  17. else ans+=r-l+1,l=seg[i].x,r=seg[i].y;
  18. }
  19. ans+=r-l+1;
  20. cout<<len+1-ans<<endl;
  21. return 0;
  22. }

AcWing 5407. 管道(第十四届省赛)

  1. #include<iostream>
  2. #include<algorithm>
  3. #define x first
  4. #define y second
  5. using namespace std;
  6. const int N=1e5+5;
  7. int n,len,id[N],timee[N];
  8. typedef pair<int,int>pii;
  9. pii seg[N];
  10. bool check(long long value){
  11. int j=0,flag=1;
  12. //划分区间
  13. for(int i=1;i<=n;i++){
  14. if(timee[i]<=value){
  15. //flag进行标记
  16. flag=0;
  17. int temp=value-timee[i];
  18. seg[j].x=max(1,id[i]-temp),seg[j].y=min(len,id[i]+temp),j++;
  19. }
  20. }
  21. //如果flag==1则该时间绝对不可能
  22. if(flag) return false;
  23. //排序
  24. sort(seg,seg+j);
  25. //合并区间
  26. int l=seg[0].x,r=seg[0].y,cnt=0;
  27. for(int i=0;i<j;i++){
  28. if(seg[i].x<=r+1) r=max(r,seg[i].y);
  29. else{
  30. //cnt计数
  31. cnt+=r-l+1;
  32. l=seg[i].x;
  33. r=seg[i].y;
  34. }
  35. //最后一次合并区间后,cnt计数
  36. if(i==j-1) cnt+=r-l+1;
  37. }
  38. //check判断bool
  39. if(cnt==len) return true;
  40. else return false;
  41. }
  42. int main(){
  43. //输入
  44. cin>>n>>len;
  45. for(int i=1;i<=n;i++) cin>>id[i]>>timee[i];
  46. //二分查找
  47. int left=1,right=2e9;//注意right的值为2e9
  48. while(left<right){
  49. //注意mid开浪浪,否则最大测试数据会爆
  50. long long mid=(long long)left+right>>1;
  51. if(check(mid)) right=mid;
  52. else left=mid+1;
  53. }
  54. //输出
  55. cout<<left<<endl;
  56. return 0;
  57. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/460895
推荐阅读
相关标签
  

闽ICP备14008679号