ACM訓練日記—4月21日(西安電子科技大學第16屆程式設計競賽網路同步賽)
阿新 • • 發佈:2019-02-01
int n,m,q;
int a[50005];
int mp[50005];
int vis[50005];
int main()
{
priority_queue<int>h;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
while(!h.empty()) h.pop();
memset(vis,-1,sizeof(vis));
memset(mp,0,sizeof(mp));//記錄該位上的值下次出現的位置
for(int i=1;i<=q;i++)
{
scanf("%lld",&a[i]);
if(mp[a[i]]==0)
{
mp[a[i]]=i;
}
else
{
int t=a[i];
vis[mp[t]]=i;
mp[t]=i;
}
}
//for(int i=1;i<=q;i++) cout<<vis[i]<<" ";cout<<endl;
memset(mp,0,sizeof(mp));
int ans=0;
for(int i=1;i<=q;i++)
{
if(mp[a[i]]) continue;//該值在佇列裡
if(h.size()<n)//佇列不滿,繼續放
{
h.push(vis[i]);
mp[a[i]]=1;
ans++;
}
else//取出最小的,因為會優先取出-1(後面沒在出現的值)
{
ll e=h.top();
h.pop();
h.push(vis[i]);
mp[e]=0;
mp[a[i]]=1;
ans++;
}
}
cout<<ans<<endl;
}
}
int a[50005];
int mp[50005];
int vis[50005];
int main()
{
priority_queue<int>h;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
while(!h.empty()) h.pop();
memset(vis,-1,sizeof(vis));
memset(mp,0,sizeof(mp));//記錄該位上的值下次出現的位置
for(int i=1;i<=q;i++)
{
scanf("%lld",&a[i]);
if(mp[a[i]]==0)
{
mp[a[i]]=i;
}
else
{
int t=a[i];
vis[mp[t]]=i;
mp[t]=i;
}
}
//for(int i=1;i<=q;i++) cout<<vis[i]<<" ";cout<<endl;
memset(mp,0,sizeof(mp));
int ans=0;
for(int i=1;i<=q;i++)
{
if(mp[a[i]]) continue;//該值在佇列裡
if(h.size()<n)//佇列不滿,繼續放
{
h.push(vis[i]);
mp[a[i]]=1;
ans++;
}
else//取出最小的,因為會優先取出-1(後面沒在出現的值)
{
ll e=h.top();
h.pop();
h.push(vis[i]);
mp[e]=0;
mp[a[i]]=1;
ans++;
}
}
cout<<ans<<endl;
}
}