天天看點

hihocoder1269 優化延遲(二分&優先隊列)

數組 友善快速通路

連結清單 适合元素移動

使用sqrt等函數時

include<math.h>

使用sort等函數時

#include<algorithm>

配置設定動态數組

int len;
cin>>len;
int *a = new int[len];
           

聲明超大整型變量(例如a<10^13)

typedef long long ll;
ll a;
           

二分法的寫法也是很值得注意的!!!

優先隊列!以前竟然都不知道啊這麼好的東西!!!(以下為轉載)

隊列(queue)維護了一組對象,進入隊列的對象被放置在尾部,下一個被取出的元素則取自隊列的首部。

優先隊列(priority_queue)特别之處在于,允許使用者為隊列中存儲的元素設定優先級。這種隊列不是直接将新元素放置在隊列尾部,而是放在比它優先級低的元素前面。标準庫預設使用<操作符來确定對象之間的優先級關系,是以如果要使用自定義對象,需要重載 < 操作符。

優先隊列有兩種,一種是最大優先隊列;一種是最小優先隊列;每次取自隊列的第一個元素分别是優先級最大和優先級最小的元素。

1)定義時要包含頭檔案”queue.h”, “functional.h”

2)三種定義的方式:

.使用具有預設優先級的已有資料結構。

.在定義優先隊列的時候傳入自定義的優先級比較對象。

.使用自定義對象(資料結構),但是必須重載好< 操作符。

3)常用操作

q.empty()    //如果隊列為空,則傳回true,否則傳回false
q.size()     //傳回隊列中元素的個數
q.pop()      //删除隊首元素,但不傳回其值
q.top()      //傳回具有最高優先級的元素值,但不删除該元素
q.push(item) //在基于優先級的适當位置插入新元素
           

4)q.top()為查找操作,在最小優先隊列中搜尋優先權最小的元素,在最大優先隊列中搜尋優先權最大的元素。q.pop()為删除該元素。優先隊列插入和删除元素的複雜度都是O(lgn),是以很快。

5)另外,在優先隊列中,元素可以具有相同的優先權。

6)包含所有基本操作的優先隊列C語言示例代碼見最後

hihocoder1269

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

typedef long long ll;

ll calculate_sp(int k, int* pn, int n){
    ll sp = ;
    priority_queue<int> buffer;
    int cou = ;
    for(int i=; i<n; i++){
        buffer.push(pn[i]);
        while(buffer.size()>=k){
            cou++;
            int temp = buffer.top();
            buffer.pop();
            sp += cou* temp;
        }
    }
    while(!buffer.empty()){
        cou++;
        sp += cou*buffer.top();
        buffer.pop();
    }
    return sp;
}


int main(void){
    int n;
    ll Q;
    cin>>n;
    cin>>Q;

    ll sp;
    int k;
    int *pn = new int[n];

    for(int i=; i<n; i++){
        cin>>pn[i];
    }

    sp = ;


    int left=;
    int right = n;

    while(left<=right){
        k = (left+right)/;
        sp = calculate_sp(k, pn, n);
        if(sp<=Q) right = k-;
        else  left = k+;


    }   
    if(left>n) left=-;


    cout<<left;

    return ;

}
           

包含所有基本操作的優先隊列C語言示例代碼(轉載)

#include<iostream>
#include<functional>
#include<queue>
#include<vector>
using namespace std;

//定義比較結構
struct cmp1{
    bool operator ()(int &a,int &b){
        return a>b;//最小值優先
    }
};

struct cmp2{
    bool operator ()(int &a,int &b){
        return a<b;//最大值優先
    }
};

//自定義資料結構
struct number1{
    int x;
    bool operator < (const number1 &a) const {
        return x>a.x;//最小值優先
    }
};
struct number2{
    int x;
    bool operator < (const number2 &a) const {
        return x<a.x;//最大值優先
    }
};
int a[]={,,,,,,,,,,,};
number1 num1[]={,,,,,,,,,,,};
number2 num2[]={,,,,,,,,,,,};

int main()
{    
    priority_queue<int>que;//采用預設優先級構造隊列

    priority_queue<int,vector<int>,cmp1>que1;//最小值優先
    priority_queue<int,vector<int>,cmp2>que2;//最大值優先

    priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”會被認為錯誤,
    priority_queue<int,vector<int>,less<int> >que4;最大值優先

    priority_queue<number1>que5; //最小優先級隊列
    priority_queue<number2>que6;  //最大優先級隊列

    int i;
    for(i=;a[i];i++){
        que.push(a[i]);
        que1.push(a[i]);
        que2.push(a[i]);
        que3.push(a[i]);
        que4.push(a[i]);
    }
    for(i=;num1[i].x;i++)
        que5.push(num1[i]);
    for(i=;num2[i].x;i++)
        que6.push(num2[i]);


    printf("采用預設優先關系:/n(priority_queue<int>que;)/n");
    printf("Queue 0:/n");
    while(!que.empty()){
        printf("%3d",que.top());
        que.pop();
    }
    puts("");
    puts("");

    printf("采用結構體自定義優先級方式一:/n(priority_queue<int,vector<int>,cmp>que;)/n");
    printf("Queue 1:/n");
    while(!que1.empty()){
        printf("%3d",que1.top());
        que1.pop();
    }
    puts("");
    printf("Queue 2:/n");
    while(!que2.empty()){
        printf("%3d",que2.top());
        que2.pop();
    }
    puts("");
    puts("");
    printf("采用頭檔案/"functional/"内定義優先級:/n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)/n");
    printf("Queue 3:/n");
    while(!que3.empty()){
        printf("%3d",que3.top());
        que3.pop();
    }
    puts("");
    printf("Queue 4:/n");
    while(!que4.empty()){
        printf("%3d",que4.top());
        que4.pop();
    }
    puts("");
    puts("");
    printf("采用結構體自定義優先級方式二:/n(priority_queue<number>que)/n");
    printf("Queue 5:/n");
    while(!que5.empty()){
        printf("%3d",que5.top());
        que5.pop();
    }
    puts("");
    printf("Queue 6:/n");
    while(!que6.empty()){
        printf("%3d",que6.top());
        que6.pop();
    }
    puts("");
    return ;
}
/*
運作結果 :
采用預設優先關系:
(priority_queue<int>que;)
Queue 0:
91 83 72 56 47 36 22 14 10  7  3

采用結構體自定義優先級方式一:
(priority_queue<int,vector<int>,cmp>que;)
Queue 1:
3  7 10 14 22 36 47 56 72 83 91
Queue 2:
91 83 72 56 47 36 22 14 10  7  3

采用頭檔案"functional"内定義優先級:
(priority_queue<int,vector<int>,greater<int>/less<int> >que;)
Queue 3:
3  7 10 14 22 36 47 56 72 83 91
Queue 4:
91 83 72 56 47 36 22 14 10  7  3

采用結構體自定義優先級方式二:
(priority_queue<number>que)
Queue 5:
3  7 10 14 22 36 47 56 72 83 91
Queue 6:
91 83 72 56 47 36 22 14 10  7  3
*/