zoj1610-Java

这题有几个注意点,如果规避掉还是比较平凡的一题吧:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值