CodeForces 847C Sum of Nestings
题目
http://codeforces.com/problemset/problem/847/C
题意
给你n,k两个数,说有n对括号,要求输出有k个嵌套的括号。
比如“( ( ( () ) ) )”嵌套数就是6.分别是1( () ) +2( ( () ) )+3( ( ( () ) ) )
题解
我们很容易发现规律,有n对括号,那么最多嵌套数sum[i]就等于sum[i-1]+i-1。
他是这样的一个数列:0 1 3 6 10 15……
然后我们先判断k是否大于sum[i]。大于就直接输出Impossible
否则先找到小于等于k的最大嵌套数。然后再在嵌套的括号里面加括号。
规律:
在最外面加括号贡献为0,然后越往里面加括号,贡献越大。
代码
#include<iostream>
using namespace std;
#define ll long long
const int maxn = 3e5+10;
ll a[maxn];
int main()
{
a[1] = 0;
for(int i=2;i<=3e5;i++)
a[i] = a[i-1]+i-1;
int n;
ll k;
scanf("%d %lld",&n,&k);
if(k > a[n])
{
puts("Impossible");
return 0;
}
int index=0;
for(index=n;index>=0;index--)
{
if(a[index]<=k)
break;
}
ll ans = k - a[index];
for(int i=0;i<index;i++)
{
printf("(");
}
for(int i=index-1;i>=0;i--)
{
printf(")");
if(ans == i&&index<n)
{
index++;
printf("()");
}
}
for(int i = index;i<n;i++)
{
printf("()");
}
puts("");
return 0;
}