9 条题解

  • 31
    @ 2023-7-26 21:00:00
    小提示 使用差分处理,依次在输入的每个区间上加1,检查最终结果是否是“连续的一段0-连续的一段1-连续的一段0”这样的结构即可。

    很简单!!!

    加油!!!

    代码如下👇

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    struct qj
    {
        int a;
        int b;
    };
    
    qj q[50009];
    
    
    bool cmp(qj &m, qj &n)
    {
        if(m.a<n.a)
            return true;
        else return false;
    }
    
    int main()
    {
        int n;
        cin>>n;
        int c_min=10005,c_max=0;
        int a,b;
        bool is_ok = true;
        for(int i=0;i<n;i++)
        {
            cin>>q[i].a>>q[i].b;
    
        }
    
        sort(q, q+n,cmp);
    
        for(int i=0;i<n;i++)
        {
    
            if(c_min>c_max)
            {
                c_min = q[i].a;
                c_max = q[i].b;
            }
            if(q[i].a<=c_min&&q[i].b>=c_min)
            {
                c_min = q[i].a;
                c_max = max(c_max, q[i].b);
            }
            else if(q[i].a>=c_min&&q[i].a<=c_max)
            {
                c_max = max(c_max, q[i].b);
            }
            else
            {
                is_ok = false;
            }
        }
    
        if(is_ok)
            cout<<c_min<<" "<<c_max<<endl;
        else cout<<"no"<<endl;
    }
    
    小提示 这玩意是90分的 AC自己写
    #include<bits/stdc++.h>
    using namespace std;
    int n,a,b,d[50005],x,y;
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a>>b;
            d[a]++;
            d[b+1]--;
    
        }
        for(int i=1;i<=10000;i++)
        {
            d[i]+=d[i-1];
        }
        int p=1;
        while(d[p]==0&&p<=10000)
        {
            p++;
        }
        x=p;
        while(d[p]>0&&p<=10000)
        {
            p++;
        }
        y=p-1;
        while(d[p]>0&&p<=10000)
        {
            p++;
        }
        if(p==10001)
        {
            cout<<x<<" "<<y;
    
        }
        else{
            cout<<"no";
        }
        return 0;
    }
    
    大提示 这玩意是50分的 AC还是得自己写
    AC 这玩意是AC
    #include<bits/stdc++.h>
    using namespace std;
    int n,a,b,d[50005],x,y;
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a>>b;
            d[a]++;
            d[b+1]--;
    
        }
        for(int i=1;i<=10000;i++)
        {
            d[i]+=d[i-1];
        }
        int p=1;
        while(d[p]==0&&p<=10000)
        {
            p++;
        }
        x=p;
        while(d[p]>0&&p<=10000)
        {
            p++;
        }
        y=p-1;
        while(d[p]==0&&p<=10000)
        {
            p++;
        }
        if(p==10001)
        {
            cout<<x<<" "<<y;
    
        }
        else{
            cout<<"no";
        }
        return 0;
    }
    
    • @ 2023-7-26 21:10:36

      礼貌取

      记得赞!!

      一定要赞!!!!

    • @ 2023-7-26 21:31:27

      第一段代码就是AC的

    • @ 2023-7-26 21:31:41

      自己试过了,没有问题的@

    • @ 2023-12-17 16:50:43

      ok

  • 4
    @ 2024-2-23 15:30:51
    题解
    点赞带走
    请大家点个赞吧!
    AC代码
    #include <bits/stdc++.h>
    using namespace std;
    int n, a, b, d[50005], x, y;
    int main()
    {
    cin >> n;
    for (int i = 1;i <= n;i++)
    {
    cin >> a >> b;
    d[a]++;
    d[b + 1]--;
    }
    for (int i = 1;i <= 10000;i++)
    {
    d[i] += d[i - 1];
    }
    int p = 1;
    while (d[p] == 0 && p <= 10000)
    {
    p++;
    }
    x = p;
    while (d[p] > 0 && p <= 10000)
    {
    p++;
    }
    y = p - 1;
    while (d[p] == 0 && p <= 10000)
    {
    p++;
    }
    if (p == 10001)
    {
    cout << x << " " << y;
    }
    else
    {
    cout << "no";
    }
    return 0;
    }
    
    需求点个赞吧!
    • 3
      @ 2023-10-28 21:40:51
      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
          int n,a[50005],b[50005];
          int left = 10000,right = 0;
          cin >> n;
          for(int i = 1; i <= n; i++)
          {
              cin >> a[i] >> b[i];
          }
          sort(a + 1,a + n + 1);
          sort(b + 1,b + n + 1);
          for(int i = 1; i <= n; i++)
          {
              if(b[i] < a[i + 1])
              {
                  cout << "no";
                  return 0;
              }
              left = min(left,a[i]);
              right = max(right,b[i]);
          }
          cout << left << " " << right;
          return 0;
      }
      
      • 3
        @ 2023-7-6 16:26:02

        使用差分处理,依次在输入的每个区间上加1,检查最终结果是否是“连续的一段0-连续的一段1-连续的一段0”这样的结构即可。

        核心代码
        
        for (int i = 1; i <= 10000; i++) {
            d[i] += d[i - 1];
        }
        int p = 1;
        while (d[p] == 0 && p <= 10000) {
            p++;//连续的一段0
        }
        x = p;
        while (d[p] > 0 && p <= 10000) {
            p++;//连续的一段1
        }
        y = p - 1;
        while (d[p] == 0 && p <= 10000) {
            p++;//连续的一段0
        }
        if (p == 10001) {//如果到结尾了,说明结构符合要求
            cout << x << " " << y;
        } else {
            cout << "no";
        }
        
        • 2
          @ 2024-2-22 14:04:12

          这道题我采用了结构体排序的思路,看完别忘了点一个大大的赞~~~ 不要看我短就忽略我!!!

          具体思路 由这道题的题意可知,上一个区间的b需要大于等于下一个数据的a,所以a越小越容易与其他区间合并,所以将结构体数组按a的大小排序 left表示最左端点,right表示最右端点 先将left和right初始化为排序后第一个区间,然后从第二个区间开始遍历,left取min,right取max, 在此中间如果有断层情况,区间便不能完全合并,直接输出no即可
          cmp函数
          bool cmp(Q x,Q y)
          {
          	if (x.a == y.a)
          	{
          		return x.b < y.b;
          	}
          	return x.a < y.a;
          }
          
          核心代码
          sort(s+1,s+n+1,cmp);
          	left = s[1].a;
          	right = s[1].b;
          	for (int i = 2;i <= n;i++)
          	{
          		if (right < s[i].a)
          		{
          			cout << "no" << endl;
          			return 0;
          		}
          		left = min(s[i].a,left);
          		right = max(s[i].b,right);
          	}
          
          AC代码,建议同学们慎重打开,要动脑思考
          #include <bits/stdc++.h>
          using namespace std;
          struct Q
          {
          	int a,b;
          }s[50005];
          bool cmp(Q x,Q y)
          {
          	if (x.a == y.a)
          	{
          		return x.b < y.b;
          	}
          	return x.a < y.a;
          }
          int main()
          {
          	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//加速,可以没有,看个人习惯
          	int n,left,right;
          	cin >> n;
          	for (int i = 1;i <= n;i++)
          	{
          		cin >> s[i].a >> s[i].b;
          	}
          	sort(s+1,s+n+1,cmp);
          	left = s[1].a;
          	right = s[1].b;
          	for (int i = 2;i <= n;i++)
          	{
          		if (right < s[i].a)
          		{
          			cout << "no" << endl;
          			return 0;
          		}
          		left = min(s[i].a,left);
          		right = max(s[i].b,right);
          	}
          	cout << left << " " << right;
          	return 0;
          }
          
          • @ 2024-2-22 14:23:13

            关于三角的做法*** < details> < summary>+标题+</ summary> 把那details和两个summary前面的空格删掉就OK了 问我怎么知道的? 好, 我找到管理员的题解,查看网页源代码 找到相应的位置,抄下来即可 别忘点赞

        • 1
          @ 2024-3-16 16:23:06
          #include<iostream>
          #include<cstdio>
          #include<algorithm>
          using namespace std;
          
          struct qj
          {
              int a;
              int b;
          };
          
          qj q[50009];
          
          
          bool cmp(qj &m, qj &n)
          {
              if(m.a<n.a)
                  return true;
              else return false;
          }
          
          int main()
          {
              int n;
              cin>>n;
              int c_min=10005,c_max=0;
              int a,b;
              bool is_ok = true;
              for(int i=0;i<n;i++)
              {
                  cin>>q[i].a>>q[i].b;
          
              }
          
              sort(q, q+n,cmp);
          
              for(int i=0;i<n;i++)
              {
          
                  if(c_min>c_max)
                  {
                      c_min = q[i].a;
                      c_max = q[i].b;
                  }
                  if(q[i].a<=c_min&&q[i].b>=c_min)
                  {
                      c_min = q[i].a;
                      c_max = max(c_max, q[i].b);
                  }
                  else if(q[i].a>=c_min&&q[i].a<=c_max)
                  {
                      c_max = max(c_max, q[i].b);
                  }
                  else
                  {
                      is_ok = false;
                  }
              }
          
              if(is_ok)
                  cout<<c_min<<" "<<c_max<<endl;
              else cout<<"no"<<endl;
          }
          
          
          • 1
            @ 2023-12-15 18:05:33
            #include <bits/stdc++.h>
            using namespace std;
            struct interval //定义区间结构体{
                int left,right;
            }a[50005];
            int n;
            bool cmp(interval x,interval y){//对区间左端点进行排序
                return x.left < y.left;
            }
            int main(){
                cin >> n;
                for (int i = 1; i <= n; i++)
                    cin >> a[i].left >> a[i].right; //输入区间
                sort(a+1,a+n+1,cmp); //对区间数组排序
                for (int i = 1; i <= n; i++){
                    if (a[i].right >= a[i+1].left){//满足合并条件
                        a[i+1].left = min(a[i].left,a[i+1].left);
                        a[i+1].right = max(a[i].right,a[i+1].right); //为了保证合并的区间正确性
                    } else{//不满足合并条件,直接输出no结束程序
                        cout << "no";
                        return 0;
                    }
                }
                cout << a[n].left << ' ' << a[n].right; //由于合并区间是向后合并,所以数组取最后一个值
                return 0;
            }
            
            • 1
              @ 2023-7-28 9:44:51

              小提示: 排序后,只要比对左右端点,就能解决

              #include <iostream>
              #include <algorithm>
              using namespace std;
              struct Qj{
                  int a;
                  int b;
              }qj[50001];
              bool cmp(Qj x,Qj y){
                  return x.a<y.a;   //左端点越靠前,对后面影响越大
              }
              int main(void){
                  int n,Min,Max;
                  cin>>n;
                  for(int i=1;i<=n;i++)
                      cin>>qj[i].a>>qj[i].b;
                  sort(qj+1,qj+n+1,cmp);  //排序
                  Min=qj[1].a;
                  Max=qj[1].b;            //初始化
                  for(int i=2;i<=n;i++)
                      if(qj[i].a<=Min&&qj[i].b>=Min){
                          Min=qj[i].a;
                          Max=max(Max,qj[i].b);        //左端点<=已合并区间左端点,右端点>=已合并区间右端点
                      }
                      else if(qj[i].a>=Min&&qj[i].a<=Max)
                          Max=max(qj[i].b,Max);         //左端点在已合并的区间中间
                      else{
                          cout<<"no";                   //合并不了
                          return 0;
                      }
                  cout<<Min<<' '<<Max;
                  return 0;
              }
              //已AC
              
            • -9
              @ 2023-12-9 11:38:59

              • 1

              信息

              ID
              257
              时间
              1000ms
              内存
              256MiB
              难度
              3
              标签
              (无)
              递交数
              678
              已通过
              385
              上传者