Acdream 1205 Disappeared Block(模擬)
題目連結:傳送門
題意:
有n個高度分別為hi的山峰,然後海平面,初始的時候為0,然後每隔一秒還平面會上升一米
然後給定m個時刻,求第i秒時這時候的山峰分成了幾塊初始的時候都連在一起很明顯是一塊。
分析:
我們將海面看著是不動的,然後將時間倒著來考慮,考慮山峰是逐漸上升的,然後如果它的
在這個某時刻之前如果它的左右的山峰都沒有出現的話那麼塊數就要增加,否則如果左右都
出現了的話那麼塊數就要減一。
程式碼如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6+10;
struct nod{
int id,h;
bool operator <(const struct nod &tmp)const{
return h>tmp.h;
}
}p[maxn];
int s[maxn];
int ans[maxn];
bool vis[maxn];
int main()
{
int t,n,m,cas=1;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&p[i].h);
p[i].id=i;
}
for(int i=0;i<m;i++){
scanf("%d",&s[i]);
}
sort(p,p+n);
memset(vis,0,sizeof(vis));
int i,j,high=0;
for(i=m-1,j=0;i>=0;i--){
for(;j<n&&s[i]<p[j].h;j++){
vis[p[j].id]=1;
if((p[j].id==0||!vis[p[j].id-1])&&(p[j].id==n-1||!vis[p[j].id+1]))//左右兩邊都沒有露數來
high++;
else if((p[j].id>0&&vis[p[j].id-1])&&(p[j].id<n-1&&vis[p[j].id+1]))
high--;
}
ans[i]=high;
}
printf("Case #%d: ",cas++);
for(int i=0;i<m;i++){
if(i==m-1) printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
}
return 0;
}
相關文章
- 阻塞(block)過程模擬與分析!BloC
- 模擬data block lost write的簡單方法BloC
- Disappeared薦APP
- 模擬
- Find All Numbers Disappeared in an ArrayAPP
- 有限元模擬 有限體積模擬
- 10.6 模擬賽(NOIP 模擬賽 #9)
- TreeView的基本使用 1205View
- git 模擬Git
- ACP模擬
- 模擬題
- Keil的軟體模擬和硬體模擬
- Thinking in Java---多執行緒模擬:銀行出納員模擬+飯店模擬+汽車裝配工廠模擬ThinkingJava執行緒
- Gpssworld模擬(二):並排排隊系統模擬
- Altair SimSolid 工程模擬軟體 衡祖模擬AISolid
- PID除錯軟體(C#、模擬、模擬)除錯C#
- 「模擬賽」暑期集訓CSP提高模擬10(7.28)
- 「模擬賽」暑期集訓CSP提高模擬15(8.7)
- 448. Find All Numbers Disappeared in an ArrayAPP
- ACdream OJ 1153 (k-GCD)GC
- NOIP模擬50
- NOIP模擬57
- iOS 模擬器iOS
- NOIP模擬74
- NOIP模擬76
- NOIP模擬77
- NOIP模擬66
- 模擬面試題面試題
- 模擬退火原理
- 5.4 模擬賽
- 模擬鬥地主
- 8.5 模擬賽
- 8.2 模擬賽
- CSP模擬1
- 暑假模擬15
- 9.2 模擬賽
- csp模擬2
- 暑假模擬16