今天華哥請吃飯,待會兒打完比賽不要跑了。華哥現在已經去飯店了,他在桌子上整齊地擺放了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 32 5 4 3
2 1 3
3 2 4
4 2 4
-12
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 ...