P1311 选择客栈

开始写了一个O(n3)的算法,只得了60,后来思考(找题解),得到了一个O(nk)的算法
其实就是一种预处理的思想,对于每一个客栈而言,只要我们预处理出他前面可以匹配的客栈数量,就可以了。
所以我们记录a[i]为颜色i的数量,b[i]为颜色i可匹配的数量
输入每一个客栈,我们都更新a[i],同时如果可匹配,更新b[i],这样我们就在读入的同时预处理,在预处理的同时计算,完成了算法。
这是一个很优美的算法, 值得学习。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int main() {
	int n, k, p;
	cin >> n >> k >> p;
	int ans = 0;
	int a[maxn], b[maxn];
	for(int i = 1; i <= n; i++) {
		int c, v;
		cin >> c >> v;
		a[c]++;
		if(v <= p) {
			for(int j = 0; j < k; j++) {
				b[j] = a[j];
			}
			ans += b[c]-1;
		}
		else {
			ans += b[c];
		}
	}
	cout << ans;
}

posted on 2016-11-13 18:43  蒟蒻konjac  阅读(184)  评论(0编辑  收藏  举报