1. 程式人生 > 資訊 >微信制定《視訊號直播帳號階梯處置方案》:計算主播安全信用分,採取階梯處罰等措施

微信制定《視訊號直播帳號階梯處置方案》:計算主播安全信用分,採取階梯處罰等措施

什麼是 離散化 ???

一些數字,它們的範圍很大(0-1e9),但是個數不多(1-1e5),並且這些數本身的數字大小不重要,重要的是這些數字之間的相對大小

第一種離散化

包含重複元素,並且相同元素離散化後也要相同

蒟蒻程式碼

const int N=1e5 + 5;
int book[N],a[N];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i], book[i]=a[i];
    sort(book+1,book+n+1);	// 排序
    m=unique(book+1,book+n+1)-book-1;	// 去重
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(book+1,book+m+1,a[i])-book;	// 一一建立對映關係
}

第二種離散化

複雜度低

  1. 包含重複元素,並且相同元素離散化後不相同
  2. 不包含重複元素,並且不同元素離散化後不同

符合這兩個條件的其中一個, 使用

蒟蒻程式碼

struct node{
    int x;
    int idx;
    bool operator <(const node& n) const{
        return x<n.x;
    }
};

const int N=1e5+5;
int n;
node a[N];
int book[N];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i].x, a[i].idx=i;

    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        book[a[i].idx]=i;   // book[i] 表示 原索引為 i 的元素, 離散化後的位置
    }
    for(int i=1;i<=n;i++){
        a[i].x=book[a[i].idx];  // 將離散化後的值賦給 a[i].x
    }
    // for(int i=1;i<=n;i++) cout<<a[i].idx<<" ";
    // cout<<endl;
    // for(int i=1;i<=n;i++) cout<<a[i].x<<" ";
    return 0;
}