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;
}