傳送門
題目大意
構造乙個非空的括號字串,包含正好 k,k
≤1e9
k, k \leq 1e9
k,k≤1e
9 個不同合法括號對。所謂括號字串,是指由』(
((『和』)
))'這兩種字元構成的字串。要求構造的字串長度不超過100000。
解題思路
這題折磨了好久,一開始想的方法是將乙個數分解為兩個因子相乘,但是顯然最壞的結果是2乘上乙個大質數,那麼肯定翻車。然後想到先找k
\sqrt
k,令k =k
∗k+r
es
k = \sqrt*\sqrt + res
k=k∗k
+re
s,然後分解res
resre
s湊出結果,可是考慮一些極端的情況還是會爆長度。
實際上在考慮到對k
kk開根號時就想偏了,只需要看需要多少個k
\sqrt
k,然後將所有餘數和最後乙個右括號湊一起。這樣最壞的情況是3∗1
e9=9
e4
3*\sqrt = 9e4
3∗1e9
=9e4
,剛好可以。
ps:注意特判k=0
k=0k=
0的情況。
//
//#include .h>
#include
using namespace std;
#define endl "\n"
#define lowbit
(x)(x &
(-x)
)typedef long
long ll;
typedef long
double ld;
typedef unsigned long
long ull;
typedef pair<
int,
int>
pii;
typedef pair
pll;
typedef pair<
double
,double
>
pdd;
const
double eps =
1e-8
;const
double pi =
acos(-
1.0)
;const
int inf =
0x3f3f3f3f
;const
double dinf =
1e300
;const ll inf =
1e18
;const
int mod =
1e9+7;
const
int maxn =
2e5+10;
string ans;
intmain()
ans ="";
int x =
sqrt
(k);
int y = k / x, z = k % x;
for(
int i =
1; i <= y; i++
) ans +=
'(';
for(
int i =
1; i < x; i++
) ans +=
')';
for(
int i =
1; i <= z; i++
) ans +=
'(';
ans +=
')';
cout << ans << endl;
return0;
}
建構函式加括號與不加括號的區別
首先定義乙個建構函式hello function hello alert 1 定義乙個函式表示式 var getname function alert 2 例項化物件,下面這兩個如果建構函式沒有形參的話,例項化的時候建構函式可以不加括號 推薦加上 var p new hello var p1 new...
Codeforces482B 線段樹構造
題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...
Codeforces482B 線段樹構造
題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...