suxxsfe

一言(ヒトコト)

RoboContest Round 103(pi Round)比赛题解

A

\(*\color{brown}{405}\)

太简单了,不讲了。

#include<iostream>
#include<cstring>
using namespace std;
int t,n;
string s;
int main(){
	cin>>t;
	while(t--){
		cin>>n>>s;
		int ans=0;
		for(int i=0;i<n;i++){
			if(s[i]=='1'){
				ans=n-1-i;
				break;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
} 

B1

\(*\color{green}{821}\)

定义 \(p_i\gets a_ik,q_i\gets\lfloor\frac{a_i}{k}\rfloor\) ,那么求 \(p\)\(q\) 的非空最大子段和取个 max 输出就好了。

B2

\(*\color{cyan}{1221}\)

我们先只考虑 \(k\ge 0\) 的情况。

我们定义区间 \([l_1,r_1]\) 严格包含区间 \([l_2,r_2]\) 当且仅当 \(l_1\le l_2,r_1\ge r_2\)\((l_1,r_1)\neq (l_2,r_2)\)

  • Observation 1 : 假设我们操作了区间 \([l,r]\) ,最终最大子段和取的是区间 \([l_2,r_2]\) ,那么 \([l_2,r_2]\)\([l,r]\) 之间要么互不相交,要么存在包含关系,且 \([l,r]\) 不能严格包含 \([l_2,r_2]\)

证明:如果有相交且不包含的情况或 \([l,r]\) 严格包含 \([l_2,r_2]\) 的情况,可以缩短 \([l,r]\) 使其满足包含关系。

那么接下来令 \(l_i=\max\limits_{j=1}^{i+1}(\sum\limits_{k=j}^i a_k),r_i=\max\limits_{j=i-1}^n(\sum\limits_{k=i}^j a_k)\)\(p_i=\lfloor\frac{a_i}{k}\rfloor\)\(q_i=a_ik\)

那么答案就变成了 \(\max(\max\limits_{1\le i\le j\le n}(l_{i-1}+r_{j+1}+\sum\limits_{k=i}^j p_k),\max\limits_{1\le i\le j\le n}(l_{i-1}+r_{j+1}+\sum\limits_{k=i}^j q_k))\)

这个直接暴力扫一遍就行了,复杂度 \(O(n)\)

然后我们再来考虑 \(k<0\) 的情况,容易发现和刚才的分析一模一样,因此不讲了。

难绷,上面的读错题了,我们姑且称之为 B2 。

C

D

E

F

G

H

I

posted @ 2026-04-19 19:46  卫道士isME  阅读(7)  评论(0)    收藏  举报