POJ-3326(模拟登录统计)

题目:http://poj.org/problem?id=3326

题目本身没什么难度,本来想着是不是还得搞个线段树啥的,看了下数据量,暴力即可,这里用了一个标志位,标记是否对某个user的记录进行了预处理,有点“写时复制”的赶脚


#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define MAX_N	1005
#define MAX_M	10005
#define MIN_T	540
#define MAX_T	1260

int N, M, R, Q, time[MAX_N];
struct Record{
	int t, id, flag;
	Record(int a, int b, int c): t(a), id(b), flag(c){}
};
struct User{
	vector<Record> history;
	char use[MAX_T+1];
	bool parsed;

	void parse(){
		memset(use + MIN_T, 0, MAX_T - MIN_T);
		for(int i = 0; i < history.size(); ++i){
			Record& rec = history[i];
			if(rec.flag) time[rec.id] = rec.t;
			else memset(use + time[rec.id], 1, rec.t - time[rec.id]);
		}
		parsed = true;
	}

	void ClearRecord(){
		history.clear();
		parsed = false;
	}
	void AddRecord(int t, int id, int flag){
		history.push_back(Record(t, id, flag));
	}
	int Query(int s, int e){
		if(!parsed) parse();

		int tot = 0;
		for(; s < e; ++s) tot += use[s];
		return tot;
	}
} user[MAX_M];

int main()
{
	int i, t, c, u, f, s, e;
	while(scanf("%d%d", &N, &M), N){
		for(i = 1; i <= M; ++i) user[i].ClearRecord();
		scanf("%d", &R);
		for(i = 0; i < R; ++i){
			scanf("%d%d%d%d", &t, &c, &u, &f);
			user[u].AddRecord(t, c, f);
		}
		scanf("%d", &Q);
		while(Q--){
			scanf("%d%d%d", &s, &e, &u);
			printf("%d\n", user[u].Query(s, e));
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值