6 条题解

  • 21
    @ 2024-2-3 10:21:11

    从河南到海南——难上加难

    问:问题在哪? 答:重复印染!

    大家说我在一个油漆桶上染多次:

    黄黄蓝

    蓝蓝黄

    114514个黄和114514个蓝

    是不是绿

    只要染了蓝和黄 没染红 就是

    思路:用3个差分数组记录染的次数,判断是否“染了蓝和黄 没染红”

    #include<bits/stdc++.h>
    using namespace std;
    const int NUM=1000005;
    int n,m;
    int x,y,z;
    int sum;
    
    int r[NUM];
    int re[NUM];
    
    int b[NUM];
    int bl[NUM];
    
    int ye[NUM];
    int yel[NUM];
    
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
            cin>>x>>y>>z;
            if(z==1)
            {
                ye[x]++;
                ye[y+1]--;
            }
            else if(z==2)
            {
                b[x]++;
                b[y+1]--;
            }
            else
            {
                r[x]++;
                r[y+1]--;
            }
        }
        for(int i=1;i<=n;i++)
        {
            re[i]=re[i-1]+r[i];
            bl[i]=bl[i-1]+b[i];
            yel[i]=yel[i-1]+ye[i];
            if((re[i]==0)&&(bl[i]>0)&&(yel[i]>0))
            {
                sum++;
            }
        }
        cout<<sum;
        return 0;
    }
    

    编码不易 今天加个赞

    • 11
      @ 2023-6-25 10:28:26
      思路 这道题比较简单,维护3个差分数组,进行区间修改。之后遍历整个数组找到符合要求的
      代码
      
      #include<bits/stdc++.h>
      using namespace std;
      int n,m,ans;
      int yellow[1919810],red[1919810],blue[1919810];
      int main(){
      	cin>>n>>m;
      	for(int i=1;i<=m;i++){
      		int color,l,r;
      		cin>>l>>r>>color;
      		if(color==1){
      			yellow[l]++; 
      			yellow[r+1]--;
      		}
      		else if(color==2){
      			blue[l]++;
      			blue[r+1]--;
      		}
      		else{
      			red[l]++;
      			red[r+1]--;
      		}
      	}
      	int redsum=0,yellowsum=0,bluesum=0;//当前栅栏的涂色情况 
      	for(int i=1;i<=n;i++){
      		redsum+=red[i];//sum统计 
      		yellowsum+=yellow[i];//sum统计 
      		bluesum+=blue[i];//sum统计 
      		if(redsum==0&&min(bluesum,yellowsum)>0){//min(bluesum,yellowsum)>0等价于bluesum>0&&yellowsum>0 
      			ans++;
      		}
      	}
      	cout<<ans<<endl;
      	return 0;
      }
      
      
    • 1
      @ 2024-3-17 19:28:30
      #include <bits/stdc++.h>
      using namespace std;
      const int MAX=1e6+10;
      int n,m,l,r,k,ans,dr[MAX],dy[MAX],db[MAX];
      int main(){
      	cin>>n>>m;
      	for (int i=1;i<=m;i++){
      		cin>>l>>r>>k;
              if (k==1){dy[l]++;dy[r+1]--;}
              else if (k==2){db[l]++;db[r+1]--;}
              else {dr[l]++;dr[r+1]--;}
      	}
      	for (int i=1;i<=n;i++){
      		dr[i]+=dr[i-1];dy[i]+=dy[i-1];db[i]+=db[i-1];
              if (dr[i]==0&&min(dy[i],db[i])>0)ans++;
      	}
      	cout<<ans;
      	return 0;
      }
      
      • 0
        @ 2024-1-13 22:42:17

        提供一种不太一样的思路:

        for (int i = 0; i < m; i++)
        {
            cin >> lft >> rgt >> k;
            if (k == 1)
            {
                dy[lft]++;
                dy[rgt + 1]--;
            }
            if (k == 2)
            {
                db[lft]++;
                db[rgt + 1]--;
            }
            if (k == 3)
            {
                dr[lft]++;
                dr[rgt + 1]--;
            }
        }
        for (int i = 1; i < n + 1; i++)
        {
            r[i] = r[i - 1] + dr[i];
            y[i] = y[i - 1] + dy[i];
            b[i] = b[i - 1] + db[i];
        }
        

        开始是正常的差分、前缀和

        for (int i = 1; i < n + 1; i++)
        {
            if (r[i] > 0)
            {
                c[i] += 4;
            }
            if (y[i] > 0)
            {
                c[i] += 1;
            }
            if (b[i] > 0)
            {
                c[i] += 2;
            }
        }
        

        这里额外定义了一个c数组,用于储存每个油漆桶内的颜料颜色。在维护c数组时,遍历r、y、b三个数组(数组内的值即为添加颜料的次数),如果添加颜料的次数大于0,则给c数组的第i项增加相应数量的值。 此处定义黄色增加1、蓝色增加2、红色增加4。这样每种颜色就可以和唯一的数字对应,具体对应关系如下表:

        数字 颜色
        0 白色
        1 黄色
        2 蓝色
        3 绿色
        4 红色
        5 橙色
        6 紫色
        7 棕色

        故只需遍历c数组,找出值为3的元素的个数即可。

        • 0
          @ 2023-6-25 12:08:32

          由于有三种颜色,所以需要定义三个差分数组 ,根据输入进行区间加法,最后统计哪一个位置的红色为0,黄色和蓝色都大于0,就能配出绿色。

          注意判断时黄色不一定都为1,只要两种颜色都大于0即可。

          核心代码:

          for (int i=1;i<=m;i++)
          	{
          		cin>>l>>r>>x;
          		if (x==1)
          		{
          		    yellow[l]++;
          		    yellow[r+1]--;
          		}
          		else if (x==2)
          		{
          		    blue[l]++;
          		    blue[r+1]--;
          		}
          		else
          		{
          		    red[l]++;
          		    red[r+1]--;
          		}
          	}
          	for (int i=1;i<=n;i++)
          	{
          	    sum1+=yellow[i];
          	    sum2+=blue[i];
          	    sum3+=red[i];
          	    if (sum3==0 && sum1>0 && sum2>0)
          	    {
          	        ans++;
          	    }
          	}
          
          
          • -1
            @ 2023-12-10 18:34:04

            不要抄题解,否则你会哭的!

            #include <bits/stdc++.h>
            using namespace std;
            int n,m,red[61O9326],y[61O9326],b[61O9326],cnt;
            int main()
            {
                cin>>n>>m;
                for(int i=1;i<=m;i++){
                    int l,r,k;
                    cin>>l>>r>>k;
                    if(k==1)//黄色
                    {
                        y[l]++;
                        y[r+1]--;
                    }
                    if(k==2)//蓝色
                    {
                        b[l]++;
                        b[r+1]--;
                    }
                    if(k==3)//红色
                    {
                        red[l]++;
                        red[r+1]--;
                    }
                }
                for(int i=1;i<=n;i++){
                    y[i]+=y[i-1];
                    b[i]+=b[i-1];
                    red[i]+=red[i-1];
                    if(red[i]==O&&y[i]>O&&b[i]>O){//判断是否绿色.(没有红,有黄蓝(可以不只一次))
                        cnt++;
                    }
                }
                cout<<cnt;
                return O;
            }//hetao61O9326(不要抄题解!!!!!)!否则你会哭的!!!!!!
            
          • 1

          信息

          ID
          229
          时间
          1000ms
          内存
          256MiB
          难度
          4
          标签
          (无)
          递交数
          1016
          已通过
          501
          上传者