poj 2482 java

import java.util.*;

public class POJ_2482 {

	static long height[];
	static long tree[];
	static XY p[];
	static TreeSet<Long> ts;
	static Iterator<Long> iterator;
	static int m;
	static long sum[];
	static long maxSum[];
	
	public static void main(String[] args)throws Exception {
		
		Scanner scan = new Scanner(System.in);
		
		while(scan.hasNext()){
			int n = scan.nextInt();
			int W = scan.nextInt();
			int H = scan.nextInt();
			height = new long[2*n];
			ts = new TreeSet<Long>();
			
			p = new XY[n<<1];
			
			for(int i=0;i<n;i++){
				p[i] = new XY(scan.nextLong(),scan.nextLong(),scan.nextLong());
				p[i+n] = new XY(p[i].x+W,p[i].y,-p[i].c);    //x扫描线  当遇到 p[i].x+W 表示 以p[i].x为左下角的矩形已搜索结束
				ts.add(p[i].y);                              // 所以是  -p[i].c  这样刚好可以中和  成0  表示没有加上它
				ts.add(p[i].y+H);
			}
			m = ts.size();
			iterator = ts.iterator();
			tree = new long[m<<1];
			sum = new long[(m<<1)+2];
			maxSum = new long[(m<<1)+2];
			
			createLineTree(1);
			
			java.util.Arrays.sort(p);
			
			n *= 2;
			
			long ans = 0;
			for(int i=0;i<n;i++){             //原理同 x扫描线 相似
				insert(p[i].y,p[i].c);
				insert(p[i].y+H,-p[i].c);
				ans = Math.max(ans, maxSum[1]);
			}
			System.out.println(ans);
		}

	}

	private static void insert(long y, long c) {
		
		int p = 1;
		while(tree[p]!=y){            // 搜索要修改的点
			if(y<tree[p])
				p <<= 1;
			else
				p = (p<<1)+1;
		}
		
		while(p!=0){                         //更新 前面找到的修改点以及 它所有祖先点
			sum[p] += c;
			long t1 = maxSum[2*p];            // 每个根结点 是 左右子树 一起更新的结果
			long t2 = sum[p]-sum[2*p+1]+maxSum[2*p+1];  //  因为此树是有序的 所以每一棵子树 代表一个范围 (左根右) 
			maxSum[p] = Math.max(t1, t2);               // 而这个范围的maxSum 值 就放在根中   根中的sum值 是其所有子树的总和
			p /= 2;
		}
		
	}

	public static void createLineTree(int p) {
		
		if(2*p<=m)                      // 建立二叉 排序树   
			createLineTree(2*p);
		tree[p] = iterator.next();
		if(2*p+1<=m)
			createLineTree(2*p+1);
	}

}
class XY implements Comparable<XY>{

	long x;
	long y;
	long c;
	
	public XY(long x, long y, long c) {
		super();
		this.x = x;
		this.y = y;
		this.c = c;
	}


	public int compareTo(XY e) {
		
		if(this.x<e.x)
			return -1;
		else if(this.x>e.x)
			return 1;
		else{
			if(this.c<e.c)
				return -1;
			else if(this.c>e.c)
				return 1;
			return 0;
		}
		
	}
	
}


 

根据您的问题,我理解您想了解POJ1328问题的Java解决方案。POJ1328是一个经典的问题,也被称为"雷达安装"问题,它涉及到在一个二维平面上安装雷达以覆盖所有岛屿的最小雷达数量。以下是一个Java解决方案的示例代码: ```java import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int caseNum = 1; while (true) { int n = scanner.nextInt(); if (n == 0) { break; } Island[] islands = new Island[n]; for (int i = 0; i < n; i++) { int x = scanner.nextInt(); int y = scanner.nextInt(); islands[i] = new Island(x, y); } int radarNum = getRadarNum(islands); System.out.println("Case " + caseNum + ": " + radarNum); caseNum++; } } private static int getRadarNum(Island[] islands) { Arrays.sort(islands, Comparator.comparingInt(Island::getRight)); int radarNum = 1; int rightMost = islands[0].getRight(); for (int i = 1; i < islands.length; i++) { if (islands[i].getLeft() > rightMost) { radarNum++; rightMost = islands[i].getRight(); } else { rightMost = Math.min(rightMost, islands[i].getRight()); } } return radarNum; } static class Island { private int left; private int right; public Island(int left, int right) { this.left = left; this.right = right; } public int getLeft() { return left; } public int getRight() { return right; } } } ``` 这段代码通过输入岛屿的坐标,计算出需要安装的最小雷达数量,并输出结果。它使用了排序和贪心算法的思想来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值