intさわだんのBlack History

刹那的レジェンドになりたい。

ICPC 国内予選2007B ログイン/ログアウト記録の解析 AOJ1148

解法:いわれた通りやるだけ。シミュレーション
vector<P>を使って生徒ごとの使用時間を記録しておくと楽

場合分けは以下のとおりやった
f:id:intsawadan:20190324215026j:plain

#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;
        }

    }
}