如果只打兩針,那麼我們直接列舉第二針位置,然後找到最適合的打第一針的位置。
如果打三針,那麼也是差不多流程,也就是在 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]\),問區間內有多少個數,在十進位制下符合以下要求:這題有點超過了數字 dp 的範圍了(我是這麼感覺的),不過靠數感意識到在 \(10^\) 的範圍內可能也就不到一百萬個符合要求的數(實際數量為 1220185),這意味著我們可以寫乙個爆搜來找出所有的數,然後一一看他們在不在給定的區間內即可。每相鄰兩個數字,和為素數
數字中有至少乙個 1
沒有前導 0
\(1\leq l\leq r \leq 10^\)
(我也不知道為啥考場上調了半小時沒調的出來,很煩
#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 ...