#include <stdio.h>
#include <stdlib.h>
#define MAX_NM 1000*1010
struct DATA {
int l, r, k;
};
struct DATA in[MAX_NM];
int n, m;
int c[MAX_NM+1];
int compare_asc(const void *arg1, const void *arg2) {
return (((struct DATA *)arg1)->l - ((struct DATA *)arg2)->l);
}
int next_int;
int has_next(int kol) {
for(int i = next_int+1; i < m; i++) {
if(in[i].k == kol) {
next_int = i;
return 1;
}
}
return 0;
}
int get_next() {
return next_int;
}
void iterate(int kol, int step) {
// printf("iterate: %d %d\n", kol, step); fflush(stdout);
int idx = -1;
next_int = -1;
while(has_next(kol) && idx < n) {
int next = get_next();
// printf("next=%d; kol=%d\n", next, kol); fflush(stdout);
int from = in[next].l;
int to = in[next].r;
while(idx < to) {
idx++;
if (from <= idx && idx <= to) {
c[idx] += step;
}
}
}
}
int main() {
// Read data and initialize tables
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
c[i] = 0;
}
for(int i = 0; i < m; i++) {
scanf("%d %d %d", &(in[i].l), &(in[i].r), &(in[i].k));
}
// printf("sort\n"); fflush(stdout);
// Sort input by left edge
qsort(in, m, sizeof(*in), compare_asc);
// Iterate for yellow (c[i]++)
iterate(1, 1);
// TODO: iterate for blue (c[i]++)
iterate(2, 1);
// TODO: iterate for red (c[i] += 3)
iterate(3, 3);
// printf("in:\n");
// for(int i = 0; i < m; i++) {
// printf("[%d]: %d %d %d\n", i, in[i].l, in[i].r, in[i].k);
// }
// Count green paint cans
// (0 - white; 1 - yellow/blue; 2 - green; other - other color)
int ret = 0;
for (int i = 1; i <= n; i++) {
// printf("[%d]=%d, ", i, c[i]);
if (c[i] == 2) {
ret++;
}
}
printf("%d", ret);
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 79 80 81 82 83 84 85 | #include <stdio.h> #include <stdlib.h> #define MAX_NM 1000*1010 struct DATA { int l, r, k; }; struct DATA in[MAX_NM]; int n, m; int c[MAX_NM+1]; int compare_asc(const void *arg1, const void *arg2) { return (((struct DATA *)arg1)->l - ((struct DATA *)arg2)->l); } int next_int; int has_next(int kol) { for(int i = next_int+1; i < m; i++) { if(in[i].k == kol) { next_int = i; return 1; } } return 0; } int get_next() { return next_int; } void iterate(int kol, int step) { // printf("iterate: %d %d\n", kol, step); fflush(stdout); int idx = -1; next_int = -1; while(has_next(kol) && idx < n) { int next = get_next(); // printf("next=%d; kol=%d\n", next, kol); fflush(stdout); int from = in[next].l; int to = in[next].r; while(idx < to) { idx++; if (from <= idx && idx <= to) { c[idx] += step; } } } } int main() { // Read data and initialize tables scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { c[i] = 0; } for(int i = 0; i < m; i++) { scanf("%d %d %d", &(in[i].l), &(in[i].r), &(in[i].k)); } // printf("sort\n"); fflush(stdout); // Sort input by left edge qsort(in, m, sizeof(*in), compare_asc); // Iterate for yellow (c[i]++) iterate(1, 1); // TODO: iterate for blue (c[i]++) iterate(2, 1); // TODO: iterate for red (c[i] += 3) iterate(3, 3); // printf("in:\n"); // for(int i = 0; i < m; i++) { // printf("[%d]: %d %d %d\n", i, in[i].l, in[i].r, in[i].k); // } // Count green paint cans // (0 - white; 1 - yellow/blue; 2 - green; other - other color) int ret = 0; for (int i = 1; i <= n; i++) { // printf("[%d]=%d, ", i, c[i]); if (c[i] == 2) { ret++; } } printf("%d", ret); return 0; } |
English