标签:des style blog color os io strong ar for
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19716 | Accepted: 11910 |
Description
S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
Input
Output
Sample Input
2 6 4 5 6 6 6 6 9 4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6 1 1 2 4 5 1 1 3 9
题目大意:给你一组匹配的左右括号,定义序列P是第i个右括号前面的左括号数,定义序列W是第i个右括号到与它匹配的左括号中间的右括号(包括这个括号自身)的个数,已知P,求W
解题思路:定义ind数组分别表示第i个括号是第k个左/右括号,定义l数组表示第i个左括号前面有多少个右括号,r数组则是表示第i个右括号前面有多少个左括号,相减即可,对于括号匹配直接用的遍历,这题n如果是10e9就会有趣很多,这个时候右括号一定是匹配未被用到的最大值,也就是说其实不用遍历
应用时:5min
实际用时: 41min(读题太差)
#include<cstdio> #include <cstring> using namespace std; int ind[45]; bool used[45]; int r[21]; int l[21]; int len,n,llen; int w[21]; int main(){ int t; scanf("%d",&t); while(t--){ memset(used,0,sizeof(used)); len=0,llen=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",r+i); for(int j=0;j<r[i]-(i>0?r[i-1]:0);j++){ ind[len++]=llen; l[llen++]=i; } ind[len++]=i; } for(int i=0;i<n;i++){ int tind=r[i]+i; used[tind]=true; for(int j=tind-1;j>=0;j--){ if(!used[j]){ w[i]=i-l[ind[j]]+1; used[j]=true; break; } } } for(int i=0;i<n;i++)printf("%d%c",w[i],i==n-1?‘\n‘:‘ ‘); } return 0; }
标签:des style blog color os io strong ar for
原文地址:http://www.cnblogs.com/xuesu/p/3942409.html