題目大意:讓你構造乙個括號序列,括號匹配的方式類似於棧,給出從左數每個括號 到和它匹配的右括號的 最小和最大距離,讓你輸出乙個合法括號序列
看錯題了以為是二分圖,然後寫了搜尋
貪心發現如果距離往小了填,不會影響結果
括號必須套完整的括號,所以距離必須是2的整數倍+1
如果乙個括號匹配上了,那麼兩個括號之間不能有其它的半個括號
如果第乙個能匹配的右括號的位置被佔上了,那麼就把前面的左括號相匹配的右括號往右挪,如果超過了能移動的最大範圍,說明不合法
細節比較多
1 #include 2 #include 3 #include 4 #include 5 #include 6#define n 2000
7#define ll long long
8#define dd double
9using
namespace
std;
10//
re11
intgint()
1215
while(c>='
0'&&c<='9')
16return ret*fh;17}
18int
n,cte,tp;
19int
l[n],r[n],pos[n],w[n],mch[n];
20int move(int
x)21
else
return0;
30return1;
31}3233
intmain()
3445
for(int j=k+1;j<=st;j++)
46if
(mch[j])49}
50int flag=0;51
for(int j=st;j<=k+r[i]&&j<=2*n;j+=2)52
if(!mch[j])
53if(flag) continue
;54 flag=move(st);
55if(!flag)
56 mch[st]=i,pos[i]=k,k++;57}
58while(mch[k]) w[k]=2,k++;
59for(int i=1;i<=2*n;i++)
60if(w[i]==2) printf(")"
);61
else printf("("
);62 puts(""
);63
return0;
64 }
CF刷題總結 CF706E鍊錶
這題目應該要秒做出來的。首先看到二維,又沒什麼思路就直接降維 考慮一維的情況,就是一段連續的和另一端連續的交換,最快的當然是鍊錶模擬了。所以考慮到二維中也不應該用陣列儲存,而是鍊錶表示。但是由於二維的話,不可能是簡單的鍊錶。所以考慮每乙個矩形和旁邊的關係。肯定就是四周的,但是只考慮單向,那就是2個方...
CF149E 字尾自動機
題意 給出乙個長字串s和一組詢問字串,對於每個詢問需要知道在s中是否存在兩個位置不同的子串可以組成該詢問字串。建s的字尾自動機,同時處理出每個狀態出現的最左位置和最右的位置。拿每乙個詢問和s的自動機匹配,記錄下詢問串中以每個位置為結尾所匹配的長度和匹配自動機中哪個狀態。設l為整個詢問串所能匹配的長度...
CF 31E 分塊,狀態壓縮
題意 輸入乙個n,給你2n個數字,有2個人,每個人從前往後分別從中選出n個數字,使得每個人的獲得的數字的和最大 可能有字首0,在得到的數字中字首0捨去 思路 將2n個數字從中間分成前後各n個數字這樣的兩段,分別對兩段狀態壓縮求出每個狀態的和,其中前面這段可以根據每個人拿且必拿n個數字直接算出總和,算...