题目链接:https://nanti.jisuanke.com/t/38
du熊是个爱学习的孩子,他总喜欢在生活中做一些小实验,这次du熊想研究一下光合作用。
du熊的实验材料有如下几样:神奇的种子,普通的纸箱和一些光源。一开始du熊将种子均匀的种在了箱子底部,你可以将其看成X轴,种子的位置为X轴上的点。然后du熊用纸板将箱子盖住,并在纸板上安装了一些光源(具体见图)。神奇的种子会在有光的情况下一直向上生长直到没光为止。现在du熊想知道当实验结束时每颗种子的高度是多少?
顶上的为光源,光源两边与顶部的夹角都为45°,黄色部分为光照,绿色的为植物。
输入第一行给出一个T,表示测试数据的组数。每组数据的第一行是三个整数n,m,H(1≤n≤100,000, 0≤m≤100,000, 1≤H≤10,000),n表示种子数(编号1-n),m表示光源数,H表示箱子的高度。接下来m行,每行一个整数Xi表示第i个光源在顶部的位置。
对于每组测试数据,请输出n行,每行一个数表示第i颗种子的最终高度。
样例输入
2 7 1 2 4 4 4 1 1 2 3 4
样例输出
0 0 1 2 1 0 0 1 1 1 1
二分找到当前位置的前后。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 1e5+5; 8 int x[maxn]; 9 int main() 10 { 11 int T; 12 cin>>T; 13 while(T--) 14 { 15 int n,m,h; 16 scanf("%d %d %d",&n,&m,&h); 17 for(int i=1;i<=m;i++) 18 { 19 scanf("%d",&x[i]); 20 } 21 sort(x+1,x+m+1); 22 for(int i=1;i<=n;i++) 23 { 24 int ans = 0; 25 int cnt = lower_bound(x+1,x+m+1,i)-x; 26 if(cnt==1&&m!=0) 27 { 28 ans = max(ans,h-x[cnt]+i); 29 } 30 else if(cnt==m+1&&m!=0) 31 { 32 ans = max(ans,h-i+x[cnt-1]); 33 } 34 else if(m!=0) 35 { 36 ans = max(0,max(h-i+x[cnt-1],h-x[cnt]+i)); 37 } 38 printf("%d\n",ans); 39 } 40 } 41 return 0; 42 }
时间: 2024-10-21 19:52:24