站外题求助
  • 板块学术版
  • 楼主New_Void
  • 当前回复12
  • 已保存回复12
  • 发布时间2025/8/2 16:04
  • 上次更新2025/8/2 21:53:49
查看原帖
站外题求助
1048576
New_Void楼主2025/8/2 16:04

Byteasar 正准备给栅栏涂漆。他已经准备了 n n 罐白色油漆,他把这些油漆排列成一排,从 1 1 到 n n 编号。他想用这些油漆,但他不想把栅栏涂成白色。他委托了调色专家,调色专家有三种颜料:黄色、蓝色和红色。专家进行了 m m 次操作,其中第 i i 次操作是向编号在 l i l i ​ 到 r i r i ​ 之间(包括两端)的所有罐子中加入某种颜料。

油漆的最终颜色取决于被添加到其中的颜料。添加的颜料按照下表和图示进行混合。

| 颜料 | 颜色 |

| 无 | 白色 |

| 黄色 | 黄色 |

| 蓝色 | 蓝色 |

| 红色 | 红色 |

| 黄色 + 蓝色 | 绿色 |

| 黄色 + 红色 | 橙色 |

| 蓝色 + 红色 | 紫色 |

| 黄色 + 蓝色 + 红色 | 棕色 |

Byteasar 想要给栅栏涂成一种颜色。思来想去,他选择了绿色。他想知道现在有多少罐油漆是绿色的,请帮他数数。

输入格式 第一行两个整数 n , m n,m,分别表示油漆的罐数和专家进行的操作数。

第一行两个整数 n , m n,m,分别表示油漆的罐数和专家进行的操作数。

问最后有几个绿色油罐

这道题正解是3个差分,我突发奇想能不能写一个差分加上哈希的思想通过,求调。

#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+5;
int sum[N],a[N];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n,m;
    cin>>n>>m;
    int cnt=0;
    while (m--){
        int l,r,k;
        cin>>l>>r>>k;
        if (k==3){
            k=1e15;
        }
        if (k==2){
            k=1e7;
        }
        if (k==1){
            k=2;
        }
        a[l]+=k,a[r+1]-=k;
    }
    int MAX=1e7,MAXN=1e15;
    for (int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
        if (sum[i]<MAXN && sum[i]%2==0 && sum[i]%MAX!=0 && sum[i]>=MAX){
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

2025/8/2 16:04
加载中...