这题有几个注意点,如果规避掉还是比较平凡的一题吧:
1. 区间固定是 [1 ,8000], n是操作次数,不要搞混了
2. 染色时候,注意左边是开区间,因此左边边界+1,再燃色
3. 染色值可以有0,我一般让它加上1,最后再减去1就行了,当然对零处理也可以
4. 注意题意,问你的是整个区间有几个颜色块( 不相邻的颜色块可以视为两个颜色块),而不是你可以看到几种颜色, 因此在query时候打个pre标记就行了。
下面给出两种代码:
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main{
static class InputReader
{
BufferedReader buf;
StringTokenizer tok;
InputReader()
{
buf = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext()
{
while(tok == null || !tok.hasMoreElements())
{
try
{
tok = new StringTokenizer(buf.readLine());
}
catch(Exception e)
{
return false;
}
}
return true;
}
String next()
{
if(hasNext()) return tok.nextToken();
return null;
}
int nextInt()
{
return Integer.parseInt(next());
}
long nextLong()
{
return Long.parseLong(next());
}
double nextDouble()
{
return Double.parseDouble(next());
}
BigInteger nextBigInteger()
{
return new BigInteger(next());
}
BigDecimal nextBigDecimal()
{
return new BigDecimal(next());
}
}
static int[] sum, lazy;
static void pushup(int a ) {
if(sum[a<<1]==sum[(a<<1)+1]) {
sum[a]=sum[a<<1];
}else {
sum[a]=-1;
}
}
static void pushdown(int a) {
if(lazy[a] !=0) {
lazy[a<<1]=lazy[ (a<<1)|1]=lazy[a];
sum[a<<1] =sum[(a<<1)+1]=lazy[a];
lazy[a]=0;
}
return ;
}
static void update(int ll,int rr,int value ,int l,int r,int index) {
if(ll<= l && r<=rr) {
lazy[index]=value;
sum[ index]= value;
return ;
}
pushdown(index);
int m=(l+r)/2;
if( ll<= m) update(ll,rr,value,l,m,index*2);
if(m< rr) update(ll,rr,value, m+1,r,index*2+1);
pushup(index);
}
static int[]c;
static int pre;
static void query(int ll,int rr,int l,int r,int index) {
if(ll<= l && r<= rr) {
if(sum[index]==0) {
pre=-1;
return ;
}else if(sum[index] >=1 ){
if(sum[ index]!=pre) {
c[sum[index]]++;
pre=sum[index];
return ;
}
}else {
pushdown(index);
int m =(l+r)/2;
if(ll<= m ) query(ll,rr, l,m,index*2);
if(m< rr) query( ll,rr,m+1,r,index*2+1);
}
return ;
}
pushdown(index);
int m =(l+r)/2;
if(ll<= m ) query(ll,rr, l,m,index*2);
if(m< rr) query( ll,rr,m+1,r,index*2+1);
}
public static void main(String[] args) {
InputReader sc = new InputReader();
sum = new int[ 50000];
lazy = new int[ 50000];
c =new int[8005];
while(sc.hasNext()) {
int n =sc.nextInt();
for(int i=0;i<sum.length;i++) sum[i]= lazy[i]=0;
for(int i=1;i<c.length;i++) c[i]=0;
for(int i=0;i<n;i++) {
int a =sc.nextInt();
int b =sc.nextInt();
int c= sc.nextInt();
update(a+1,b,c+1, 1,8000 ,1);
}
pre=-1;
query(1,8000,1,8000,1);
for(int i=1;i<=8001;i++) {
if(c[i]!=0) {System.out.print(i-1);System.out.print(" ");System.out.println(c[i]); }
}
System.out.println();
}
}
}
这种比较容易看懂
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main{
static class InputReader
{
BufferedReader buf;
StringTokenizer tok;
InputReader()
{
buf = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext()
{
while(tok == null || !tok.hasMoreElements())
{
try
{
tok = new StringTokenizer(buf.readLine());
}
catch(Exception e)
{
return false;
}
}
return true;
}
String next()
{
if(hasNext()) return tok.nextToken();
return null;
}
int nextInt()
{
return Integer.parseInt(next());
}
long nextLong()
{
return Long.parseLong(next());
}
double nextDouble()
{
return Double.parseDouble(next());
}
BigInteger nextBigInteger()
{
return new BigInteger(next());
}
BigDecimal nextBigDecimal()
{
return new BigDecimal(next());
}
}
static int[] sum, lazy;
static void pushdown(int a) {
if(lazy[a] !=0) {
lazy[a<<1]=lazy[ (a<<1)+1]=lazy[a];
lazy[a]=0;
}
return ;
}
static void update(int ll,int rr,int value ,int l,int r,int index) {
if(ll<= l && r<=rr) {
lazy[index]=value;
return ;
}
pushdown(index);
int m=(l+r)/2;
if( ll<= m) update(ll,rr,value,l,m,index*2);
if(m< rr) update(ll,rr,value, m+1,r,index*2+1);
}
static int[]c;
static int pre;
static void query(int ll,int rr,int l,int r,int index) {
if(l==r) {
if(lazy[index]!=0 && lazy[index] !=pre) {
c[lazy[index]]++;
}
pre= lazy[index];
return ;
}
pushdown(index);
int m =(l+r)/2;
if(ll<= m ) query(ll,rr, l,m,index*2);
if(m< rr) query( ll,rr,m+1,r,index*2+1);
}
public static void main(String[] args) {
InputReader sc = new InputReader();
lazy = new int[50000];
c =new int[8005];
while(sc.hasNext()) {
int n =sc.nextInt();
for(int i=0;i<lazy.length;i++) lazy[i]=0;
for(int i=1;i<c.length;i++) c[i]=0;
for(int i=0;i<n;i++) {
int a =sc.nextInt();
int b =sc.nextInt();
int c= sc.nextInt();
update(a+1,b,c+1, 1,8000 ,1);
}
pre=-1;
query(1,8000,1,8000,1);
for(int i=1;i<=8001;i++) {
if(c[i]!=0) {System.out.print(i-1);System.out.print(" ");System.out.println(c[i]); }
}
System.out.println();
}
}
}