Problem 8. Novice urbanist 巧妙的暴力
对于一条斑马线和一栋建筑,斑马线在移动到该建筑范围内的移动长度l(矢量),是一个区间内的值。
也就是当移动距离选取区间l内的值时,这条斑马线满足条件。
离线,区间更改,N个查询。前缀和+1,-1。
此外由于建筑有重叠,重叠的建筑需要看做一个区间,即把建筑处理成不相交的区间。
上代码
#include <bits/stdc++.h> const long long mod = 1e9+7; const double ex = 1e-10; #define inf 0x3f3f3f3f using namespace std; int a[11111]; struct node { int l,r; }B[1111],E[1111]; int sum[5000000]; bool cmp(node x,node y) { return x.l<y.l; } int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); int N,M; cin >>N >>M; for (int i = 1;i<=N ;i++) { scanf("%d",&a[i]); } for (int i = 1;i<=M; i++) { scanf("%d%d",&B[i].l,&B[i].r); } sort(B+1,B+M+1,cmp); int cnt = 0; int R=-1; for (int i = 1;i<=M; i++){ if (B[i].l > R ) { E[cnt].r = R; E[++cnt].l = B[i].l; } R = max(R,B[i].r); } E[cnt].r = R; for (int i = 1 ; i<=N; i++) for (int j = 1; j <= cnt; j++) { sum[E[j].r - a[i] + 2000000+1]--; sum[E[j].l - a[i] + 2000000]++; } int ans = 0,t = 0; int tsum = 0; for (int i = 0;i<=4000011; i++) { tsum+=sum[i]; if (tsum > ans) {ans = tsum;t = abs(i-2000000);} else if (tsum == ans) t = min(t,abs(i-2000000)); } cout << t <<" " <<ans<<endl; return 0; }