离散化模板

Posted 猪八戒1.0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了离散化模板相关的知识,希望对你有一定的参考价值。

模板

static ArrayList<Integer> alls = new ArrayList<>();          //存储所有待离散化的值

static ArrayList<Integer> newalls = new ArrayList<>();    //存储所有排序去重待离散化的值

 //去重
for(int i:alls)
     if(!newalls.contains(i))
        newalls.add(i);
        

//排序

Collections.sort(newalls);


// 二分求出x对应的离散化的值
public static int find(int x)
        int l=0,r=newalls.size()-1;
        while(l<r)
            int mid=l+r>>1;
            if(newalls.get(mid)>=x) r=mid;
            else l=mid+1;
        
        return r+1;//从1开始 因为后面要用到前缀和 1开始比较好
            

 题目:

 

 代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main 
	static int N=300010;
	static int n,m;
	static int []a=new int[N];
	static int []s=new int[N];//用来算前缀和
	static ArrayList<Integer> alls = new ArrayList<>();
	static ArrayList<Integer> newalls = new ArrayList<>();
	static ArrayList<PII> Add = new ArrayList<>();
	static ArrayList<PII> Query = new ArrayList<>();
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	
	public static void main(String[] args) throws IOException 
		String [] ts=br.readLine().split(" ");
        int n=Integer.parseInt(ts[0]);
        int m=Integer.parseInt(ts[1]);
        
        //先读取
        for(int i=0;i<n;i++) 
        	ts=br.readLine().split(" ");
        	int x=Integer.parseInt(ts[0]);
            int c=Integer.parseInt(ts[1]);
            PII pii = new PII(x,c);
            Add.add(pii);
            alls.add(x);
        
        for(int i=0;i<m;i++) 
        	ts=br.readLine().split(" ");
        	int l=Integer.parseInt(ts[0]);
            int r=Integer.parseInt(ts[1]);
            PII pii = new PII(l,r);
            Query.add(pii);
            alls.add(l);
            alls.add(r);
        
        
        //去重
        for(int i:alls) 
        	if(!newalls.contains(i)) 
        		newalls.add(i);
        	
        
       
        //排序
        Collections.sort(newalls);
        
        //System.out.println(newalls);
        //处理插入
        for(int i=0;i<Add.size();i++) 
        	PII pii = Add.get(i);
        	int x=find(pii.first);
        	a[x]+=pii.second;  
        	//System.out.println(i+" "+x+" "+a[x]);
        
        //处理前缀和
        for(int i=1;i<=newalls.size();i++) 
        	s[i]=s[i-1]+a[i];
        	//System.out.print(s[i]+" ");
        
        //System.out.println();
        //处理询问
        for(int i=0;i<Query.size();i++) 
        	PII pii = Query.get(i);
        	int l=find(pii.first);
        	int r=find(pii.second);
        	System.out.println(s[r]-s[l-1]);
        
	
	public static int find(int x) 
		int l=0,r=newalls.size()-1;
		while(l<r) 
			int mid=l+r>>1;
			if(newalls.get(mid)>=x) r=mid;
			else l=mid+1;
		
		return r+1;//从1开始 因为后面要用到前缀和 1开始比较好
	

class PII
	int first;
	int second;
	public PII() 
	public PII(int first, int second) 
		super();
		this.first = first;
		this.second = second;
	
	public int getFirst() 
		return first;
	
	public void setFirst(int first) 
		this.first = first;
	
	public int getSecond() 
		return second;
	
	public void setSecond(int second) 
		this.second = second;
	
	
	

 

以上是关于离散化模板的主要内容,如果未能解决你的问题,请参考以下文章

离散化模板

离散化模板

离散化模板

离散化模板

算法基础:离散化及模板详解

树状树组离散化求逆序对模板