voidsolve(){ cin >> n >> m; vector<int> vx(n + 1), vy(n + 1); for (int i = 1; i <= n; i++) cin >> vx[i] >> vy[i]; // deb(vx); // deb(vy); sort(alls(vx)); sort(alls(vy)); vector<int> prex(n + 1), sufx(n + 2), prey(n + 1), sufy(n + 2); for (int i = 1; i <= n; i++) { prex[i] += vx[i] + prex[i - 1]; prey[i] += vy[i] + prey[i - 1]; } for (int i = n; i >= 1; i--) { sufx[i] += vx[i] + sufx[i + 1]; sufy[i] += vy[i] + sufy[i + 1]; } deb(vx); deb(prex); deb(sufx); deb(vy); deb(prey); deb(sufy); int ans = 0; for (int x = -2e6; x <= 2e6; x++) { auto it = lower_bound(alls(vx), x); int tmp = 0; if (it == vx.end()) { tmp = n * x - prex[n]; } else { int cnt = it - vx.begin() - 1; tmp = cnt * x - prex[cnt] + sufx[cnt + 1] - (n - cnt) * x; }
int you = m - tmp; if (you < 0) continue; deb(x, tmp, you); auto check = [&](int y) { auto it = lower_bound(alls(vy), y); int val = 0; if (it == vy.end()) { val = n * y - prey[n]; } else { int cnt = it - vy.begin() - 1; val = cnt * y - prey[cnt] + sufy[cnt + 1] - (n - cnt) * y; } return val <= you; };
int st = vy[(n + 1) / 2]; if (check(st) == 0) continue; int l = st, r = 2e6; while (l < r) { int mid = (l + r + 1) >> 1; if (check(mid)) l = mid; else r = mid - 1; } deb(st, r); ans += r - st + 1; // int ql = l; l = -2e6, r = st; while (l < r) { int mid = (l + r) >> 1; if (check(mid)) r = mid; else l = mid + 1; } deb(l, st); ans += st - l + 1; // int qr = r; ans -= 1; // auto cal=[&](int cx,int cy){ // int res=0; // for(int i=1;i<=n;i++){ // res+=abs(vx[i]-cx)+abs(vy[i]-cy); // } // return res; // }; // for(int i=ql;i<=qr;i++){ // //cerr<<"**************************"<<endl; // int res=cal(x,i); // if(res>m){ cerr<<"**************************"<<endl;deb("acm!!!",x,i,res);} // } } cout << ans << endl; }
intgauss(vector<vector<int>>& a, int n, vector<int>& solution){ vector<int> freevar; // 记录自由变量对应的列 vector<int> pivot(n + 1, -1); // 记录每一行的主元所在的列 solution.assign(n + 1, 0); int r = 1; for (int c = 1; c <= n; c++) { int t = r; // 找到当前列中的主元 for (int i = r; i <= n; i++) { if (a[i][c]) { t = i; break; } } if (!a[t][c]) { freevar.push_back(c); continue; // 当前列没有主元,继续到下一列 } pivot[r] = c; // 第 r 行的主元在 c 列 if (t != r) { // 交换行,将主元行放在第 r 行 for (int i = c; i <= n + 1; i++) swap(a[r][i], a[t][i]); } // 消去主元下方的所有行 for (int i = r + 1; i <= n; i++) { if (a[i][c]) for (int j = n + 1; j >= c; j--) a[i][j] ^= a[r][j]; } r++; }
// 检查是否有解 for (int i = r; i <= n; i++) { if (a[i][n + 1]) return0; // 无解 } int tot = 0; int rksz = r - 1; // 这是系数矩阵的秩 // 自由变量根据题目要求情况去赋值 for (auto i : freevar) solution[i] = 1LL << tot, tot++; //------------------------------ for (int i = rksz; i >= 1; i--) { int sum = a[i][n + 1]; for (int j = 1; j <= n; j++) { if (j == pivot[i]) { continue; } // 如果不是主元所在的列 sum ^= (a[i][j] * solution[j]); // 右边已经求出来的,左边自由变量遗留 } solution[pivot[i]] = sum; // 求解对应的主元变量 } assert(rksz <= n); if (rksz < n) return2; // 无穷多解 return1; // 唯一解 } voidsolve(){ int n, m; cin >> n >> m; vector b(n + 1, vector<int>(n + 2)); for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; b[u][v] = b[v][u] = 1; } vector<int> sol(n + 1); int t = gauss(b, n, sol); if (t == 0) cout << "No" << endl; else { for (int i = 1; i <= n; i++) if (sol[i] < 1) { cout << "No" << endl; return; } cout << "Yes" << endl; for (int i = 1; i <= n; i++) cout << sol[i] << " "; } }