您的位置:首页 > 其它

POJ-3326(模拟登录统计)

2015-08-14 21:19 323 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: