ICPC 国内予選2007B ログイン/ログアウト記録の解析 AOJ1148
解法:いわれた通りやるだけ。シミュレーション
vector<P>を使って生徒ごとの使用時間を記録しておくと楽
場合分けは以下のとおりやった
#include <bits/stdc++.h> #define chmin(a, b) ((a)=min((a), (b))) #define chmax(a, b) ((a)=max((a), (b))) #define fs first #define sc second #define eb emplace_back using namespace std; typedef long long ll; typedef pair<int, int> P; typedef tuple<int, int, int> T; const ll MOD=1e9+7; const ll INF=1e18; int dx[]={1, -1, 0, 0}; int dy[]={0, 0, 1, -1}; int data[1005][4]; int main(){ int n,m,r,q; while(true){ cin >> n >> m; if(n + m == 0) break; cin >> r; for(int i = 0;i < r;i++){ for(int j = 0;j < 4;j++){ cin >> data[i][j]; } } vector<P> use[10005]; for(int i = 0;i < r;i++){ if(data[i][3] == 0) continue; for(int j = i+1;j < r;j++){ if(data[i][1] == data[j][1] && data[i][2] == data[j][2]){ use[data[i][2]].push_back(P(data[i][0],data[j][0])); break; } } } cin >> q; for(int i_ = 0;i_ < q;i_++){ int a,b,stu,st,en; cin >> st >> en >> stu; // cout << "st:" << st << ", en:" << en << endl; int ans = 0; for(int i = 0;i < use[stu].size();i++){ a = use[stu][i].fs; b = use[stu][i].sc; // cout << a << " " << b << endl; if(b <= st){ //1 continue; }else if(a <= st && b > st && b < en){ //2 ans += b - st; st = b; }else if(a <= st && b >= en){ //3 ans += en - st; break; }else if(a >= st && b < en){ // 4 ans += b - a; st = b; }else if(a < en && b >= en){ // 5 ans += en - a; break; }else{ // 6 break; } } cout << ans << endl; } } }