MX2026-S模拟2——原题机老师,我还记得你

\(\color{red}\Large[WARNING]阅读此文档前,请确认您阅读了以下信息:\)

非常好数据,使我骗分旋转

我看第三题出数据的人胆子真是肥嘟嘟的

原题机老师,我还记得你,一道一道,新题指向洛谷里

不是怎么老放原啊!

————某学生

\(\color{red}\Large警告!本文档存在的物品包括但不限于:暴力输出,乱造数据,原题泛滥\)

正文:

T1:

首先挂上洛谷链接:https://www.luogu.com.cn/problem/P14126

看到题目,第一眼以为是枚举宝宝题,写了个暴力,结果可想而知,然后开始思考性质:

不难发现,蚂蚁相撞时,由于速度不变,所以即使调头也只会对编号造成影响,而答案和编号没有关系,于是可以把所有蚂蚁理解成棍木,让他们互相穿过

然后由于处理过的蚂蚁一直在做匀速直线运动,所以每 \(2\times 10^9+1\) 秒它们就又会回到自己一开始的位置上,而此时两边的围栏都被造成了 \(n\) 点伤害,那我们只需要计算最后一轮就行了。

AC code
#define int ll
cst int len=1e9+1;
int n,a,b,x[10000000],y[10000000],m,ans;
prio_q<pll,vector<pll>,greater<pll> >pq;
signed main(){
	fastrd
	//struct _timeb T;
	//_ftime(&T);
	//srand(T.millitm);
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++){
		cin>>x[i];
	}
	for(int i=1;i<=n;i++){
		cin>>y[i];
		if(y[i]==0){
			pq.push({x[i],y[i]});
		}else{
			pq.push({len-x[i],y[i]});
		}
	}
	int v=min(a/n,b/n);
	ans=len*2ll*v;
	a-=v*n;
	b-=v*n;
	while(!pq.empty()){
		int c=pq.top().f,d=pq.top().s;
		pq.pop();
		m=c;
		if(d==0){
			a--;
			if(a>=0){
				pq.push({c+len,1-d});
			}
		}else{
			b--;
			if(b>=0){
				pq.push({c+len,1-d});
			}
		}
	}
	cout<<ans+m;
}

T2:

挂上洛谷链接:https://www.luogu.com.cn/problem/P14121

不难想到,我们可以从 \(1\) 开始,每次都从 \(i\) 走向 \(i+1\),有边就走,没边且自己还有没遍历到的孩子就加边,如果自己孩子都遍历完了但是还是没有 \(i+1\),就回到上一个有孩子没遍历的点继续重复上面操作。

哦对了刚开始存储的时候记得排序子节点,不然会导致顺序紊乱

AC code
vector<int>g[1000000];
int n,m;
int ans,s;
void dfs(int u){
	for(auto i:g[u]){
		if(i<s){
			continue;
		}else{
			while(i>=s){
				if(i==s){
					s++;
					dfs(s-1);
				}else{
					ans++;
					s++;
					dfs(s-1);
				}
			}
		}
	}
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
	cin>>t;
	while(t--){
		for(int i=1;i<=n;i++){
            g[i].clear();
        }
		cin>>n>>m;
		ans=0,s=2;
		for(int i=1;i<=m;i++){
			int u,v;
			cin>>u>>v;
			g[u].pb(v);
			g[v].pb(u);
		}
		g[1].pb(n+1);
		for(int i=1;i<=n;i++){
			sort(g[i].begin(),g[i].end());
		}
		dfs(1);
		cout<<ans<<endl;
	}
}

T3:

依旧是喜闻乐见的洛谷环节:https://www.luogu.com.cn/problem/CF1788E

!?赢大赢?!

22pts:

cout<<n;

100pts:

答案其实就是让你选出一些连续的区间,满足每个选出的区间的数的和都是非负的,求选出区间的最大长度总和。考虑维护前缀和以及每个位置前缀和的最优长度,然后进行 dp,但是时间复杂度是 \(O(N^2)\),原地爆炸,所以考虑用数据结构优化,我们考虑把 dp 对应的值存到值域而不是下标里,那就可以用线段树优化,时间复杂度 \(O(N \log N)\)

点击查看代码
不会写:( 

T4:

洛谷链接:https://www.luogu.com.cn/problem/CF722F

完全不会写.jpg

posted @ 2026-08-31 13:24  lee0730  阅读(7)  评论(1)    收藏  举报