// OB会夏合宿2011 Day4 H : 委員長の魔女 #include #include #include #include using namespace std; // 2分探索でp[L] < t < p[L+1]を満たすLを探す int getIdx(vector &p, int t){ int L = 0, R = p.size(); while(R-L>1){ int mid = (L+R)/2; if(p[mid] < t && t < p[mid+1]) return mid; if(t < p[mid]) R = mid; if(p[mid+1] < t) L = mid; } return L; } long long calc(vector &s, vector &t, vector &p){ long long sumA[100001]; long long sumB[100001]; // sumA : 偶数番目の区間の和 sumA[0] = p[1]-p[0]; for(int i=1;i+1 t[i]) continue; int L = getIdx(p, s[i]); int R = getIdx(p, t[i]); // 糸の始点・終点が同一区間に存在 if(L==R) res += t[i]-s[i]; else { // 糸の始点から最初の爆破点までの長さ res += p[L+1]-s[i]; // 途中の区間の長さの和を加える if(L+1> N >> M){ vector s(N), t(N), p(M+2); for(int i=0;i