题目链接。
分析:
水题。
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int maxn = ; int P[maxn], W[maxn];
char s[maxn]; int main(){
int T, n, m; scanf("%d", &T); while(T--) {
scanf("%d", &n);
P[] = ;
for(int i=; i<=n; i++) scanf("%d", &P[i]); //通过P推s
int cn = ;
for(int i=; i<=n; i++) {
for(int j=; j<P[i]-P[i-]; j++) {
s[cn++] = '(';
}
s[cn++] = ')';
}
s[cn++] = '\0'; //通过s推W
int rp_cnt = , lp_cnt, t, ls_cnt; for(int i=; i<cn; i++) {
if(s[i] == ')') {
rp_cnt++;
lp_cnt = t = ls_cnt = ;
for(int j=i; j>=; j--) {
if(s[j] == ')') { t++; ls_cnt++; }
else if(s[j] == '(') lp_cnt++;
if(lp_cnt == ls_cnt) break;
}
W[rp_cnt] = t;
}
} for(int i=; i<=n; i++) {
if(i != n) printf("%d ", W[i]);
else printf("%d\n", W[i]);
}
} return ;
}