POJ 3326

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

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

你可能感兴趣的:(poj)