Analyzing Login/Logout Records
2年前に,時間切れになったやつだね.たしか,break するタイミングが1つ遅かったのが原因だった気がします.
学生ごとにテーブルを用意してやって,true の時間を数えます.
#include <iostream> #include <fstream> using namespace std; #define TIME 720 int main() { // // ファイル // ifstream fin("a.in"); ofstream fout("a.out"); // // 入力 // while(true) { int pc, stu; fin >> pc >> stu; //cout << pc << " " << stu << endl; if(pc == 0 && stu == 0) break; // 利用記録 int r; fin >> r; //cout << r << endl; int (*log)[TIME]= new int[stu+1][TIME]; // 利用記録 int *f = new int [stu+1]; // 生徒のログインフラグ // 初期化 for(int i = 0; i < stu+1; i++) { for(int j = 0; j < TIME; j++) { log[i][j] = false; } } for(int i = 0; i < stu+1; i++) { f[i] = 0; } // 利用記録をとる // log[学生番号][時間(true-logon,false-logout)] for(int i = 0; i < r; i++) { int t, n, m, s; fin >> t >> n >> m >> s; //cout << t << " " << n << " " << m << " " << s << endl; if(s == 1) { f[m]++; } else { f[m]--; } if(f[m] > 0) { for(int j = t - 540; j < TIME; j++) { log[m][j] = true; } } else { for(int j = t - 540; j < TIME; j++) { log[m][j] = false; } } } // // 質問 // int q; fin >> q; //cout << q << endl; for(int k = 0; k < q; k++) { int ts, te, m; fin >> ts >> te >> m; //cout << ts << " " << te << " "<< m << endl; int c = 0; for(int i = ts-540; i < te-540; i++) { if(log[m][i]) { c++; //cout << i+540 << " " << c << endl; } } cout << c << endl; fout << c << endl; } delete[] log; } // // 後片付け // fin.close(); fout.close(); return 0; }