可以先把輸入離散化(用map會t),然後對於每個位置l求出最右側的r,使得[l, r]內元素不重複且區間長度最長。
由於給定的序列一定是這樣的結構:部分k的排列 + k的排列 + k的排列 + …+k的排列 + 部分k的排列
所以我們可以列舉第乙個k的排列的起點(再該起點之前的部分預設是合法的),然後從當前點往後一直跳,跳的同時判斷該段的合法性。
#include
using
namespace std;
typedef
long
long ll;
//typedef __int128 lll;
#define print(i) cout << "debug: " << i << endl
#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
const ll mod =
1e9+7;
const
int maxn =
2e6;
const
int inf =
0x3f3f3f3f
;int a[maxn]
, b[maxn]
, len[maxn]
, vis[maxn]
;int n, k, num;
bool
solve()
}return
false;}
intmain()
sort
(b +
1, b +
1+ n)
; num =
unique
(b +
1, b +
1+ n)
- b -1;
for(
int i =
1; i <= n; i++
) a[i]
=lower_bound
(b +
1, b +
1+ num, a[i]
)- b;
int r =1;
for(
int l =
1; l <= n; l++
) cout <<
(solve()
?"yes"
:"no"
)<< endl;
}}
數字dp,不過跟之前的數字dp不太一樣。之前的數字dp是只搜乙個數,這次的dp是搜兩個數,而且這兩個數要滿足兩個約束條件:
1.a <= b
2.sum(a) > sum(b)
於是我們開始分析dp陣列的含義,dp[pos][dif][lim1][lim2]
pos:表示位置。
dif:a前面位數和−b前面位數和.(注:要防負數)
lim1:limit,當前位之前b是否等於n,並反映限制 b ≤ n
lim2:當前位之前a是否等於b,反映限制a≤b
#include
using
namespace std;
typedef
long
long ll;
//typedef __int128 lll;
#define print(i) cout << "debug: " << i << endl
#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
const ll mod =
1e9+7;
const
int maxn =
2e6;
const
int inf =
0x3f3f3f3f
;ll dp[
105]
[3000][
2][2
];string s;
int v[
200]
;ll dfs
(int pos, ll dif,
int lim1,
int lim2)
dp[pos]
[dif]
[lim1]
[lim2]
= res;
return res;
}ll work()
intmain()
2020牛客暑期多校訓練營 第六場
雖然題目沒有看懂,但是本場mvp浩大師發現了規律,f x 2x 12x f x 1 f x 1 over 2 x f x 1 f x 2 x2x 1 f x 1 然後把程式打出來就ac了。include using namespace std typedef long long ll const i...
2020牛客暑期多校訓練營(第六場)
2020牛客暑期多校訓練營 第六場 額,睡了一下午,直接錯過了比賽。b binary vector c combination of physics and maths d data structure e easy construction f fibonacci partition g grid...
2020牛客暑期多校訓練營(第六場)
總結 這一次還行,做題前面比較順利得出了兩題,但是後面不是很順利,團隊配合一般需要改進。cg k給你n和k,要求構造乙個1 n的數列滿足,對任意長度,都存在乙個連續區間滿足區間和sum n k。若存在則輸出這個數列,否則輸出 1。模擬。首先想到的就是先求1 n的和判斷是否是k 的整數倍,如果不是則直...