#include <iostream> #include <vector> using namespace std; template<typename V> class FenwickTree { // Fenwick Tree a.k.a. Binary Indexed Tree // Stores values at indexes and answers question of the form "sum of all values in the range [m,n]". // O(log n) for update and range sum query private: int tree_size; vector<V> tree_as_array; int getLeastSignificantBit(int number) { return number & (-number); } public: FenwickTree(int n) { tree_size = n; tree_as_array.assign(tree_size + 1, 0); } V getRangeSum(int range_start, int range_end) { // returns range sum of [range_start,range_end] V start_sum = getRangeSum(range_start - 1); V end_sum = getRangeSum(range_end); return end_sum - start_sum; } V getRangeSum(int index) { // returns range sum of [1,index] V sum = 0; while (index > 0) { sum += tree_as_array[index]; index -= getLeastSignificantBit(index); } return sum; } void increaseValueAtIndex(int index, V increment) { while (index <= tree_size) { tree_as_array[index] += increment; index += getLeastSignificantBit(index); } } }; #define MAX_SIZE 1000000 bool considerRange(int a, int b, FenwickTree<int>& fenwick) { int sum = fenwick.getRangeSum(a, b); if (sum > 0) { return true; } for (int contained = a; contained <= b; contained++) { fenwick.increaseValueAtIndex(contained, 1); } return false; } int main() { while (true) { int one_time_tasks_count, repeating_tasks_count; cin >> one_time_tasks_count >> repeating_tasks_count; if (one_time_tasks_count == 0 && repeating_tasks_count == 0) break; // input int one_time_task[100][2], repeating_task[100][3]; for (int i = 0; i < one_time_tasks_count; i++) cin >> one_time_task[i][0] >> one_time_task[i][1]; for (int i = 0; i < repeating_tasks_count; i++) cin >> repeating_task[i][0] >> repeating_task[i][1] >> repeating_task[i][2]; FenwickTree<int> fenwick = FenwickTree<int>(MAX_SIZE); bool overlap = false; for (int i = 0; i < one_time_tasks_count && !overlap; i++) { int a = one_time_task[i][0] + 1, b = one_time_task[i][1]; overlap = considerRange(a, b, fenwick); } for (int i = 0; i < repeating_tasks_count && !overlap; i++) { int a = repeating_task[i][0] + 1, b = repeating_task[i][1]; while (a <= MAX_SIZE && !overlap) { if (b > MAX_SIZE) b = MAX_SIZE; overlap = considerRange(a, b, fenwick); a += repeating_task[i][2]; b += repeating_task[i][2]; } } if (!overlap) cout << "NO "; cout << "CONFLICT" << endl; } return 0; }
Friday, April 24, 2015
UVa 11926 - Multitasking
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment