組隊賽3 醉之見面會(莫隊 樹狀陣列)

2021-09-26 09:35:32 字數 2047 閱讀 9548

醉之見面會(莫隊+樹狀陣列)

有很多個人需要發言,第i個人的發言時間為ai分鐘

由於時間有限,需要挑選第l個到第r個小朋友來發言,如何安排他們的發言順序才能使得他們發言+等待的時間總和最小。

比如,如果你安排2,3,5的小朋友一次發言,發言得總時間為2+(3+2)+(5+3+2)=17分鐘

現在有m個詢問,每個詢問為[l,r],你要對每個詢問進行回答

如果需要區間[l,r]的總時間最小,那麼我們必須從小到大安排這個區間,如果每次對乙個詢問區間排序,時間複雜度過大,如何加速?

我們可以用莫隊演算法,莫隊並不是乙個模板,而是一種思路,意思是對詢問進行排序,依次回答,每次暴力地移動區間,那麼就會有兩種情況:新增乙個數,答案會如何變化,減少乙個數,答案會如何變化。

本題中我們可以注意到,假設當前區間從小到大排序後是b[1], b[2], ... b[n],當新插入乙個x時,假設排序後是b[1], b[2], ... b[k-1], x, b[k],b[k+1], ... b[n]。

那麼,對於x前面的數,x都要等待他們發言,此時答案相當於加上了乙個比x小的數的字首和;

對於x後面的數,每個數都要等待x發言,假設有num個,答案相當於加上num*x。

所以,我們需要維護乙個已經出現的比x小的數的字首和,和已經出現的比x大的數的個數

所以,我們想到樹狀陣列,樹狀陣列維護逆序對相信都不陌生,如果乙個數出現標記為1,同時字首和加上這個數,這樣就可以同時用樹狀陣列維護了。

莫隊的增加和減少也很好寫,增加就是上面增加的思路,減少就用樹狀陣列重新標記為0,答案減去上面增加的數就好了。

#include #include #include #include #include #include #include using namespace std;

​typedef long long ll;

const int maxn = 20000 + 10;

ll a[maxn];

int n, m;

//詢問

struct query

query() {}

}q[maxn];

int block;//塊

ll ans[maxn];

ll ans;//記錄答案

int pos[maxn];//每個詢問所在的塊

int cmp(const query a, const query b)

return pos[a.l] < pos[b.l];}​

int lowbit(int x)

int s[maxn];//每個數在當前詢問出現了多少次

ll sum[maxn];

​//樹狀陣列

int sum(int x,ll &presum)

return res;

}void add(int x, int d) }​

//莫隊

void add(int x,int l,int r)

void del(int x,int l,int r)

signed main()

ans = 0;

memset(s, 0, sizeof(s));

memset(sum, 0, sizeof(sum));

for (int i = 0; i < maxn; i++)sum[i] = 0;

for (int i = 1; i <= m; i++)

sort(q + 1, q + m + 1, cmp);

int l = 1, r = 0;

for (int i = 1; i <= m; i++)

while (l > q[i].l)

while (l < q[i].l)

while (r > q[i].r)

ans[q[i].id] = ans;

}for (int i = 1; i <= m; i++)

}return 0;

}​

省賽組隊賽3 比賽總結

今天下午又做了一次組隊賽練習,大部分隊都是做出了5道題,最多的做了6道,我們隊也做了5道。雖然題量和其他隊差別不大,但是耗時卻比較多。比賽剛開始時做的還比較順利,我先看的a題,理解題意之後我就開始寫,提交一次ac,拿到了fb。我寫a題時隊友又發現了一道簡單題l題,交完a題,隊友和我說了一下題意和解決...

組隊賽感悟

清明這三天一直呆機房裡打比賽 現在想來當時的痛苦,開心,失落,都是值得回憶的,都是一種成長,雖然一直墊底,去不了省賽,組的女隊隊友並不強,所以什麼都要靠自己,所以這楊自己的水平很明顯的被暴露出來,很弱,很差,能夠在場上a題的感覺還是不錯的,但是找bug的時候也會很氣 這三天喜歡與隊友的配合,三個人一...

nyist 組隊賽(三)

本次比賽是浙江省賽的題,做了5 道題感覺水平有點次啊,讓我感到差距太大,自己需要學的知識好有很多 比賽前10分鐘我來晚了隊友等著我讀題,當我來的時候,當時別人已經把a題給a出來了,a題就是乙個大水題,1分鐘讀題 2分鐘 接著就是c題2分鐘讀題 n分鐘思考 2分鐘 n 20 也是乙個水題,接著g題,模...