图-差分数组_i++图-差分数组_一维数组_02
package Week1;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/*N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),
lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。
但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
3
1 1
2 2
3 3
3
1 1
1 2
1 3
0
*/

/**
 * 差分数组,a开始b结束然后求每个球被涂几次颜色
 * N个气球,声明一个一维数组N,int arr[] = new int[N+1]; a开始b结束,数组索引a标记1,b+1位置标记-1
 *                                                  arr[a]++   arr[b+1]--
 *   for (int i = 1; i <= N; i++) {
 *      arr[i]+=arr[i-1];
 *   }
 *   即arr[i]就为每个点图的颜色数                                               
 */

public class G_ChaFenShuZu {
   static int s,e;
   static int N;
   static int arr[];
   public static void main(String[] args) throws Exception{
       System.setIn(new FileInputStream("Solution.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        boolean flag = true;
        while(flag) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            if(N==0) {
                flag=false;
                break;
            } else {
                arr = new int[N+2];
                for (int i = 1; i <= N; i++) {
                    st = new StringTokenizer(br.readLine());
                    int a  = Integer.parseInt(st.nextToken());
                    int b  = Integer.parseInt(st.nextToken());
                    arr[a]++;
                    arr[b+1]--;
                }
                for (int i = 1; i <= N; i++) {
                    arr[i]+=arr[i-1];
                    System.out.print(arr[i]+" ");
                }
                System.out.print("\n");
            }
            
        }
        
        
   }
}
View Code