acdream 1205 Disappeared Block 离线

来源:互联网 发布:mac卸载自带软件卸载 编辑:程序博客网 时间:2024/06/07 00:58

题意:有n列方块,给出每列的方块数。每秒会消掉一行的方块。有m次查询,每次查询在第si秒方块分成了几部分。

思路:首先对高度由高到底排序,对时间也是从后向前查询。如果当前的高度h[i]大于查询的时间,那么我们将该高度所处的列标

记,如果他所有两端均未标记那么块数+1,如果两端均已标记说明块数-1,不然块数不增加不减少。(关键在于排序),详见代码:

// file name: acdream1205.cpp //// author: kereo //// create time:  2014年09月07日 星期日 22时05分09秒 ////***********************************//#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<set>#include<map>#include<vector>#include<stack>#include<cmath>#include<algorithm>using namespace std;typedef long long ll;const int MAXN=1000000+100;const int inf=0x3fffffff;#define L(x) (x<<1)#define R(x) (x<<1|1)int n,m;int vis[MAXN],res[MAXN],s[MAXN];struct node{int id,val;}p[MAXN];int cmp(node a,node b){return a.val>b.val;}int main(){int T,kase=0;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&p[i].val);p[i].id=i;}sort(p+1,p+n+1,cmp);for(int i=1;i<=m;i++)scanf("%d",&s[i]);int ans=0;memset(vis,0,sizeof(vis));for(int i=1,j=m;j>=1;j--){for(;i<=n;i++){if(p[i].val>s[j]){int id=p[i].id;vis[id]=1;if(!vis[id-1] && !vis[id+1])ans++;if(vis[id-1] && vis[id+1])ans--;}else break;}res[j]=ans;}printf("Case #%d:",++kase);for(int i=1;i<=m;i++)printf(" %d",res[i]);printf("\n");}return 0;}


0 0
原创粉丝点击