首页 > 代码库 > bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换
bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换
bzoj1528[POI2005]sam-Toy Cars
bzoj1826[JSOI2010]缓存交换
题意:
Jasio有n个不同的玩具,它们都被放在了很高的架子上,地板上不会有超过k个玩具。当Jasio想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架子使得地板上有足够的空间。他的妈妈知道孩子的p个请求,求通过决定每次换玩具时换下哪个所能使他妈妈架子上拿玩具的次数的最小值。k≤100000,p≤500000。bzoj1826中的玩具种类需离散化。
题解:
首先求出每个请求的下一次对同种类玩具的请求的位置。之后维护一个优先队列求当前地板上玩具的下次请求位置,每次换玩具时把下次请求位置最大的弹出。
代码(1528):
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #include <set> 6 #define inc(i,j,k) for(int i=j;i<=k;i++) 7 #define maxn 500010 8 #define INF 0x3fffffff 9 using namespace std; 10 11 inline int read(){ 12 char ch=getchar(); int f=1,x=0; 13 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} 14 while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar(); 15 return f*x; 16 } 17 struct nd{ 18 int v,id; bool operator < (const nd&a)const{return v<a.v;} 19 }; 20 priority_queue<nd>q; 21 int n,k,p,a[maxn],next[maxn],tot,ans,last[maxn]; bool zsye[maxn]; 22 int main(){ 23 n=read(); k=read(); p=read(); inc(i,1,p)a[i]=read(); 24 inc(i,1,n)last[i]=p+1; for(int i=p;i>=1;i--)next[i]=last[a[i]],last[a[i]]=i; 25 inc(i,1,p){ 26 if(!zsye[a[i]]){ 27 if(tot<k){ 28 zsye[a[i]]=1; ans++; tot++; 29 if(next[i])q.push((nd){next[i],a[i]});else q.push((nd){p+1,a[i]}); 30 }else{ 31 zsye[a[i]]=1; ans++; nd x=q.top(); q.pop(); zsye[x.id]=0; 32 if(next[i])q.push((nd){next[i],a[i]});else q.push((nd){p+1,a[i]}); 33 } 34 }else{ 35 q.push((nd){next[i],a[i]}); 36 } 37 } 38 printf("%d",ans); return 0; 39 }
20161109
bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。