6 条题解
-
21
从河南到海南——难上加难
问:问题在哪? 答:重复印染!
大家说我在一个油漆桶上染多次:
黄黄蓝
蓝蓝黄
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
思路
这道题比较简单,维护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
#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
提供一种不太一样的思路:
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
由于有三种颜色,所以需要定义三个差分数组 ,根据输入进行区间加法,最后统计哪一个位置的红色为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
不要抄题解,否则你会哭的!
#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
- 上传者