题意:给出每个人在某台电脑的登录时间与下线时间,求在某个时间段某个人的上线时间。
题解:大模拟~可以先记录每个人的上下线时间点,看做一个区间的左右界限,然后记录区间深度,如果到某个时间点时,区间深度大于0,就说明这个人在线,否则,就不在。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 struct data 7 { 8 int p,t; 9 bool lg; 10 data(){} 11 data(int _p,int _t,bool _lg){p=_p;t=_t;lg=_lg;} 12 }; 13 vector<data> po[10005]; 14 int main() 15 { 16 int n,m; 17 //freopen("data.txt","r",stdin); 18 while(scanf("%d%d",&n,&m),n||m) 19 { 20 for(int i=1;i<=m;i++) 21 po[i].clear(); 22 int r,q,t,nn,mm,s; 23 scanf("%d",&r); 24 for(int i=0;i<r;i++) 25 { 26 scanf("%d%d%d%d",&t,&nn,&mm,&s); 27 po[mm].push_back(data(nn,t,s)); 28 } 29 scanf("%d",&q); 30 for(int i=0;i<q;i++) 31 { 32 int x,y,len,ans=0,lx; 33 scanf("%d%d%d",&x,&y,&mm); 34 lx=x; 35 len=po[mm].size(); 36 int cnt=0; 37 for(int j=0;j<len;j++) 38 { 39 if(po[mm][j].t>y) 40 { 41 if(cnt>0) 42 ans+=y-lx; 43 break; 44 } 45 else if(po[mm][j].t>=x) 46 { 47 if(cnt>0) 48 ans+=po[mm][j].t-lx; 49 lx=po[mm][j].t; 50 } 51 if(po[mm][j].lg) 52 cnt++; 53 else 54 cnt--; 55 } 56 printf("%d\n",ans); 57 } 58 } 59 return 0; 60 }