每日一題 7月1日題目精講 借教室

2022-05-05 14:12:09 字數 2989 閱讀 7655

時間限制:c/c++

1秒,其他語言2秒

空間限制:c/c++

131072k,其他語言262144k

64bit io format:

%lld

**:

在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。

面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。

我們需要處理接下來n天的借教室資訊,其中第i天學校有ri個教室可供租借。共有m份訂單,每份訂單用三個正整數描述,分別為dj, sj,

tj,表示某租借者需要從第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj個教室。

我們假定,租借者對教室的大小、地點沒有要求。即對於每份訂單,我們只需要每天提供dj個教室,而它們具體是哪些教室,每天是否是相同的教室則不用考慮。

借教室的原則是先到先得,也就是說我們要按照訂單的先後順序依次為每份訂單分配教室。如果在分配的過程中遇到乙份訂單無法完全滿足,則需要停止教室的分配,通知當前申請人修改訂單。這裡的無法滿足指從第sj天到第tj天中有至少一天剩餘的教室數量不足dj個。

現在我們需要知道,是否會有訂單無法完全滿足。如果有,需要通知哪乙個申請人修改訂單。

輸入描述:

第一行包含兩個正整數n, m,表示天數和訂單的數量。

第二行包含n個正整數,其中第i個數為ri,表示第i天可用於租借的教室數量。

接下來有m行,每行包含三個正整數dj, sj, tj,表示租借的數量,租借開始、結束分別在第幾天。

每行相鄰的兩個數之間均用乙個空格隔開。天數與訂單均用從1開始的整數編號。

輸出描述:

如果所有訂單均可滿足,則輸出只有一行,包含乙個整數0。否則(訂單無法完全滿足)輸出兩行,第一行輸出乙個負整數-1,第二行輸出需要修改訂單的申請人編號。

示例1

輸入

複製

432

5432

1332

4424

輸出

複製

-

12

說明

第1 份訂單滿足後,4 天剩餘的教室數分別為0,3,2,3。

第2 份訂單要求第2 天到第4 天每天提供3 個教室,而第3 天剩餘的教室數為2,因此無法滿足。分配停止,通知第2個申請人修改訂單。

備註:

對於10%的資料,有1≤n,m≤10; 對於30%的資料,有1≤n,m≤1000; 對於70%的資料,有1≤n,m≤105;

對於100%的資料,有1≤n, m≤106, 0≤ri, dj≤109, 1≤sj≤tj≤ n。

noip原題

第一反應線段樹,不過線段樹懶得打,我們用其他方法

差分+二分

我們都知道字首和,所謂差分簡單理解就是字首和的逆運算

字首和:

其中陣列a可以看做是相鄰sum陣列的差值

for

(int i=

1;i<=n;i++

)

差分:

差分就是給你相鄰的差值,然後求出每一項

for

(int i=

1;i<=n;i++

)

字首和是用元資料求元與元之間的並集關係,而差分則是根據元與元之間的邏輯關係求元資料,是互逆思想

這個題為什麼能用二分呢?

二分的條件:狀態的決策過程或者序列是否滿足單調性或者可以區域性捨棄性

如果第x個訂單無法滿足,那x之後的就都不用看了,我們要找的答案就一定在x之前,如果x能滿足,答案就在x之後,這不就是典型的二分嗎?

dif[l[i]]+

=d[i]

;dif[r[i]+1

]-=d[i]

;

我們在讀入時是 d l r,分別表示數量和時間範圍

dif[x]+=d 可以理解為第x天之後(含第x天)的每天都需要數量為d的教室,為什麼?看一下下面的**,need[i]表示第i天的需求,need是由dif推導出來的,也就是dif[i]的結果會影響到第i天之後的每乙個need,這樣我們就可以通過改變dif來實現操作區間

但是我們數量d的範圍是[l,r],所以還要加乙個dif[r[i]+1]-=d[i],也就是第r+1天之後的數量減d,這樣就和之前加d的影響給抵消了,最終效果只體現在區間[l,r]

need[i]

=need[i-1]

+dif[i];if

(need[i]

>a[i]

)return0;

//供不應需 ,教室不夠

#include

using

namespace std;

int n,m;

const

int maxn=

1e6+3;

int dif[maxn]

,need[maxn]

;int a[maxn]

;int d[maxn]

,l[maxn]

,r[maxn]

;bool

isok

(int x)

for(

int i=

1;i<=n;i++

)return1;

}int

main()

while

(lprintf

("-1\n%d"

,l);

return0;

}

每日一題 4月7日題目精講 樹

樹 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k 其他語言262144k 64bit io format lld 題目描述 shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x到y的路徑上的所有點的顏色...

每日一題 5月7日題目精講 火 皇家烈焰

火 皇家烈焰 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld帕秋莉掌握了一種火屬性魔法 由於鍾愛掃雷遊戲,帕秋莉把自己圖書館前的走廊看作乙個一維的掃雷地圖,她製造了很多烈焰,排在這條走廊內 現在帕秋莉告訴你一部分...

每日一題 8月7日題目精講 雙棧排序

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。操作a 如果輸入序列不為空,將第乙個元素壓入...