首页 > 其他分享 >VP AtCoder Beginner Contest 381

VP AtCoder Beginner Contest 381

时间:2025-01-19 17:32:38浏览次数:1  
标签:std AtCoder suf int cin VP 381 && ans

A - 11/22 String

题意:定义\(11/22\)串是前面都是\(1\)后面都是\(2\),\(1,2\)的个数相同,中间是一个'/'。 判断给你的字符串是不是\(11/22\)串。

模拟即可。

点击查看代码
void solve() {
	int n;
	std::cin >> n;
    std::string s;
    std::cin >> s;
    if (n % 2 == 0 || s.substr(0, n / 2) != std::string(n / 2, '1') || s.substr(n / 2 + 1) != std::string(n / 2, '2') || s[n / 2] != '/') {
    	std::cout << "No\n";
    } else {
    	std::cout << "Yes\n";
    }
}

B - 1122 String

题意:定义\(1122\)串为每个奇数位置\(i\),都有\(a_i = a_{i+1}\),并且每个数只能恰好出现两次。判断是不是\(1122\)串。

一样模拟。

点击查看代码
void solve() {
    std::string s;
    std::cin >> s;
    int n = s.size();
    if (n & 1) {
    	std::cout << "No\n";
    	return;
    }

    std::vector<int> cnt(26);
    for (int i = 0; i < n; i += 2) {
    	if (s[i] != s[i + 1]) {
    		std::cout << "No\n";
    		return;
    	}

    	if (cnt[s[i] - 'a']) {
    		std::cout << "No\n";
    		return;
    	}

    	cnt[s[i] - 'a'] = 1;
    }

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

C - 11/22 Substring

题意:和\(A\)题一样,不过要你判断字符串是\(11/22\)串的最长子串的长度。

在每个'/'处两边扩展记录最长长度即可。

点击查看代码
void solve() {
	int n;
	std::cin >> n;
	std::string s;
	std::cin >> s;
	int ans = 0;
	for (int i = 0; i < n; ++ i) {
		if (s[i] == '/') {
			int k = 1;
			while (i - k >= 0 && i + k < n && s[i - k] == '1' && s[i + k] == '2') {
				++ k;
			}

			ans = std::max(ans, (k - 1) * 2 + 1);
		}
	}

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

D - 1122 Substring

题意:和\(B\)题一样,不过要你判断字符串是\(1122\)串的最长子串的长度。

记录每个数出现的次数,分奇数起点和偶数起点分别双指针模拟即可。

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

    std::vector<int> st(n + 1);
    int ans = 0;
    for (int i = 0, j = 0; i + 1 < n;) {
    	j = std::max(i, j);
    	while (j + 1 < n && a[j] == a[j + 1] && st[a[j]] == 0) {
    		st[a[j]] = 1;
    		j += 2;
    	}

    	ans = std::max(ans, j - i);
		st[a[i]] = 0;
    	i += 2;
    }

    for (int i = 1, j = 1; i + 1 < n;) {
    	j = std::max(i, j);
    	while (j + 1 < n && a[j] == a[j + 1] && st[a[j]] == 0) {
    		st[a[j]] = 1;
    		j += 2;
    	}

    	ans = std::max(ans, j - i);
		st[a[i]] = 0;
    	i += 2;
    }

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

E - 11/22 Subsequence

题意:和\(A\)一样,不过有\(Q\)次询问,每次问你\([L, R]\)区间内\(11/22\)最长子序列是多少。

把所有'/'的位置存下来,然后记录\(1\)和\(2\)的前缀和。那么每次找到第一个位置大于等于\(L\)的'/'和最后一个小于等于\(R\)的'/',那么可以二分,如果当前'/'两边\(1\)的个数大于等于\(2\)的个数我们就应该往左边走,否则往右边走。因为这个二分出来的不一定是最优解,所以我们需要在二分过程中记录答案。

点击查看代码
void solve() {
    int n, q;
	std::cin >> n >> q;
	std::string s;
	std::cin >> s;

	std::vector<int> sum1(n + 1), sum2(n + 1);
	std::vector<int> a;
	for (int i = 0; i < n; ++ i) {
		sum1[i + 1] = sum1[i] + (s[i] == '1');
		sum2[i + 1] = sum2[i] + (s[i] == '2');
		if (s[i] == '/') {
			a.push_back(i + 1);
		}
	}

	while (q -- ) {
		int l, r;
		std::cin >> l >> r;
		int L = std::lower_bound(a.begin(), a.end(), l) - a.begin();
		int R = std::upper_bound(a.begin(), a.end(), r) - a.begin() - 1;
		if (L > R) {
			std::cout << 0 << "\n";
			continue;
		}

		int ans = 0;
		while (L <= R) {
			int mid = L + R >> 1;
			int one = sum1[a[mid]] - sum1[l - 1], two = sum2[r] - sum2[a[mid]];
			ans = std::max(ans, std::min(one, two));
			if (one >= two) {
				R = mid - 1;
			} else {
				L = mid + 1;
			}
		}

		std::cout << ans * 2 + 1 << "\n";
	}
}

F - 1122 Subsequence

题意:跟\(B\)题一样,不过要你求最长的\(1122\)子序列。

注意值域只有\(20\),我们可以状压。记录满足\(f_i\)这个状态用到的数的最后位置。用\(suf_{i,j}\)记录第\(i\)个位置后面\(j\)出现的最早位置。那么如果\(suf_{f_i,j}\)与\(suf_{suf_{f_i,j},j}\)都存在,那么\(f_i\)可以转移到\(f_{i|(1<<j)}\)。

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

    for (int i = n - 1; i >= 0; -- i) {
    	suf[i] = suf[i + 1];
    	suf[i][a[i]] = i + 1;
    }

    std::vector<int> f(1 << 20, n + 1);
    f[0] = 0;
    for (int i = 0; i < 1 << 20; ++ i) {
    	if (f[i] > n) {
    		continue;
    	}
    	for (int j = 0; j < 20; ++ j) {
    		if ((~i >> j & 1) && suf[f[i]][j] != 0 && suf[suf[f[i]][j]][j] != 0) {
    			f[i | (1 << j)] = std::min(f[i | (1 << j)], suf[suf[f[i]][j]][j]);
    		}
    	}
    }

    int ans = 0;
    for (int i = 0; i < 1 << 20; ++ i) {
    	if (f[i] <= n) {
    		ans = std::max(ans, __builtin_popcount(i));
    	}
    }

    std::cout << ans * 2 << "\n";
}

标签:std,AtCoder,suf,int,cin,VP,381,&&,ans
From: https://www.cnblogs.com/maburb/p/18679729

相关文章

  • Atcoder ABC389E Square Price 题解 [ 绿 ] [ 二分 ] [ 贪心 ]
    SquarePrice:垃圾卡精度,垃圾卡精度,垃圾卡精度,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人。把ll改__int128前WA*22,改__int128直接AC了,难评。抛开卡精度这题还是挺好的。暴力先考虑暴力思路,显然暴力应该这么打:把所有物品全丢进优先队列......
  • Toyota Programming Contest 2025(AtCoder Beginner Contest 389)
    A-9x9题意:给你一个长度为\(3\)的乘法式,求答案。直接求即可。点击查看代码voidsolve(){std::strings;std::cin>>s;std::cout<<(s[0]-'0')*(s[2]-'0')<<"\n";}B-tcaF题意:求一个\(n\),使得\(n!=x\)。模拟即可。点......
  • AtCoder Beginner Contest 388
    A-A-?UPC题意给定字符串\(s\),输出\(s\)首个字符与\(UPC\)组成的字符串思路模拟代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ strings; ci......
  • AtCoder Regular Contest 058 [ARC058] F - Unhappy Hacking
    题意:有三种操作,在右边添加0/1或删除最右边的数(空字符串无操作)给出操作数\(N\),字符串\(s\),问有多少种方法经过\(N\)次操作后得到字符串\(S\)思路最开始在想三维dp,虽然发现了性质,但是没想到很好的用法重要性质:答案与字符串内容无关,仅与字符串长度有关定义\(f_{i,j}\)为操作\(i......
  • vPC Object Tracking
    未启用vPCobjecttracking当primary设备上承载peer-link和uplinks的vPC的板卡发生故障时,即便secondary设备运行正常,也会导致完全流量黑洞。因为peer-link断开,secondary会挂起vPC VLAN/SVI,primary设备上的vPC仍将保持启用状态但同时上行链路断开,(南北向)流量就会被丢弃......
  • HTTPS与VPN:保护互联网用户的不同方法
    HTTPS是什么?HTTPS(超文本传输安全协议)是一种用于网络浏览器与网站之间通信的安全连接协议。它通过TLS(传输层安全)协议来加密用户和站点之间的数据交换,确保信息的安全性和完整性。此外,HTTPS还进行身份验证,以确认双方的真实身份,并确保传输的数据未被篡改。数据加密:HTTPS使用TLS......
  • Android 13 14 vpn中怎么实现pptp和l2tp模式
    目录1.背景2.上层逻辑3.Vpn状态同步4.你咋不给我生成state文件5.最终patch1.背景    由于google在Android13中处于安全性考虑,去掉了vpn中的pptp模式和l2tp模式,但是客户有需求还是要在vpn中通过pptp模式和l2tp模式进行vpn连接,所以目前首选方案是将android12......
  • VP AtCoder Beginner Contest 382
    A-DailyCookie题意:有\(n\)个盒子,有些盒子有蛋糕,被人吃了\(m\)个蛋糕,问有几个盒子没蛋糕。直接计算即可。点击查看代码voidsolve(){intn,m;std::cin>>n>>m;std::strings;std::cin>>s;std::cout<<n-std::count(s.begin(),s.end(),......
  • VP Codeforces Round 911 (Div. 2)
    A.CoverinWater题意:有n个格子,有些格子是好的,有些是坏的,你要给好格子都装上水,你可以花费一点价值让一个格子有水,也可以把一个格子的水移到另一个格子,没有花费。如果一个格子是好格子并且两边的格子都有水,这个格子就会自己填满水。问最少花费让所有好格子有水。容易想到,如果......
  • 国产化板卡设计原理图:2274-基于FMC接口的JFM7VX690T36的3U VPX信号处理板
    基于FMC接口的JFM7VX690T36的3UVPX信号处理板一、板卡概述     本板卡系我司自主研发的基于3U VPX导冷架构的信号处理板,适用于高速图像处理等。芯片采用工业级设计。该处理板包含1片 FPGA-JFM7VX690T36。板载两组64位宽DDR3,每组容量4GB,一个HPC FMC接口。VPX接口连接4......