题目
题目链接:https://zoj.pintia.cn/problemsets/91827364500/problems/91827365109
思路
就当成普通替换,然后用一个last记录一下这个颜色,和后面的做比对。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn=8010;
struct sut{
int l,r,color,add;
}tree[maxn<<2];
void build(int l1,int r1,int x){
tree[x].l=l1;
tree[x].r=r1;
tree[x].add=0;
tree[x].color=-1;
if(l1==r1) return;
int mid=(l1+r1)>>1;
build(l1,mid,x<<1);
build(mid+1,r1,x<<1|1);
}
void pushdown(int x){
if(tree[x].add){
tree[x<<1].color=tree[x<<1|1].color=tree[x].color;
tree[x<<1].add=tree[x<<1|1].add=1;
tree[x].add=0;
}
}
void update(int l1,int r1,int col,int x){
if(l1<=tree[x].l&&tree[x].r<=r1){
tree[x].add=1;
tree[x].color=col;
return;
}
pushdown(x);
int mid=(tree[x].l+tree[x].r)>>1;
if(l1<=mid) update(l1,r1,col,x<<1);
if(r1>mid) update(l1,r1,col,x<<1|1);
}
int last,res[8010];
void query(int l1,int r1,int x){
if(tree[x].l==tree[x].r){
if(tree[x].color!=last){
//cout<<x<<endl;
res[tree[x].color]++;
//if(tree[x].color==1) cout<<x<<endl;
last=tree[x].color;
}
return;
}
pushdown(x);
int mid=(tree[x].r+tree[x].l)>>1;
query(l1,mid,x<<1);
query(mid+1,r1,x<<1|1);
}
int main(){
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;
while(~scanf("%d",&n)){
build(1,8000,1);
memset(res,0,sizeof res);
last=-1;
while(n--){
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
update(x+1,y,c,1);///***x+1
}
query(1,8000,1);
for(int i=0;i<=8000;i++){
if(res[i]){
printf("%d %d\n",i,res[i]);
}
}
printf("\n");
}
return 0;
}