Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- #include <unordered_map>
- #include <algorithm>
- using namespace std;
- #define MAXM 1000010
- struct arc_t {
- int m, f;
- };
- vector<arc_t> archi;
- vector<arc_t> presi;
- int N, M, F;
- int main() {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- scanf("%d%d%d", &M, &F, &N);
- for (int i = 0; i < N; i++) {
- int m, f;
- scanf("%d%d", &m, &f);
- archi.push_back({m, f});
- }
- vector<arc_t> tail(N);
- tail[0] = archi[0];
- int length = 1;
- for (int i = 0; i < N; i++) {
- /*
- printf("(%d, %d)\n", archi[i].m, archi[i].f);
- /// Mostro la sequenza corrente
- for (int j = 0; j < length; j++) {
- printf("[%d, %d]", tail[j].m, tail[j].f);
- }
- printf("\n");
- */
- if (max(archi[i].m, archi[i].f) < min(tail[0].m, tail[0].f)) {
- //printf("\tNuova sequenza\n");
- tail[0] = archi[i];
- }
- else if (min(archi[i].m, archi[i].f) > max(tail[length-1].m, tail[length-1].f)) {
- //printf("\tEstendo\n");
- tail[length++] = archi[i];
- }
- else {
- int lo = 0, hi = length-1;
- while (lo <= hi) {
- int mid = (lo+hi) / 2;
- /// Se tail[mid] si trova prima o si interseca con archi[i]
- if (max(tail[mid].m, tail[mid].f) <= min(archi[i].m, archi[i].f)) {
- lo = mid + 1;
- }
- else {
- hi = mid - 1;
- }
- }
- if (lo < length)
- tail[lo] = archi[i];
- }
- //printf("\n");
- }
- printf("%d\n", length*2);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement