問題描述
元宵佳節,一場別開生面的燈籠大賽熱鬧非凡。NN 位技藝精湛的燈籠師依次落座,每位師傅都有相應的資歷值,其中第 ii 位師傅的資歷值為 AiAi?。從左到右,師傅們的資歷值逐級遞增(即 A1<A2<?<ANA1?<A2?<?<AN?)。同時,每位師傅都帶來了自己精心制作的燈籠,其亮度值依次為 B1,B2,??,BNB1?,B2?,?,BN?。
大賽中,主持人會選擇一個區間 [L,R][L,R](1≤L<R≤N1≤L<R≤N),讓這個區間內的師傅們進行兩兩比拼,構成一場“燈籠大亂斗”。
比拼規則如下:假設在區間 [L,R][L,R] 中,由師傅 ii 和師傅 jj(L≤i<j≤RL≤i<j≤R)進行對決。對決雙方分別持有自己的燈籠。
- 如果師傅 ii 的燈籠亮度 BiBi? 小于師傅 jj 的燈籠亮度 BjBj?,則雙方交換燈籠(相應地,如果 Bi≥BjBi?≥Bj?,則不交換)。
- 雙方最終的得分計算方式為:資歷值 + 持有燈籠的亮度。得分高者獲勝,得分相同則平局。
由于在比賽中,資歷深的師傅輸給資歷淺的師傅,將會有損顏面。因此,為了避免這種情況發生,主持人需要選擇必勝區間。
必勝區間定義:如果一個區間內任意兩位師傅進行比賽,資歷值高的師傅都必定能夠獲勝,則稱該區間為必勝區間。
現在,請你幫主持人算算,必勝區間共有多少個?
輸入格式
第一行包含一個整數 NN (1≤N≤105)(1≤N≤105),表示燈籠師傅的數量。
第二行包含 NN 個整數 A1,A2,…,ANA1?,A2?,…,AN? (1≤Ai≤109)(1≤Ai?≤109),表示每位師傅的資歷值,滿足 A1<A2<?<ANA1?<A2?<?<AN?。
第三行包含 NN 個整數 B1,B2,…,BNB1?,B2?,…,BN? (1≤Bi≤109)(1≤Bi?≤109),表示每位師傅的燈籠亮度值。
輸出格式
輸出一個整數,表示必勝區間的總數量。
樣例輸入
3 1 3 5 3 4 1
樣例輸出
1
?[L,R]必勝,只需要看R+1和R的關系就好了,如果R+1能贏R,則R+1必勝[L,R]
具體證明不會
#include <iostream>
using namespace std;
int main()
{int n;cin>>n;int an[n], bn[n], cn[n];for(int i=0; i<n; i++){cin>>an[i];} for(int i=0; i<n; i++){cin>>bn[i];} long long int num = 1, res = 0;for(int i=1; i<n; i++){if(bn[i] > bn[i-1]){if(an[i] - bn[i] > an[i-1] - bn[i-1]){res += num;++num;}else{num = 1;}}else{if(an[i] + bn[i] > an[i-1] + bn[i-1]){res += num;++num;}else{num = 1;}}}cout<< res;return 0;
}
結果res類型必須為longlongint ,int是不行的