欢迎各位教练,老师,同学们来到西南科技大学第十八届校赛。在这短暂的五个小时,尽情享受AC , AK的快乐。
藏头诗的本意一般藏在每个诗句的首字,将它们按顺序连起来读会有意想不到的效果。
《水浒传》第六十一回中梁山好汉为了拉卢俊义入伙,“智多星”吴用和宋江便生出一段“吴用智取玉麒麟”的故事来,利用卢俊义正为躲避“血光之灾”的惶恐心理,口占四句卦歌:
芦花丛中一扁舟,
俊杰俄从此地游。
义士若能知此理,
反躬难逃可无忧。
暗藏“卢俊义反”四字,广为传播。结果,成了官府治罪的证据,终于把卢俊义“逼”上了梁山。
现给你一首有 nn 行的"诗" ,你能解读出它的本意吗?
#include青山隐隐,败叶萧萧using namespace std; int main() { string ans = ""; int n; cin >> n; while (n -- ) { string s; cin >> s; ans += s[0]; } cout << ans; }
远山起伏,黑魆魆地时隐时显;枯叶在秋风中飘落翻转。小c 不愿意看到校园里此番凄凉景象,决定动用他的魔法,让校园与身后的青山在秋季一样焕发生机!
我们把问题具象化:小c 面前的 nn 堆败叶堆排成一排,每一堆败叶堆有 a_ia
i
片败叶。如果小c 能够使得面前这一排败叶同时满足以下两个条件,那么小c 就可以发动魔法让这片青山,让这座校园焕发生机!
条件①:对任意 i∈[1,n)i∈[1,n) , a_i+a_{i+1}a
i
+a
i+1
是一个质数;条件②:对任意 i∈[1,n]i∈[1,n] , a_ia
i
是一个质数。
小c 可以对任意多堆的败叶堆,做任意多次任意操作 (也可以为 00 ):
操作①:令 a_i=a_i+2a
i
=a
i
+2 ;操作 ②:令 a_i=a_i-2a
i
=a
i
−2 。当然,你不可以令任何一堆败叶堆里败叶的数量为负数。
请问小c 能否让青山和校园焕发生机?
#include几番烟雾,只有花难护using namespace std; int main() { int _; cin >> _; while (_ -- ) { int n; cin >> n; int x; cin >> x; bool even = true; if (x & 1) even = false; bool ok = true; for (int i = 2; i <= n; ++ i) { cin >> x; if ((x & 1) && even == false) { ok = false; } else if ((x % 2 == 0) && even) { ok = false; } if (x % 2 == 0) even = true; else even = false; } if (ok) cout << "YES" << endl; else cout << "NO" << endl; } }
龙山的天气是醉人的温暖,恰好是樱花落尽的时季。散布着细沙的行人道上满是狼藉的粉色花片,有些便沾挂在平铺的碧草上。几树梨花还点缀着嫩白的残瓣。北面与西面小山上全罩着淡蓝色的衣校,小燕子来回在林中穿跳。在这里正是一年好景的残春,到处有媚丽的光景使人流连。
烟烟雾雾,云云霭霭。残春好景使人流连忘返,可是,在这伤春悲秋之时,即使柳树已经抽完了芽,青藤也换完了新枝,而鲜花已经不再盛开。明年的鲜花有,年年新花年年有,可是你曾今看到的那一朵,你永远无法挽留,即使深爱过,再也不会出现。
你引腕便要去挽,获得的只有眼角不受控落下的泪滴。你毅然步入梦中,映入眼帘的是一片开满着蓝色鸢尾花的田野。通过划分可以把这片田野化成无数块 ,第 ii 块的面积为 i^2i
2
个单位面积,第 nn 块的面积为 n^2n
2
个单位面积。每块蓝色鸢尾花田的排布以及面积如图所示:(红色数字 ii 代表蓝色鸢尾花田编号,即第几块)
已知购买第 ii 块蓝色鸢尾花田的一单位面积的价格 price_iprice
i
如下式所示:
price_i = begin{cases} frac{n}{i}+1, & n%i ≠ 0 frac{n}{i} ,& n%i=0 end{cases}price
i
={
i
n
+1,
i
n
,
n%i
=0
n%i=0
现请你计算将前 nn 片蓝色鸢尾花田全部购买下来所需要的价格。
题解 :
- 1e9块田,不可能遍历相加
- 发现一片连续的i可以使得 n i frac{n}{i} in为同一个值;设左边界为l,可以得到r等于min(n / n / l, n),这样,在枚举n块田的时候就可以跳着枚举了;面积计算也有技巧,每次要算的面积是 l 2 + ( l + 1 ) 2 + . . . + r 2 l^2+(l+1)^2+...+r^2 l2+(l+1)2+...+r2,联想到平方和公式 n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 frac{n*(n+1)*(2n+1)}{6} 6n∗(n+1)∗(2n+1),可以将此转化为 ( 1 2 + . . . + r 2 ) − ( 1 2 + . . + ( l − 1 ) 2 ) (1^2+...+r^2)-(1^2+..+(l-1)^2) (12+...+r2)−(12+..+(l−1)2)
- 观察公式,发现在枚举到是n的约数时要少加一个与约数有关的量,因此可以先不管直接当作非约数处理,另外开一个循环减去(枚举约数的技巧)
#include岸风翻夕浪,舟雪洒寒灯using namespace std; typedef long long ll; const ll mod = 998244353; ll qmi(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } ll f(ll n) { if (n == 0) return 0; return (n * (n + 1) % mod * (2 * n % mod + 1) % mod * qmi(6, mod - 2) % mod + mod) % mod; } ll calc(ll l, ll r) { return ((f(r) - f(l - 1)) % mod + mod) % mod; } int main() { int _; cin >> _; while (_ -- ) { ll n; cin >> n; ll ans = 0; for (ll l = 1; l <= n;) { ll r = min(n / (n / l), n); ans = ((ans + calc(l, r) * (n / l + 1) % mod) % mod + mod) % mod; l = r + 1; } for (ll d = 1; d <= n / d; ++ d) { if (n % d == 0) { ans = ((ans - d * d % mod) % mod + mod) % mod; ll x = n / d; if (x != d) { ans = ((ans - x * x % mod) % mod + mod) % mod; } } } cout << ans << 'n'; } }
如题名称所示,湖岸的风翻起晚浪,舟外的雪飘落灯前。看似写景,实则暗喻实事。杜甫用拟人的手法将浪大和风急的关系揭示出来,并以风来比喻小人猖狂,浪来比喻局势动荡,小人猖狂导致局势动荡。
现有无数重的"浪",我们用 S_xS
x
描述第 xx 重"浪"的波形,"浪"满足以下性质:
S_1=1S
1
=1
S_n = S_{n-1}+n+S_{n-1}S
n
=S
n−1
+n+S
n−1
( ‘++’ 表示连接)
例如:S_2=1 2 1S
2
=1 2 1,S_3=1 2 1 3 1 2 1S
3
=1 2 1 3 1 2 1, S_4=1 2 1 3 1 2 1 4 1 2 1 3 1 2 1S
4
=1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 …
由上述样例波形图和文字解释,可以发现第 33 重"浪"的第 33 位上的"浪高"是 11 ,第 44 重"浪"的第 1010 位上的"浪高"是 22 。
在此基础上推广一下,请你求出第 10{10{10^{10}}}10
10
10
10
重"浪"的第 KK 位上的"浪高"是多少?
题解 :
- 递归,找到上一个循环结中k对应的位置
- 首先找到比k小于等于的那个循环结;根据模拟题意,如果k恰好是那个循环结的最后一个位置,k位置上的数就是 l o g 2 a + 1 log_2a+1 log2a+1;否则,找上次循环中相同的位置
#include满城烟水月微茫,人倚兰舟唱using namespace std; typedef long long ll; ll dfs(ll k) { ll a = 1; while (a <= k) { a <<= 1; } a >>= 1; if (a == k) { ll cnt = 0; while (a) { cnt ++ ; a >>= 1; } return cnt; } return dfs(a - (k - a)); } int main() { ll k; cin >> k; cout << dfs(k); }
细水引流觞,大江观气浪。万顷风波里,一点轻舟上。
水无澜似镜,月傍云如玦。
可惜即无岸边凌波翩婉,也无舟中杯盘狼藉。此处呆坐未免无趣了些。
于是,小华和小明想起了他们在小卖部买的扑克牌。
小华和小明在用纸牌玩一个叫做比大小的游戏。
他们面前有 nn 堆纸牌,总共 mm 张,每堆纸牌分别有 a_ia
i
张,每张纸牌上都写有一个数字 x_{i,j}x
i,j
。每一轮游戏中,他们都会从有牌且编号最小的牌堆顶部抽一张牌比较数字的大小,谁的牌数字大谁这轮就赢了,赢家会获得 11 分。比较结束后,他们手上的牌都会被扔掉。如果任何一方没有牌可抽,整局游戏就结束了。小华先手。
小明是个坏家伙,他偷看到了小华的牌。如果他发现此时自己手上的牌没有严格大于小华,他会试图把自己手上的牌插入下一堆牌的底部,然后从面前的牌堆顶部重新抽一张。下一堆牌是指当前已经正在抽牌的牌堆编号加 11 的牌堆。特殊的,如果此时正在抽的已经是最后一个牌堆,那么这张牌将会被扔掉。在牌有剩余的情况下会一直循环这个过程。
小明想知道,整场游戏结束后,他的得分比小华多多少?
题解 :
- 模拟
- 每次取完数后,记得判断是否为空
#include夜暗方显万颗星,灯明始见一缕尘#include using namespace std; const int N = 110; int n, m; int a[N]; queue que[N]; int main() { cin >> n >> m; for (int i = 1; i <= n; ++ i) { cin >> a[i]; for (int j = 1; j <= a[i]; ++ j) { int x; cin >> x; que[i].push(x); } } int now = 1, ans = 0, hua; while (now <= n) { hua = que[now].front(); que[now].pop(); if (que[now].empty()) now ++ ; while (now <= n && que[now].front() <= hua) { if (now < n) que[now + 1].push(que[now].front()); que[now].pop(); if (que[now].empty()) now ++ ; } if (now > n) { break; } else { ans ++ ; que[now].pop(); if (que[now].empty()) now ++ ; } } cout << ans; }
人不该太清醒,过去的事情就让它过去,不必反复咀嚼。一生不长,重要的事儿也没那么多。天亮了,又赚了。自认为迷惑的时候,往往才能看清方向与人生美好的可贵与价值意义。
顺应生活之路,无论走向哪种极端,我们都会在不一样的处境找到不一定的答案,从而不断平衡自己。我们需要这样一种能力,也需要去选择认同。自认为不错的时候,往往可以瞥见我们人生生活上本来存在的不足。
浩瀚星辰,万里银河;红烛微尘,夜临灯始。我们把这个夜空看做一个二维平面,则以某一点为原点建立一个笛卡尔坐标系。坐标系内有以下物体:“星”、“尘”、“灯”。
①:"星"是一个 n×mn×m 的矩形区域,它能够发出光芒。其左下角顶点坐标为 (0,0)(0,0) ,右上角顶点坐标为 (n,m)(n,m) 。
②:"尘"是一个 x×yx×y 的矩形区域,它可以也必须完全放置在"星"的表面之上,遮蔽"星"所发出的光芒。保证"尘"至少有一种完全放置在"星"的范围内的方法。
③:"灯"是"尘"遮蔽了"星"之后,"星"剩下的部分 (剩余部分通常是 “LL” 型或 “一字” 型) 。
"灯"中的每一个矩形都能为"灯"提供 11 点能量。给定"星"的位置和"尘"的大小,请制订一个放置"尘"的方案,使得"灯"能提供的总能量最多,求出这个最多的总能量数。("尘"必须完全放置在"星"的范围内,即:“尘” ∪∪ “星” == “星” 且 “尘” ∩∩ “星” == “尘” )
题解 :
- 每一个矩形都能提供1个能量,说明这是一种累加式的贡献,想到由最小的单位开始增大到当前需要计算的面积的累加过程,比如一个1 * 2的矩形的贡献,是由1 * 1的矩形加上单纯的1 * 2矩形的贡献所构成的
- 这里L型的面积不能由两个矩形相加,必须是两个矩形相加再减去一个矩形,因为被减去的那个交叉部分的矩形对另外两个矩形都有贡献,不能只算在一个矩形中,应该减去的是它本身单纯的贡献
#include劝君终日酩酊醉,酒不到刘伶坟上土using namespace std; typedef long long ll; ll f(ll x, ll y) { ll ans = 0; for (ll i = 1; i <= x; ++ i) { for (ll j = 1; j <= y; ++ j) { ans += i * j; } } return ans; } int main() { ll n, m, x, y; cin >> n >> m >> x >> y; ll ans1 = f(m, n - x) + f(n, m - y) - f(n - x, m - y); ll ans2 = f(m, n - y) + f(n, m - x) - f(n - y, m - x); cout << max(ans1, ans2); }
明净的琉璃杯中,斟满琥珀色的美酒,淅淅沥沥槽床滴,浓红恰似火齐珠,煮龙肝,爆凤髓,油脂白,点点又似泪珠涌,锦乡帷帘挂厅堂,春意呵浓浓,笛声悠扬如龙吟,敲起皮鼓响咚咚,吴娃楚女,轻歌软舞,其乐也融融,何况春光渐老日将暮,桃花如雨,飘落满地红,劝世人,不如终日醉呵呵,一日归黄土,纵是酒仙如刘怜,望一杯,也只是,痴人说梦。
小c 很嗜酒,但是小c 的酒已经喝完了,于是他向酒神祈求一些酒,酒神同意了这个请求。但是酒神有个前提:酒分配的多少由一个游戏来决定,小c 必须精准计算出他每次游戏可以获得多少酒,才能真正获得所有的酒。
游戏规则如下:
每次游戏在一个 n×mn×m 的酒桌上进行,酒桌上每一个格子里都有一坛酒,显然,一共有 n×mn×m 坛酒。
小c 可以行动 kk 次,每次行动有两种选择:
①:拿走某一行上剩余的所有酒。
②:拿走某一列上剩余的所有酒。
为了防止小c 作弊,酒神规定:行动①和行动②必须交替执行,不可以连续执行。
为了让小c 酩酊大醉,现在请你帮助小c 计算,游戏行动结束后,他最多可以获得多少坛酒。
题解 :
- 整体趋势是行列各一半
- 如果可以操作奇数次,就是多的那种多一次,k/2的向上取整(k+1)/2
- 注意操作本身要受“有多少”的限制!!不过,不需要再考虑另一种操作用完了的情况,因为本身就是对半分考虑的,最多一个比另一个多一次
#includeusing namespace std; typedef long long ll; ll n, m, k; int main() { int _; cin >> _; while (_ -- ) { cin >> n >> m >> k; if (m > n) swap(n, m); ll a = (k + 1) / 2; a = min(a, m); ll b = k - a; b = min(b, n); cout << a * n + b * m - a * b << endl; } }



