离散化模板
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;
以上是关于离散化模板的主要内容,如果未能解决你的问题,请参考以下文章