思路是:
先按照ID排序
再把每个ID的TS排序
然后计算每个ID最后的优先级总和
标志为1就是还在优先缓存的饭店
数量加起来就是答案
吧
# include <iostream>
using namespace std;
int id[100001]={
0};
int ts[100001]={
0};
int from[100001]={
0};
int to[100001]={
0};
int judge[100001]={
0};
int N,M,T;
void sort(int left,int right)
{
if(left>=right)
return ;
int i=left;
int j=right;
int pivot=id[left];
int temp=ts[left];
while(i<j)
{
while(i<j && id[j]>=pivot)
j--;
if(i<j)
{
id[i]=id[j];
ts[i]=ts[j];
}
while(i<j && id[i]<=pivot)
i++;
if(i<j)
{
id[j]=id[i];
ts[j]=ts[i];
}
id[i]=pivot;
ts[i]=temp;
sort(left,i-1);
sort(i+1,right);
}
}
void sort_ts(int left,int right)
{
if(left>=right)
return ;
int i=left;
int j=right;
int temp=ts[left];
while(i<j)
{
while(i<j && ts[j]>=temp)
j--;
if(i<j)
ts[i]=ts[j];
while(i<j && ts[i]<=temp)
i++;
if(i<j)
ts[j]=ts[i];
ts[i]=temp;
sort_ts(left,i-1);
sort_ts(i+1,right);
}
}
void find_sort(int num)
{
int i,j,k;
int begin=-1,end=M-1;
for(i=0;i<M;i++)
{
if(id[i]==num)
{
begin=i;break;
}
}
if(begin==-1)
return ;
for(i=begin;i<M;i++)
{
if(i==(M-1))
{
end=i;break;
}
if(id[i]!=num && i<(M-1))
{
end=i-1;break;
}
}
from[num]=begin;to[num]=end;
sort_ts(begin,end);
}
void cal(int num)
{
if(from[num]==0 && to[num]==0)
return ;
int flag=0;
int score=0;
int begin=from[num];
int end=to[num];
int i,temp;
for(i=begin;i<=end;i++)
{
if(i!=begin)
{
if(ts[i]!=ts[i-1])
temp=score-(ts[i]-ts[i-1]-1);
else
temp=score-(ts[i]-ts[i-1]);
if(temp>0)
score=temp;
else
score=0;
}
score=score+2;
if(flag==0 && score>5)
flag=1;
else if(flag==1 && score<=3)
flag=0;
}
temp=score-(T-ts[end]);
if(temp>0)
score=temp;
else
score=0;
if(flag==0 && score>5)
flag=1;
else if(flag==1 && score<=3)
flag=0;
if(flag==1)
judge[num]=1;
}
int main()
{
cin>>N>>M>>T;
int i,sum=0;
for(i=0;i<M;i++)
cin>>ts[i]>>id[i];
sort(0,M-1);
for(i=0;i<N;i++)
find_sort(i+1);
for(i=1;i<=N;i++)
cal(i);
for(i=1;i<=N;i++)
if(judge[i]==1)
sum++;
cout<<sum;
return 0;
}