VP Codeforces Round 908 (Div. 2)


A - Secret Sport

题意:两个人比赛,每有一个人赢了X场就算它赢了一轮。比赛是在有一个人赢了Y轮后结束。你不知道XY,但给你一个每场的输赢情况,求谁是赢家。

去求XY非常难,不如倒着想,一轮必然是因为赢的那个人赢了一把而结束,同样,整个比赛也是因为赢的那个人赢了一轮而结束。所以,最后一个赢得人就是赢家。

点击查看代码
void solve() {
    int n;
    std::cin >> n;
    std::string s;
    std::cin >> s;
    std::cout << s.back() << "\n";
}

B. Two Out of Three

题意:题意,给你一个a,你要构造一个b使得正好满足三个条件其中得任意两个。

  1. 有一个 1i,jn 使得 ai=aj, bi=1, bj=2.
  2. 有一个 1i,jn 使得 ai=aj, bi=1, bj=3.
  3. 有一个 1i,jn 使得 ai=aj, bi=2, bj=3.

对于每一类数,他们只能有两个不同的值,否则就会同时满足三个条件。那么让每个个数大于等于2的数字满足一个条件,只需要两类数就可以满足两个条件,其他的全部赋值为1就行。

点击查看代码
void solve() {
    int n;
    std::cin >> n;
    std::vector<int> a(n);
    for (int i = 0; i < n; ++ i) {
    	std::cin >> a[i];
    }

    std::map<int, std::vector<int> > mp;
    for (int i = 0; i < n; ++ i) {
    	mp[a[i]].push_back(i);
    }

    std::vector<int> b(n, 1);
    int cnt = 0;
    for (auto & [x, a] : mp) {
    	if (a.size() >= 2) {
    		if (cnt == 0) {
	    		b[a[1]] = 2;
    		} else if (cnt == 1) {
    			b[a[1]] = 3;
    		}
    		++ cnt;
    	} 
    }

    if (cnt < 2) {
    	std::cout << -1 << "\n";
    } else {
    	for (int i = 0; i < n; ++ i) {
    		std::cout << b[i] << " \n"[i == n - 1];
    	}
    }
}	

C. Anonymous Informant

题意:如果ai=i,则可以让a左移i次。现在给你一个数组b,说他是由某个数组进行k次操作变过来的,判断对错。

模拟一下发现,因为ai=i,那么左移i次后ai到了结尾。因为b是变过来的,那么它的最后一个数就代表上一次左移了几位,那我们可以不断右移反着回去,如果某一次出现操作的数大于n,则无解。如果有一个位置出现两次,说明有环,我们在环上必然可以选一个起点使得它操作k次变成b。我们模拟min(n,k)次即可。因为n次必然会出现一个环,否则我们k<n并且可以操作n次以上,一定有一个数组可以通过k次操作到b

点击查看代码
void solve() {
	int n, k;
	std::cin >> n >> k;
	std::vector<int> a(n);
	for (int i = 0; i < n; ++ i) {
		std::cin >> a[i];
	}

	int x = 0;
	std::vector<int> st(n);
	st[0] = 1;
	for (int i = 0; i < std::min(n, k); ++ i) {
		if (a[n - 1 - x] > n) {
			std::cout << "NO\n";
			return;
		}

		x += a[n - 1 - x];
		x %= n;
		if (st[x]) {
			std::cout << "YES\n";
			return;
		}

		st[x] = 1;
	}

	std::cout << "YES" << "\n";
}

D. Neutral Tonality

做过最简单的d

题意:给你两个数组a,b,你要把b的每个数插到a的任意一个位置,让最后数组的最长子序列长度最短。

如果ai>ai+1,那么我们是不是可以把[ai+1,ai]的数都插到中间,这样不会使LIS变长。然后发现,好像就做完了。

点击查看代码
void solve() {
    int n, m;
    std::cin >> n >> m;
    std::vector<int> a(n), b(m);
    for (int i = 0; i < n; ++ i) {
    	std::cin >> a[i];
    }

    for (int i = 0; i < m; ++ i) {
    	std::cin >> b[i];
    }

    
    std::vector<int> ans;
	std::sort(b.begin(), b.end(), std::greater<int>());
	int j = 0;
	for (int i = 0; i < n; ++ i) {
		while (j < m && b[j] >= a[i]) {
			ans.push_back(b[j ++ ]);
		}

		ans.push_back(a[i]);
	}

	while (j < m) {
		ans.push_back(b[j ++ ]);
	}

    for (int i = 0; i < n + m; ++ i) {
    	std::cout << ans[i] << " \n"[i == n + m - 1];
    }
}

E. Freedom of Choice

题意:m个多重集,第i个多重集有ni个数,每个数有ci个。你要从每个集合里选数,选的个数在[li,ri]之间。定义集合的价值为在集合内且等于集合元素个数的元素数量。

我们可以枚举选i数,那么尽量不要选i这个数字。每个数字模拟一下取最小值就行。

点击查看代码
void solve() {
    int m;
    std::cin >> m;
    std::map<i64, std::vector<std::pair<int, i64> > > mp;
    std::vector<std::array<i64, 4> > a(m);
    i64 suml = 0, sumr = 0;
    for (int i = 0; i < m; ++ i) {
    	i64 n, l, r;
    	std::cin >> n >> l >> r;
    	suml += l, sumr += r;
    	std::vector<i64> b(n), c(n);
    	for (int j = 0; j < n; ++ j) {
    		std::cin >> b[j];
    	}

    	for (int j = 0; j < n; ++ j) {
    		std::cin >> c[j];
    	}

    	i64 tot = 0;
    	for (int j = 0; j < n; ++ j) {
    		mp[b[j]].push_back({i, c[j]});
    		tot += c[j];
    	}
    	a[i] = {n, l, r, tot};
    }

    for (i64 i = suml; i <= sumr; ++ i) {
    	if (!mp.count(i)) {
    		std::cout << 0 << "\n";
    		return;
    	}
    }

    i64 ans = 1e18;
    for (i64 i = suml; i <= sumr; ++ i) {
    	i64 sum = sumr, res = 0;
    	for (auto & [id, cnt] : mp[i]) {
    		auto & [n, l, r, tot] = a[id];
    		sum -= r;
    		if (tot - cnt < l) {
    			res += l - (tot - cnt);
    			sum += l;
    		} else {
    			sum += std::min(r, tot - cnt);
    		}
    	}

    	res += std::max(0ll, i - sum);
    	ans = std::min(ans, res);
    }

    std::cout << ans << "\n";
}
posted @   maburb  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示