Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.42 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned long long ull;
  5. typedef unsigned int ui;
  6. typedef long double ld;
  7. typedef pair<int, int> ii;
  8. typedef pair<ii, ii> iii;
  9. ll MOD = 1e9 + 7;
  10. const ld E = 1e-9;
  11. #define null NULL
  12. #define ms(x) memset(x, 0, sizeof(x))
  13. #ifndef LOCAL
  14. #define endl "\n"
  15. #endif
  16. #ifndef LONG_LONG_MAX
  17. #define LONG_LONG_MAX LLONG_MAX
  18. #endif
  19. #define sync ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  20. #define _read(x) freopen(x, "r", stdin)
  21. #define _write(x) freopen(x, "w", stdout)
  22. #define files(x) _read(x ".in"); _write(x ".out")
  23. #define filesdatsol(x) _read(x ".DAT"); _write(x ".SOL")
  24. #define output _write("output.txt")
  25. #define input _read("input.txt")
  26. #define prev time_prev
  27. #define remove tipa_remove
  28. #define next tipa_next
  29. #define mod % MOD
  30. #define y1 hello_world
  31. unsigned char ccc;
  32. bool _minus = false;
  33. template<typename T>
  34. inline T sqr(T t) {
  35. return (t * t);
  36. }
  37. inline void read(ll &n) {
  38. n = 0;
  39. _minus = false;
  40. while (true) {
  41. ccc = getchar();
  42. if (ccc == ' ' || ccc == '\n')
  43. break;
  44. if (ccc == '-') {
  45. _minus = true;
  46. continue;
  47. }
  48. n = n * 10 + ccc - '0';
  49. }
  50. if (_minus)
  51. n *= -1;
  52. }
  53. inline void read(int &n) {
  54. n = 0;
  55. _minus = false;
  56. while (true) {
  57. ccc = getchar();
  58. if (ccc == ' ' || ccc == '\n')
  59. break;
  60. if (ccc == '-') {
  61. _minus = true;
  62. continue;
  63. }
  64. n = n * 10 + ccc - '0';
  65. }
  66. if (_minus)
  67. n *= -1;
  68. }
  69. char wwww[19];
  70. int kkkk;
  71. inline void write(ll y) {
  72. long long x = y;
  73. kkkk = 0;
  74. if (x < 0) {
  75. putchar('-');
  76. x *= -1;
  77. }
  78. if (!x)
  79. ++kkkk, wwww[kkkk] = '0';
  80. else
  81. while (x) {
  82. ++kkkk;
  83. wwww[kkkk] = char(x % 10 + '0');
  84. x /= 10;
  85. }
  86. for (int i = kkkk; i >= 1; --i)
  87. putchar(wwww[i]);
  88. }
  89.  
  90. #ifdef LOCAL
  91. //#define DEBUG
  92. #endif
  93.  
  94. #ifdef DEBUG
  95. #define dbg if(1)
  96. #else
  97. #define dbg if(0)
  98. #endif
  99.  
  100. const int MAX = 3e5;
  101.  
  102. int last[MAX], next[MAX], to[MAX], has[MAX], cost[MAX], size;
  103.  
  104. void _add(int a, int b, int h, int c) {
  105. size++;
  106. next[size] = last[a];
  107. last[a] = size;
  108. to[size] = b;
  109. has[size] = h;
  110. cost[size] = c;
  111. }
  112.  
  113. void add(int a, int b, int h, int c) {
  114. _add(a, b, h, c);
  115. _add(b, a, 0, -c);
  116. }
  117.  
  118. int first[MAX], second[MAX];
  119. int START, END;
  120.  
  121. ll min_dist[MAX];
  122. int from[MAX];
  123. bool used[MAX];
  124.  
  125. ll prev_dist[MAX];
  126.  
  127. const ll INF = 1e18;
  128. set<pair<ll, int> > s;
  129. ll get() {
  130. for (int i = START; i <= END; i++)
  131. min_dist[i] = INF;
  132. min_dist[START] = 0;
  133. s.insert(make_pair(0, START));
  134. int pos;
  135. ll val;
  136. int i;
  137. ll cost;
  138. while (!s.empty()) {
  139. pos = s.begin()->second;
  140. val = s.begin()->first;
  141. s.erase(s.begin());
  142. for (i = last[pos]; i; i = next[i]) {
  143. if (has[i]) {
  144. cost = val + (::cost[i] - prev_dist[to[i]] + prev_dist[pos]);
  145. if (cost < min_dist[to[i]]) {
  146. if (min_dist[to[i]] != INF)
  147. s.erase(make_pair(min_dist[to[i]], to[i]));
  148. min_dist[to[i]] = cost;
  149. from[to[i]] = i;
  150. s.insert(make_pair(min_dist[to[i]], to[i]));
  151. }
  152. }
  153. }
  154. }
  155. ll ans = min_dist[END] - (prev_dist[START] - prev_dist[END]);
  156. for (int i = START; i <= END; i++)
  157. prev_dist[i] = min_dist[i];
  158. if (min_dist[END] == INF)
  159. return min_dist[END];
  160. pos = END;
  161. while (pos != START) {
  162. int ind = from[pos];
  163. has[ind] -= 1;
  164. has[ind ^ 1] += 1;
  165. pos = to[ind ^ 1];
  166. }
  167. return ans;
  168. }
  169.  
  170. pair<ll, int> find() {
  171. for(int i = START; i <= END; i++)
  172. prev_dist[i] = 0;
  173. ll ans = 0;
  174. int v = 0;
  175. ll res = 0;
  176. while (true) {
  177. res = get();
  178. if (res == INF)
  179. break;
  180. ans += res;
  181. v++;
  182. }
  183. return make_pair(ans, v);
  184. }
  185.  
  186. int ar[602];
  187.  
  188. inline int get(int a, int b, int s) {
  189. return min(abs(a - b), s - abs(a - b));
  190. }
  191.  
  192. void solve() {
  193. size = 1;
  194.  
  195. int n, k;
  196. cin >> n >> k;
  197. for (int i = 1; i <= n + k + 2; i++)
  198. last[i] = 0;
  199. vector<int> v1, v2;
  200.  
  201. for (int i = 1; i <= n + k; i++) {
  202. cin >> ar[i + 1];
  203. if (ar[i + 1]) {
  204. v2.push_back(i + 1);
  205. } else {
  206. v1.push_back(i + 1);
  207. }
  208. }
  209.  
  210. START = 1;
  211. END = n + k + 2;
  212. for (int a : v1) {
  213. add(START, a, 1, 0);
  214. }
  215. for (int a : v2) {
  216. add(a, END, ar[a], 0);
  217. }
  218. for (int a : v1) {
  219. for (int b : v2) {
  220. add(a, b, 1, get(a - 1, b - 1, n + k));
  221. }
  222. }
  223.  
  224. START = 1;
  225. END = n + 2 + k;
  226.  
  227. pair<ll, int> res = find();
  228. cout << res.first << endl;
  229.  
  230. }
  231.  
  232. int main() {
  233. sync;
  234. srand(time(NULL));
  235. cout.precision(10);
  236. cout << fixed;
  237. #ifdef LOCAL
  238. input;
  239. #else
  240.  
  241. #endif
  242.  
  243. int t;
  244. cin >> t;
  245. while(t--) {
  246. solve();
  247. }
  248.  
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement