1. 程式人生 > >Codeforces Round #510 (Div. 2), problem (D) Petya and Array 分治

Codeforces Round #510 (Div. 2), problem (D) Petya and Array 分治

本題如果採用兩層for迴圈遍歷每個l和r,時間複雜度為O(n2),將會超時。所以可以採用分治的演算法,將陣列二分遞迴,完成一個分支之後將此次l和r之間的數進行排序,目的是能以O(n)的時間複雜度統計出此分支符合要求的個數。

ac程式碼:

#include <bits/stdc++.h>
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair<int,int> 
#define LL long long #define INF 1000000001 using namespace std; int n; LL a[200005],t; LL ans; void dg(int l, int r){ if(l==r) return; int mid=(l+r)/2; dg(l,mid); dg(mid+1,r); for(int i=l,j=mid;i<=mid;i++){ while(j<r && (a[j+1]-a[i])<t) j++; ans+=j-mid; } sort(a+l,a+r+1); } int main
() { cin>>n>>t; FORE(i,1,n){ cin>>a[i]; a[i]+=a[i-1]; } dg(0,n); cout<<ans<<endl; return 0; }