1 solutions

  • 0
    @ 2025-12-19 20:22:21

    这道题目思路如下。首先把xxyy分开来算。如何算,可以把所有的减去xx的最小值xmixmi,那么对差值求和就是它在最小值的时候的值。然后考虑移动。向右移动 则左边所有点长度+1+1,右边,所有的点长度1-1,可以通过循环把从最小值到最大值之间所有的值算出来。由于DD小于1e61e6 那么最远是2e6-2e6+2e6+2e6 因为最小值向左和最大值向右都是增加,所以可以大于dd的时候就break。对于每个符合的放到桶里面,值++;对桶求前缀和 那么从小到大遍历xx 对于xx的每个值ii 结果加上qzhytong[Di]qzhytong[D-i] 这需要注意一点 DiD-i>=0>=0

    #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