1 solutions
-
0
这道题目思路如下。首先把和分开来算。如何算,可以把所有的减去的最小值,那么对差值求和就是它在最小值的时候的值。然后考虑移动。向右移动 则左边所有点长度,右边,所有的点长度,可以通过循环把从最小值到最大值之间所有的值算出来。由于小于 那么最远是 和 因为最小值向左和最大值向右都是增加,所以可以大于的时候就break。对于每个符合的放到桶里面,值++;对桶求前缀和 那么从小到大遍历 对于的每个值 结果加上 这需要注意一点 要
#include<bits/stdc++.h> using namespace std; #define int long long int n, D; int x[2000005], y[2000005], xj[4000005], yj[4000005], qzhx[200005], qzhy[200005], xzhi[4000005], yzhi[4000005], xtong[1000005], ytong[1000005], xtongqzh[1000005], ytongqzh[1000005]; signed main() { // freopen("02_handmade_01.in","r",stdin); cin >> n >> D; int xmi = 10000000, ymi = 10000000, xma = -1, yma = -1; for (int i = 1; i <= n; i++) { cin >> x[i] >> y[i]; xj[x[i] + 2000000]++; yj[y[i] + 2000000]++; xmi = min(x[i], xmi); xma = max(x[i], xma); ymi = min(y[i], ymi); yma = max(y[i], yma); } ; sort(x + 1, x + n + 1); sort(y + 1, y + n + 1); for (int i = 1; i <= n; i++) { x[i] -= xmi; y[i] -= ymi; } /* for (int i = 1; i <= n; i++) { cout<<x[i]<<" "; } cout<<endl; for (int i = 1; i <= n; i++) { cout<<y[i]<<" "; } */ int ttx = 0, tty = 0; for (int i = 1; i <= n; i++) { ttx += x[i]; tty += y[i]; } //cout<<ttx<<" "<<tty; xzhi[xmi + 2000000] = ttx; yzhi[ymi + 2000000] = tty; // cout<<ttx<<" "<<tty<<endl; if (ttx <= D)xtong[ttx]++; if (tty <= D)ytong[tty]++; for (int i = 1; i <= n; i++) { x[i] += xmi; y[i] += ymi; } for (int i = xmi - 1 + 2000000; i >= 0; i--) { xzhi[i] = xzhi[i + 1] + n; if (xzhi[i] <= D)xtong[xzhi[i]]++; else break; // cout<<xzhi[i]<<endl;; } for (int i = ymi - 1 + 2000000; i >= 0; i--) { yzhi[i] = yzhi[i + 1] + n; if (yzhi[i] <= D)ytong[yzhi[i]]++; else break; // cout<< yzhi[i]<<endl ; } int l = xj[xmi + 2000000], r = n - xj[xmi + 2000000 ]; for (int i = xmi + 1 + 2000000; i <= 4000000; i++) { xzhi[i] = xzhi[i - 1] + l - r; l += xj[i]; r -= xj[i]; if (xzhi[i] <= D)xtong[xzhi[i]]++; if(i>xma&&xzhi[i]>=D)break; } l = yj[ymi + 2000000], r = n - yj[ymi + 2000000]; for (int i = ymi + 1 + 2000000; i <= 4000000; i++) { yzhi[i] = yzhi[i - 1] + l - r; l += yj[i]; r -= yj[i]; if (yzhi[i] <= D)ytong[yzhi[i]]++; if(i>yma+2000000&&yzhi[i]>=D)break; } xtongqzh[0] = xtong[0]; ytongqzh[0] = ytong[0]; for (int i = 1; i <=D; i++) { xtongqzh[i] = xtongqzh[i - 1] + xtong[i]; ytongqzh[i] = ytongqzh[i - 1] + ytong[i]; } /* for (int i = 0; i <= D; i++) { cout << xtongqzh[i]<<" "; } cout<<endl; for (int i = 0; i <= D; i++) { cout << xtongqzh[i]<<" "; } cout<<endl;*/ int ttt = 0; for (int i = 0; i <= D; i++) { if (D - i >= 0) ttt += xtong[i] * ytongqzh[D - i] ; } cout << ttt; }
- 1
Information
- ID
- 705
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 4
- Accepted
- 1
- Uploaded By