Editorial of Codeforces Round #735 (Div. 2) 部分題解

傳送


A,B,C,D題解。ide

這場比賽打的稀碎,A題居然想了40分鐘;B題亂搞還過了;最後十幾分鍾開的D,WA到最後仍是沒想到\(n=1\)的狀況,最近怎麼老是各類下飯操做啊。優化

比賽前我說這場我必漲分,結果然就漲了一分……

it

A Cherry

這A題就欺負我這種呆瓜,別人都作完三道題了,我才以爲彷佛直接取相鄰兩個就行……
其緣由就在於,長區間必定沒有兩個段區間優,即選\((a_l, a_{l+1},\cdots, a_r)\)還不如選\((a_l,a_{l+1},\cdots,a_{r-1})\)和\((a_{l+1},\cdots, a_{r-1}, a_r)\).枚舉最大最小值的位置是否在左右端點既能夠得出結論。class

因此答案就是\(max\{a_i *a_{i-1} \}(1\leqslant i < n)\).
代碼不發了。



di

B Cobb

這題放在B純屬搞心態,C,D可比這要簡單多了。主要是這題的思路之前沒遇到過,一種經過最值優化枚舉範圍的思路。時間

首先看後面的\(k * (a_i | a_j)\),他的最大值是\(k* 2n\)(好比\(n= 8\),那麼\(8 | 7 = 15\),因此最大值不是\(n\)),那麼整個式子的最大值必定不小於\(n*(n-1)-2kn\),即\(f(n, n - 1)\).view

那麼對於任何一個\(f(i, j)\),至少要知足\(i * j > n * (n-1)-2kn\),所以咱們在枚舉\(j\)的時候,須要知足\(i > \frac{n(n-2k-1)}{j}\)且\(i < j\),而這個時間複雜度是\(O(nk)\)的。由於當\(j=n\)時,\(n-2k-1 < i < n\);而當\(j<n\)時,\(i\)的範圍的左邊界會變大,右邊界會變小,因此枚舉區間確定不會超過\(2k\),所以時間複雜度\(O(kn)\).vi

上面的思路已經能過這題了,但還能夠再優化:觀察上面的式子,當\(j \leqslant n - 2k - 1\)時,有\(i \geqslant n\),因此咱們只用枚舉\([n-2k, n]\)的全部\(j\)便可,這樣時間複雜度就是\(O(k^2)\)的了。比賽

主要代碼:ant

ll n, K, a[maxn];
l solve()
{
	ll ans = -INF;
	for(ll j = max(1LL, n - 2 * K); j <= n; ++j)
	    for(ll i = max(1LL, n * (n - 2 * K - 1) / j); i < j; ++i)
		  ans = max(ans, i * j - K * (a[i] | a[j]));
	return ans;
}

而後個人亂搞思路是枚舉從\(1\)到\(n\)的全部\(j\),再用\(j\)前面\(k\)個\(i\)去更新答案……雖然不能徹底涵蓋題解的枚舉區間,但彷佛也很難被卡掉。



C Mikasa

題目要說的是找到最小的非負整數\(x\),使\(x\)沒有在\(n \ \ \textrm{XOR} \ \ 0, n \ \ \textrm{XOR} \ \ 1,\cdots, n \ \ \textrm{XOR} \ \ m\)中出現。

換句話說,就是找最小的\(x\),知足\(n \ \ \textrm{XOR} \ \ x > m\)(題解的作法是\(\geqslant m + 1\),不過都同樣).

那麼咱們從高位比,令\(n\)的這一位爲\(b_1\),\(m\)的這一位爲\(b_2\),而後分狀況討論便可:

若是\(b_1=b_2=1\),那麼\(x\)這一位只能填\(0\);
若是\(b_1=0,b_2=1\),那麼必須填\(1\);
若是\(b_1=1,b_2=0\),此時填\(0\)結果已經大於\(m\)了,退出;
若是\(b_1=b_2=0\),同理填\(0\).

但這樣最後可能會使\(n \ \ \textrm{XOR} \ \ x = m\),所以咱們要找到最低位的\(i\),知足\(n,m\)的第\(i\)位都是\(0\),將\(x\)的這一位改爲\(1\),而且低位清零便可。

主要代碼:

const int N = 31;
In int solve(int n, int m)
{
	int p = 0;
	for(int i = N; i >= 0; --i)
	{
		int t1 = (n >> i) & 1, t2 = (m >> i) & 1;
		if(!t1 && t2) p |= (1 << i);
		else if(t1 &&!t2) break;
	}
	if((p ^ n) == m)
	{
		for(int i = 0; i <= N; ++i)
		{
			int t1 = (n >> i) & 1, t2 = (m >> i) & 1;
			if(!t1 && !t2)
			{
				p |= (1 << i);
				for(int j = 0; j < i; ++j)  //低位清零
				{
					p |= (1 << j);
					p ^= (1 << j);
				}
				return p;
			}
		}
	}
	return p;
}


D Diane

這D就更簡單了。

先想對於一個長度爲5的串aaaaa,a出現了5次,aa出現了4次,aa出現了3次……即奇偶交替出現的,而對於aaaa,會發現他的奇偶交替出現跟aaaaa恰好相反,而奇+偶=奇,那麼問題就解決了:若是\(n\)爲偶數,咱們就能夠構造出相似aaaaabaaaa這樣的串;若是\(n\)爲奇數,在後面添加一個c便可。

而後別忘判斷\(n=1\)的狀況,說的就是我……

主要代碼:

void solve(int n)
{
	int x = n >> 1;
	for(int i = 1; i <= x; ++i) putchar('a');
	if(n > 1) putchar('b');
	for(int i = 1; i < x; ++i) putchar('a');
	if(n & 1) putchar('c');
	puts("");
}
E沒看,也不會。
相關文章
相關標籤/搜索