题意:给出每个人在某台电脑的登录时间与下线时间,求在某个时间段某个人的上线时间。

题解:大模拟~可以先记录每个人的上下线时间点,看做一个区间的左右界限,然后记录区间深度,如果到某个时间点时,区间深度大于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 }