華哥倒酒(二分答案)

2021-07-05 06:53:00 字數 1393 閱讀 8923

今天華哥請吃飯,待會兒打完比賽不要跑了。

華哥現在已經去飯店了,他在桌子上整齊地擺放了n個空酒杯,編號為i酒杯的容量為ri。他有m條理(jie)由(kou)要往某寫杯子裡加酒。第j條理由是往編號為sj到編號為tj的杯子中倒入dj的酒。但是華哥並被注意到,在他祭出他的某條理由後,有些杯子中的酒就會漫出來!(已經倒入的酒的量大於了杯子的容量)然而,猥(ji)瑣(zhi)的上決╇ф早已經看穿了這一切。他想知道,華哥的哪條理由會造成第一次漫出。但是他實在是太懶了,這個問題就丟給你了……

input

第一行包含兩個正整數n,m,表示酒杯的數量和華哥的理由條數。

第二行包含n個正整數,其中第i個數為ri,表示編號為i的酒杯的容量。

接下來有m行,每行包含三個正整數dj,sj,tj,表示第j條理由,往編號為sj到編號為tj的杯子中倒入dj的酒。每行相鄰的兩個數之間均用乙個空格隔開。酒杯編號和理由編號都從1開始。

output

如果沒有漫出的情況發生,輸出「0」。

否則第一排輸出乙個「-1」,第二排輸出第一次造成漫出的理由的編號。

4 3

2 5 4 3

2 1 3

3 2 4

4 2 4

-1

2

hint

對於100%的資料,有1≤n,m≤4*10^5,0≤ri,dj≤10^9,1≤sj≤tj≤n。

描述第一句話反正我是不信。//1≤n,m≤4*10^5,線段樹區間更新是可以做的

//但是這道題是簡化版,若:1<=n,m<=10^6

//線段樹做就可能會超時(也許會卡過,姿勢要好)

//所以,可以二分答案o(logm * n)

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

#define maxn 400005

#define inff 0x7fffffff

typedef long long ll;

int a[maxn],lx[maxn],rx[maxn],val[maxn];

ll sum[maxn];//字首和

int n,m,l,r;

int fun(int mid)

int re=0;

for(int i=n;i>=1;i--)

return 0;//沒找到

}int main()

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

l=1,r=m;//對m次詢問進行二分

int flag=0;

while(l 

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...

二分與二分答案學習

判斷left,mid,right的符號進行區間的精確。如下為遞迴二分求零點的操作 double find zero point double left,double right,double precesion double mid right left 2 if f mid 0 if f mid ...