算法初探

前言

这篇博客咕咕咕了很久,记得以前还花了整整一上午研究来着

这么简单的东西花一上午唉...

感叹之前的理解能力,果然还是我太弱了

正文

离散化简单来说就是将范围很大,但是不关心具体数值的一列数缩小

举个例子

1 9999999 99998 56 99998

离散化之后就是

1 4 3 2 3

我们要将其按照大小次序排好,必先排序

然后我们去重,否则重复的数会影响lower_bound()函数的正确性

之后顺序查询即可

#include<iostream>
#include<algorithm>
#define N 1000001
using namespace std;
int in[N],n,cnt,st[N];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>in[i];
		st[i]=in[i];
	}
	sort(st+1,st+n+1);
	cnt=unique(st+1,st+n+1)-st-1;
	for(int i=1;i<=n;i++){
		in[i]=lower_bound(st+1,st+cnt+1,in[i])-st;
		cout<<in[i]<<" ";
	}
}

CF845C Two TVs

离散化裸题,离散化之后进行区间查询,如果有点的值大于2,不满足题意,输出NO

#include <iostream>
#include <algorithm>
using namespace std;
int n,m,tree[1000001],s[1000001],ls[1000001],num,cnt,nu[1000001];
int lowbit(int a){return a&-a;}
void add(int a,int b){
    while(a<=n*2){
        tree[a]+=b;
        a+=lowbit(a);
    }
}
int search(int a){
    int re=0;
    while(a!=0){
        re+=tree[a];
        a-=lowbit(a);
    }
    return re;
}
int main(){
	ios::sync_with_stdio(0);
	int a,b;
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>nu[++num];
    	ls[num]=nu[num];
		cin>>nu[++num];
		ls[num]=nu[num];
	}
    sort(ls+1,ls+2*n+1);
    cnt=unique(ls+1,ls+2*n+1)-ls-1;
    for(int i=1;i<=n;i++){
        	add(lower_bound(ls+1,ls+cnt+1,nu[2*i-1])-ls,1);
        	add(lower_bound(ls+1,ls+cnt+1,nu[2*i])-ls+1,-1);
    }
    for(int i=1;i<=(n<<1);i++){
    	if(search(i)>2){
    		cout<<"NO";
    		return 0;
		}
	}
	cout<<"YES";
}
原文地址:https://www.cnblogs.com/zythonc/p/13184668.html