Advertisement
Guest User

Untitled

a guest
Oct 1st, 2017
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.91 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <string>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <utility>
  10. #include <cstdlib>
  11. #include <memory>
  12. #include <queue>
  13. #include <cassert>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <complex>
  17. #include <bitset>
  18. #include <fstream>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <numeric>
  22.  
  23. using namespace std;
  24.  
  25. #define ws ws_____________________
  26. #define y1 y1_____________________
  27. #define y0 y0_____________________
  28. #define left left_________________
  29. #define right right_______________
  30. #define next next_________________
  31. #define prev prev_________________
  32. #define hash hash_________________
  33.  
  34. #define pb push_back
  35. #define fst first
  36. #define snd second
  37. #define mp make_pair
  38. #define sz(C) ((int) (C).size())
  39. #define forn(i, n) for (int i = 0; i < int(n); ++i)
  40. #define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
  41. #define all(C) begin(C), end(C)
  42.  
  43. typedef long long ll;
  44. typedef unsigned long long ull;
  45. typedef unsigned int uint;
  46. typedef pair<int,int> pii;
  47. typedef pair<ll, ll> pll;
  48. typedef vector<ll> vll;
  49. typedef vector<int> vi;
  50. typedef vector<vi> vvi;
  51. typedef vector<pii> vii;
  52. typedef long double ld;
  53. typedef complex<double> cd;
  54.  
  55. #ifdef LOCAL
  56. #define eprintf(args...) fprintf(stderr, args), fflush(stderr)
  57. #else
  58. #define eprintf(...) ;
  59. #endif
  60.  
  61. #define FILE_NAME "a"
  62.  
  63. const int N = (int)1e8;
  64. char Memory[N];
  65. int curpos = 0;
  66.  
  67. void operator delete (void *p) {}
  68.  
  69. void* operator new (size_t len)
  70. {
  71. assert(curpos + len < N);
  72. char* ans = (Memory + curpos);
  73. curpos += len;
  74. return ans;
  75. }
  76.  
  77. struct Seg {
  78. int num;
  79. int l, r;
  80.  
  81. int len() const {
  82. return r - l + 1;
  83. }
  84. };
  85.  
  86. int m, n;
  87. vector<Seg> segs;
  88.  
  89. bool read() {
  90. if (scanf("%d%d", &m, &n) < 2) {
  91. return 0;
  92. }
  93. vi C(m);
  94. vi P(m);
  95. forn(i, m) {
  96. scanf("%d%d", &C[i], &P[i]);
  97. }
  98.  
  99. segs.clear();
  100.  
  101. segs.pb(Seg{0, 0, 0});
  102. for (int i = 0, j = 0; i < m; i = j) {
  103. if (C[i] == -1) {
  104. j = i + 1;
  105. continue;
  106. }
  107. while (j < m && C[j] == C[i]) {
  108. ++j;
  109. }
  110. segs.pb(Seg{C[i], i + 1, j});
  111. }
  112. segs.pb(Seg{n + 1, m + 1, m + 1});
  113. n += 2;
  114. m += 1;
  115. assert(sz(segs) == n);
  116.  
  117. return 1;
  118. }
  119.  
  120. struct FenwTree {
  121. vi t;
  122.  
  123. FenwTree(int n = 0) {
  124. t.assign(n, -1);
  125. }
  126.  
  127. void upd(int pos, int val) {
  128. for (int i = pos; i < sz(t); i |= i + 1) {
  129. t[i] = max(t[i], val);
  130. }
  131. }
  132.  
  133. int get(int r) {
  134. r = min(r, sz(t) - 1);
  135. int ans = -1;
  136. for (int i = r; i >= 0; i &= i + 1, --i) {
  137. ans = max(ans, t[i]);
  138. }
  139. return ans;
  140. }
  141. };
  142.  
  143. struct SegmTree {
  144. vector<FenwTree> t;
  145. vvi vals;
  146. int sz;
  147.  
  148. SegmTree() {}
  149.  
  150. SegmTree(const vi& a) {
  151. sz = 1;
  152. while (sz < sz(a)) sz *= 2;
  153.  
  154. t.resize(sz * 2);
  155. vals.resize(sz * 2);
  156.  
  157. forn(i, sz(a)) {
  158. vals[sz + i].pb(a[i]);
  159. }
  160. for (int v = sz - 1; v > 0; --v) {
  161. vals[v].resize(sz(vals[v * 2]) + sz(vals[v * 2 + 1]));
  162. merge(all(vals[v * 2]), all(vals[v * 2 + 1]), vals[v].begin());
  163. t[v] = FenwTree(sz(vals[v]));
  164. }
  165. for (int v = sz; v < sz * 2; ++v) {
  166. t[v] = FenwTree(1);
  167. }
  168. }
  169.  
  170. int get_pos(int v, int who) {
  171. const int p = lower_bound(all(vals[v]), who) - vals[v].begin();
  172. return sz(vals[v]) - p - 1;
  173. }
  174.  
  175. void upd(int v, int tl, int tr, int pos, int val, int func) {
  176. const int who = vals[sz + pos].front();
  177. const int p = get_pos(v, who);
  178.  
  179. t[v].upd(p, func);
  180.  
  181. if (tl == tr) {
  182. return;
  183. }
  184.  
  185. int tm = (tl + tr) >> 1;
  186. if (pos <= tm) {
  187. upd(v * 2, tl, tm, pos, val, func);
  188. } else {
  189. upd(v * 2 + 1, tm + 1, tr, pos, val, func);
  190. }
  191. }
  192.  
  193. void upd(int pos, int val, int func) {
  194. upd(1, 0, sz - 1, pos, val, func);
  195. }
  196.  
  197. int get_max(int v, int tl, int tr, int l, int r, int val) {
  198. l = max(l, tl);
  199. r = min(r, tr);
  200.  
  201. if (l > r) {
  202. return -1;
  203. }
  204.  
  205. if (l == tl && r == tr) {
  206. const int p = get_pos(v, val);
  207. return t[v].get(p);
  208. }
  209.  
  210. int tm = (tl + tr) >> 1;
  211. int ans = max(get_max(v * 2, tl, tm, l, r, val), get_max(v * 2 + 1, tm + 1, tr, l, r, val));
  212.  
  213. return ans;
  214. }
  215.  
  216. int get_max(int l, int r, int val) {
  217. return get_max(1, 0, sz - 1, l, r, val);
  218. }
  219. };
  220.  
  221. vi len_seg;
  222. vi pref;
  223.  
  224. void solve() {
  225. len_seg.assign(n, 0);
  226. forn(i, n) {
  227. len_seg[segs[i].num] = (i == 0 || i == n - 1) ? 0 : segs[i].len();
  228. }
  229.  
  230. vi pos_seg(n);
  231. forn(i, n) {
  232. pos_seg[segs[i].num] = i;
  233. }
  234.  
  235. pref.assign(n + 1, 0);
  236. forn(i, n) {
  237. pref[i + 1] = pref[i] + len_seg[i];
  238. }
  239.  
  240. vi vals(n);
  241. forn(i, n) {
  242. vals[i] = pref[i + 1] - (segs[pos_seg[i]].r + 1);
  243. }
  244.  
  245. vi dp(n);
  246. SegmTree T(vals);
  247. for (const auto& seg : segs) {
  248. const int y = seg.num;
  249.  
  250. dp[y] = T.get_max(0, y - 1, pref[y] - seg.l);
  251.  
  252. if (dp[y] != -1 && seg.num != 0 && seg.num != n - 1) {
  253. dp[y] += seg.len();
  254. }
  255.  
  256. if (y == 0) {
  257. dp[y] = 0;
  258. }
  259.  
  260. T.upd(y, vals[y], dp[y]);
  261. }
  262.  
  263. vector<Seg> final_segs;
  264. int y = n - 1;
  265. while (y != 0) {
  266. int best_x = -1;
  267. for (int x = y - 1; x >= 0; --x) {
  268. if (pref[x] > pref[y]) {
  269. continue;
  270. }
  271. if (pref[y] - (segs[pos_seg[y]].l) > pref[x + 1] - (segs[pos_seg[x]].r + 1)) {
  272. continue;
  273. }
  274.  
  275. int ndp = dp[x];
  276. if (ndp != -1 && y != 0 && y != n - 1) {
  277. ndp += segs[pos_seg[y]].len();
  278. }
  279.  
  280. if (ndp == dp[y]) {
  281. best_x = x;
  282. break;
  283. }
  284. }
  285.  
  286. assert(best_x != -1);
  287. final_segs.pb(segs[pos_seg[y]]);
  288. y = best_x;
  289. }
  290. final_segs.pb(segs.front());
  291. reverse(all(final_segs));
  292.  
  293. vi go(m, -1);
  294. vi go_in(m, -1);
  295. forn(i, sz(final_segs) - 1) {
  296. int num0 = final_segs[i].num + 1;
  297. int num1 = final_segs[i + 1].num - 1;
  298.  
  299. int ptr = final_segs[i].r + 1;
  300.  
  301. for (int num = num0; num <= num1; ++num) {
  302. int p = pos_seg[num];
  303. for (int i = segs[p].l; i <= segs[p].r; ++i) {
  304. go[i] = ptr;
  305. go_in[ptr] = i;
  306. ++ptr;
  307. }
  308. }
  309. }
  310.  
  311. vvi ans;
  312. forn(i, m) {
  313. if (go_in[i] == -1 && go[i] != -1) {
  314. vi who;
  315. int j = i;
  316. while (j != -1) {
  317. who.pb(j);
  318. j = go[j];
  319. }
  320. for (int j : who) {
  321. go[j] = -1;
  322. go_in[j] = -1;
  323. }
  324. ans.pb(who);
  325. }
  326. }
  327.  
  328. // go[0] = 1;
  329. // go[1] = 2;
  330. // go[2] = 0;
  331.  
  332. forn(i, m) {
  333. if (go[i] != -1) {
  334. vi who;
  335. int j = i;
  336. while (go[j] != i) {
  337. who.pb(j);
  338. j = go[j];
  339. }
  340. who.pb(j);
  341.  
  342. who.pb(i);
  343.  
  344. for (int j : who) {
  345. go[j] = -1;
  346. go_in[j] = -1;
  347. }
  348. ans.pb(who);
  349. }
  350. }
  351.  
  352. int ans_sum = 0;
  353. for (const auto& c : ans) {
  354. ans_sum += sz(c) - 1;
  355. }
  356. printf("%d %d\n", ans_sum, sz(ans));
  357. for (const auto& c : ans) {
  358. printf("%d ", sz(c));
  359. for (int x : c) {
  360. printf("%d ", x);
  361. }
  362. printf("\n");
  363. }
  364. }
  365.  
  366. int main() {
  367. #ifdef LOCAL
  368. freopen(FILE_NAME ".in", "r", stdin);
  369. // freopen(FILE_NAME ".out", "w", stdout);
  370. #else
  371. // freopen("input.txt", "r", stdin);
  372. // freopen("output.txt", "w", stdout);
  373. #endif
  374.  
  375. while (read()) {
  376. solve();
  377. }
  378.  
  379. #ifdef LOCAL
  380. cerr.precision(5);
  381. cerr << "Time: " << fixed << (double) clock() / CLOCKS_PER_SEC << endl;
  382. #endif
  383. return 0;
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement