2022牛客冬令營 第五場 題解

2022-09-23 02:54:10 字數 4284 閱讀 4734

如果只打兩針,那麼我們直接列舉第二針位置,然後找到最適合的打第一針的位置。

如果打三針,那麼也是差不多流程,也就是在 pos - k 和 pos + k 附近找。

有點逆天,直接貼**(set 真是好東西):

#includeusing namespace std;

#define ll long long

const int n = 1000010;

int n;

char str[n];

ll k, w, q;

ll calc(int x, int y)

sets;

int get_front(int x)

}int get_back (int x)

}int main()

cout << ans;

return 0;

}

考慮到 \(n\) 的範圍,不難猜測有乙個 \(o(2^n)\) 的操作,估計這個就是禮遇的列舉了。

拋開禮遇不談,我們嘗試看一下怎使得最後結果最大:顯然按照加分從大到小來排序了(我第一遍以為那個第 \(i\) 局的上榜分數是跟著每局遊戲走的,想了半天都看不懂題解,逆天)

#include using namespace std;

const int n = 30;

int n, k, s;

int a[n], b[n], c[n], d[n], p[n];

int main()

//solve

int ans = 0;

for (int j = 0; j < (1 << n); j++)

if (cnt > k) continue;

for (int i = 1; i <= n; i++)

sort(d + 1, d + n + 1);

reverse(d + 1, d + n + 1);

int score = s;

cnt = 0;

for (int i = 1; i <= n; i++)

ans = max(ans, cnt);

}//output

cout << ans;

return 0;

}

給定區間 \([l,r]\),問區間內有多少個數,在十進位制下符合以下要求:

每相鄰兩個數字,和為素數

數字中有至少乙個 1

沒有前導 0

\(1\leq l\leq r \leq 10^\)

這題有點超過了數字 dp 的範圍了(我是這麼感覺的),不過靠數感意識到在 \(10^\) 的範圍內可能也就不到一百萬個符合要求的數(實際數量為 1220185),這意味著我們可以寫乙個爆搜來找出所有的數,然後一一看他們在不在給定的區間內即可。

(我也不知道為啥考場上調了半小時沒調的出來,很煩

#includeusing namespace std;

#define ll long long

setvis;

bool isprime(const int x) ;

for (int i = 0; i < 7; ++i) if (x == pr[i]) return true;

return false;

}bool has1(ll x)

void dfs(ll x) }//

int main()

給定乙個三元組 \((x,y,z)\),你可以對其進行操作,你可以進行操作 1, 2, 3,分別意味著讓其他兩個數變為自己的一半,然後剩下一半分別第 i 個數。

現在有乙個僅含 1, 2, 3 的長度為 \(n\) 的操作序列,可進行 \(m\) 次操作:

1 x y,將第 \(x\) 個數改為 \(y\) (\(1\leq x\leq n, 1\leq y\leq 3\))

2 l r,求對於三元組 \((1,1,1)\) 進行區間 \([l,r]\) 上操作後得到的新三元組。(\(1\leq l\leq r \leq n\))

\(1\leq n,m\leq 10^5\),所有數對 \(998244353\) 取模。

我們可以將操作視為對三元組向量左乘乙個矩陣,例如第乙個操作就可以視為:

\[\begin

1 & \frac & \frac\\

0 & \frac & 0\\

0 & 0 & \frac

\end

\begin

1\\1\\1

\end

=\begin

2\\\frac\\\frac

\end

\]矩陣符合結合律,那麼就變成了乙個單點修改和區間查詢的問題,我們可以線段樹來處理,複雜度 \(o(3^3n\log n)\)。

(注意,矩陣乘法不符合交換律,所以必須嚴格遵守乘法順序,先右後左)

#include using namespace std;

#define ll long long

const ll mod = 998244353, inv = 499122177;

struct matrix

matrix operator * (const matrix &b) const

};matrix std[4];

const int n = 100010;

int n, m;

char str[n];

struct node a[n << 2];

int mp[n];

#define ls(x) (x << 1)

#define rs(x) (x << 1 | 1)

inline void pushup(int x)

void build(int x, int l, int r)

int mid = (l + r) >> 1;

build(ls(x), l, mid);

build(rs(x), mid + 1, r);

pushup(x);

}matrix query(int x, int l, int r)

void change(int p, matrix val)

int main()

//read & init

scanf("%d%d%s", &n, &m, str + 1);

build(1, 1, n);

//query

while (m--) ;

for (int i = 1; i <= 3; ++i)

for (int j = 1; j <= 3; ++j)

ans[i] = (ans[i] + g.a[i][j]) % mod;

for (int i = 1; i <= 3; ++i)

printf("%lld ", ans[i]);

puts("");}}

return 0;

}

給定大小為 1 到 13 的卡牌各 4 張,從中取出六張,問本質不同的選擇方案有幾種?

暴力求出答案為 18395 即可。

我們對時刻做差後排個序,然後每次詢問中二分到第乙個大於 \(k\) 的位置,然後僅計算後面的值即可(求和可以用字首和優化)。

#includeusing namespace std;

#define ll long long

const int n = 1000010;

int n, q, t[n];

//ll a[n], s[n];

bool solve(ll k, ll p)

int main()

return 0;

}

假定乙個簡化版三國殺,有著以下四種卡牌:殺,閃,桃,決鬥。

現在知道我們血量無限,有 \(n\) 張殺和 \(m\) 張決鬥,對方有 \(k\) 張手牌,問我們是否必勝?

\(0\leq n,m,k\leq 10^9\)

對於決鬥後互相比拼殺的情況,我們可以理解為我們使用了一張殺,對方使用了一張閃,用來簡化情況。

再簡化一下得到結論:我們每打出一張傷害牌,對方都必須再出一張進行抵消,那麼我們直接比較 \(n+m\) 和 \(k\) 的大小即可。

#includeusing namespace std;

int main()

2023年牛客寒假集訓營第五場題解

c 石子遊戲 思路 利用差分陣列將區間修改轉化為兩個端點處的單點修改,按照每次新增乙個長度為 k 的區間的規則,首先從左到右將所有點補到該點左邊比它高的點的高度,再從右到做將所有點補到該點右邊比它高的點的高度,最後特判一下第 n k 1 個點 因為差分時以該點為左端點的區間右端點無法判斷 然後如果能...

牛客第五場 A gpa

01分數規劃的模本題 比賽貪心,貪了半天,最後隊友想起這是01分數規劃的題 發現自己的盲區。01分數規劃可以解決 01分數規劃 最優比率生成樹問題 最優比率環問題 最大密度子圖等問題 01分數規劃的詳細講解 這篇部落格講解的很好 a i b i ac include using namespace ...

2019牛客暑期多校訓練營(第五場)I題題解

給定乙個矩形區域,在裡面構造三個點使得其之間的距離等於給定的值 如圖所示,先取 0,0 作為第一點,然後分兩種情況 在x軸上或矩形右邊界找第二個點,最後用餘弦定理和角度關係求出第三點。注意 因為可能會出現超過w,h邊界的情況,我們可以列舉三個點對應放哪個位置來保證答案合法。很好寫 1 define ...