#include <cstdio> #include <vector> #include <algorithm> #define REP(i,n) for(int i=0; i<(n); ++i) typedef long long LL; struct In { std::vector<std::vector<int>> A; void read() { int n,k; scanf("%d%d",&n,&k); A.resize(k); REP(i,k) A[i].resize(n); REP(i,k) REP(j,n) scanf("%d",&A[i][j]); } void gen() { } }; void heura(const In &I, std::vector<int> &res) { int k = I.A.size(), n = I.A[0].size(); LL D[5]={}; REP(i,n) { int B[5]; REP(j,k) B[j] = I.A[j][i]; std::sort(B,B+k); res[i] = B[k/2]; REP(j,k) D[j] += std::abs(I.A[j][i]-res[i]); } } void go(const In &I, std::vector<int> &res) { int k = I.A.size(), n = I.A[0].size(); res.resize(n); if(k==2) { LL s = 0; REP(i,n) s += std::abs(I.A[0][i]-I.A[1][i]); LL r = 0; REP(i,n) { int d = I.A[0][i]-I.A[1][i], ad = std::abs(d); if(r+ad<s/2) res[i] = I.A[0][i]; else if(r>s/2) res[i] = I.A[1][i]; else res[i] = I.A[1][i] + (d>0?s/2-r:r-s/2); r += ad; } } else heura(I,res); } void brute(const In &I) { } void test() { } int main() { test(); In I; I.read(); std::vector<int> res; go(I,res); for(int i : res) printf("%d ",i); puts(""); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <cstdio> #include <vector> #include <algorithm> #define REP(i,n) for(int i=0; i<(n); ++i) typedef long long LL; struct In { std::vector<std::vector<int>> A; void read() { int n,k; scanf("%d%d",&n,&k); A.resize(k); REP(i,k) A[i].resize(n); REP(i,k) REP(j,n) scanf("%d",&A[i][j]); } void gen() { } }; void heura(const In &I, std::vector<int> &res) { int k = I.A.size(), n = I.A[0].size(); LL D[5]={}; REP(i,n) { int B[5]; REP(j,k) B[j] = I.A[j][i]; std::sort(B,B+k); res[i] = B[k/2]; REP(j,k) D[j] += std::abs(I.A[j][i]-res[i]); } } void go(const In &I, std::vector<int> &res) { int k = I.A.size(), n = I.A[0].size(); res.resize(n); if(k==2) { LL s = 0; REP(i,n) s += std::abs(I.A[0][i]-I.A[1][i]); LL r = 0; REP(i,n) { int d = I.A[0][i]-I.A[1][i], ad = std::abs(d); if(r+ad<s/2) res[i] = I.A[0][i]; else if(r>s/2) res[i] = I.A[1][i]; else res[i] = I.A[1][i] + (d>0?s/2-r:r-s/2); r += ad; } } else heura(I,res); } void brute(const In &I) { } void test() { } int main() { test(); In I; I.read(); std::vector<int> res; go(I,res); for(int i : res) printf("%d ",i); puts(""); return 0; } |