#include <stdio.h>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
using TaskList = list<int>;
#define MAX 1000010
void readData(const int n, int* p, int*k, int *c, TaskList* taskListStart, TaskList* taskListStop, int& minTime, int& maxTime)
{
	minTime = MAX;
	maxTime = 0;
	for (int i=0; i<n; ++i)
	{
		scanf("%d %d %d\n", &p[i], &k[i], &c[i]);
		taskListStart[p[i]].push_back(i);
		taskListStop[k[i]].push_back(i);
		minTime = min(minTime, p[i]);
		maxTime = max(maxTime, k[i]);
	}
}
void work(const int m, int*k, int *c, TaskList* taskListStart, TaskList* taskListStop, const int minTime, const int maxTime)
{
	vector<int> currentTasks;
	vector<int> toRemove;
	bool needSort = false;
	for (int i=minTime; i<=maxTime; ++i)
	{
		auto freePlace = [&i, &k, &c](int t){ return k[t] - i- c[t]; };
		auto cmp = [&k, &i, &c](int a, int b)
		{
			const int v1 = k[a] - i- c[a];
			const int v2 = k[b] - i- c[b];
			if (v1 == v2)
				return k[a] > k[b];
			else
				return v1 < v2;
		};
		for (int t: taskListStop[i])
		{
			auto it = find(currentTasks.begin(), currentTasks.end(), t);
			if (it!= currentTasks.end())
				currentTasks.erase(it);
		}
		for (int t: taskListStart[i])
		{
			currentTasks.push_back(t);
			needSort = true;
		}
		if (currentTasks.size() > m && needSort)
		{
			needSort = false;
			sort(currentTasks.begin(), currentTasks.end(), cmp);
		}
		if (currentTasks.size() > m)
		{
			needSort |= freePlace(currentTasks[m-1]) == freePlace(currentTasks[m]);
			needSort |= freePlace(currentTasks[m-1]) == freePlace(currentTasks[m]) - 1;
		}
		for (int i=0; i<min(m, (int)currentTasks.size()); ++i)
		{
			const int task = currentTasks[i];
			if (c[task] <= 1)
			{
				c[task]=0;
				toRemove.push_back(task);
			}
			else
				c[task]--;
		}
		needSort = true;
		for (int task: toRemove)
			currentTasks.erase(find(currentTasks.begin(), currentTasks.end(), task));
		toRemove.clear();
	}
}
int main()
{
	int n, m;
	scanf("%d %d\n", &n, &m);
	int *p = new int[n];
	int *k = new int[n];
	int *c = new int[n];
	TaskList* taskListStart = new TaskList[MAX];
	TaskList* taskListStop = new TaskList[MAX];
	int minTime, maxTime;
	readData(n, p, k, c, taskListStart, taskListStop, minTime, maxTime);
	work(m, k, c, taskListStart, taskListStop, minTime, maxTime);
	int sum = 0;
	for (int i=0; i<n; ++i)
		sum+=c[i];
	if (sum == 0)
		printf("TAK\n");
	else
		printf("NIE\n");
	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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <stdio.h> #include <algorithm> #include <vector> #include <list> using namespace std; using TaskList = list<int>; #define MAX 1000010 void readData(const int n, int* p, int*k, int *c, TaskList* taskListStart, TaskList* taskListStop, int& minTime, int& maxTime) { minTime = MAX; maxTime = 0; for (int i=0; i<n; ++i) { scanf("%d %d %d\n", &p[i], &k[i], &c[i]); taskListStart[p[i]].push_back(i); taskListStop[k[i]].push_back(i); minTime = min(minTime, p[i]); maxTime = max(maxTime, k[i]); } } void work(const int m, int*k, int *c, TaskList* taskListStart, TaskList* taskListStop, const int minTime, const int maxTime) { vector<int> currentTasks; vector<int> toRemove; bool needSort = false; for (int i=minTime; i<=maxTime; ++i) { auto freePlace = [&i, &k, &c](int t){ return k[t] - i- c[t]; }; auto cmp = [&k, &i, &c](int a, int b) { const int v1 = k[a] - i- c[a]; const int v2 = k[b] - i- c[b]; if (v1 == v2) return k[a] > k[b]; else return v1 < v2; }; for (int t: taskListStop[i]) { auto it = find(currentTasks.begin(), currentTasks.end(), t); if (it!= currentTasks.end()) currentTasks.erase(it); } for (int t: taskListStart[i]) { currentTasks.push_back(t); needSort = true; } if (currentTasks.size() > m && needSort) { needSort = false; sort(currentTasks.begin(), currentTasks.end(), cmp); } if (currentTasks.size() > m) { needSort |= freePlace(currentTasks[m-1]) == freePlace(currentTasks[m]); needSort |= freePlace(currentTasks[m-1]) == freePlace(currentTasks[m]) - 1; } for (int i=0; i<min(m, (int)currentTasks.size()); ++i) { const int task = currentTasks[i]; if (c[task] <= 1) { c[task]=0; toRemove.push_back(task); } else c[task]--; } needSort = true; for (int task: toRemove) currentTasks.erase(find(currentTasks.begin(), currentTasks.end(), task)); toRemove.clear(); } } int main() { int n, m; scanf("%d %d\n", &n, &m); int *p = new int[n]; int *k = new int[n]; int *c = new int[n]; TaskList* taskListStart = new TaskList[MAX]; TaskList* taskListStop = new TaskList[MAX]; int minTime, maxTime; readData(n, p, k, c, taskListStart, taskListStop, minTime, maxTime); work(m, k, c, taskListStart, taskListStop, minTime, maxTime); int sum = 0; for (int i=0; i<n; ++i) sum+=c[i]; if (sum == 0) printf("TAK\n"); else printf("NIE\n"); return 0; } | 
 
            
         English
                    English