标签:std 字符 Educational Rated int Codeforces mid ++ le
A. Parkway Walk
如果能量不足就补充至恰好足够,然后模拟。
B. Promo
易得:选最贵的\(x\)个商品最优。
然后排序加前缀和优化就可以\(O(n\log n) \sim O(1)\)做。
C. awoo's Favorite Problem
从左至右遍历\(s\),假设遍历到\(i\),如果\(s_i \ne t_i\),尝试用给定操作救一下,救不了就无解。
操作1能来救:\(s_i\)是b
,\(t_i\)是a
,且\(s\)中当前位置到下一个\(a\)中间这段全都是b
的情况。
操作2类似。
对于每种字符拿个std::set
存字符出现的位置,然后模拟。
D. Guess The String
题意
交互题。
有一个长度为\(n\)的串\(s\)。
支持两种操作:
1 i
: 返回\(s_i\)。2 l r
:返回\(s_l\dots s_r\)中不同字符的个数。
要求通过不超过\(26\)次操作1和不超过\(6000\)次操作2猜出\(s\)。
其中\(1 \le n \le 1000\)。
思路
这题不难其实,就是调代码调了40min,还WA 3了一发。。。
从左至右依次猜每个位置上的字符是什么。
维护每个字符最后出现的位置。将这些位置升序排序,不妨记为\(p_i, 1\le i \le k\)。对于其中一个位置\(p_i\),如果\(s_i\)没有在\(s_{p_i}\dots s_i\)中出现过,那么这一段中不同字符的个数为\(1 + k - i + 1\),否则为\(k - i + 1\)。
假设\(y\)等于满足\(s_{p_x}\dots s_i\)中不同字符个数等于\(k - x + 1\)的最大的\(x\),那么\(s_i = s_y\)。
如果没有满足条件的\(x\)就说明\(s_i\)之前没有出现过,用操作1确定。
容易看出这个是有单调性的,可以通过二分找\(y\)或者确定没有满足条件的\(x\)。
只有\(s_i\)之前没有出现过才会用操作1确定,所以操作1至多用26次。
对于\(s_i\),每个位置\(O(\log |\Sigma|) \le 6\)次,所以操作2至多用\(6n \le 6000\)次。
AC代码
// Problem: D. Guess The String
// Contest: Codeforces - Educational Codeforces Round 130 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1697/problem/D
// Memory Limit: 512 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define CPPIO std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
#define freep(p) p ? delete p, p = nullptr, void(1) : void(0)
#ifdef BACKLIGHT
#include "debug.h"
#else
#define logd(...) ;
#endif
using i64 = int64_t;
using u64 = uint64_t;
void solve_case(int Case);
int main(int argc, char* argv[]) {
CPPIO;
int T = 1;
// std::cin >> T;
for (int t = 1; t <= T; ++t) {
solve_case(t);
}
return 0;
}
std::mt19937 rng(time(0));
void solve_case(int Case) {
int n;
#ifdef BACKLIGHT
n = 1000;
std::string t(n + 1, '?');
for (int i = 1; i <= n; ++i) {
t[i] = rng() % 26 + 'a';
}
logd(t);
auto Q1 = [&t](int x) -> char {
++x;
return t[x];
};
auto Q2 = [&t](int l, int r) -> int {
++l, ++r;
std::set<char> st;
for (int i = l; i <= r; ++i) {
st.insert(t[i]);
}
return st.size();
};
#else
auto Q1 = [](int x) -> char {
++x;
std::cout << "? 1 " << x << std::endl;
char r;
std::cin >> r;
return r;
};
auto Q2 = [](int l, int r) -> int {
++l, ++r;
std::cout << "? 2 " << l << " " << r << std::endl;
int t;
std::cin >> t;
return t;
};
std::cin >> n;
#endif
std::string s(n, '?');
std::vector<int> p(26, -1);
s[0] = Q1(0);
p[s[0] - 'a'] = 0;
for (int i = 1; i < n; ++i) {
std::vector<int> q;
for (int i = 0; i < 26; ++i) {
if (p[i] != -1) {
q.push_back(p[i]);
}
}
std::sort(q.begin(), q.end());
int z = -1;
{
// logd(q);
int l = 0, r = q.size() - 1, mid;
while (l <= r) {
mid = (l + r) >> 1;
int x = q.size() - mid + 1;
int y = Q2(q[mid], i);
// logd(mid, x, y);
if (y == x)
r = mid - 1;
else
l = mid + 1, z = q[mid];
}
}
if (z == -1) {
s[i] = Q1(i);
} else {
s[i] = s[z];
}
// logd(i, s[i], z);
p[s[i] - 'a'] = i;
}
std::cout << "! " << s << "\n";
#ifdef BACKLIGHT
logd(s, t);
for (int i = 0; i < n; ++i) {
if (s[i] != t[i + 1]) {
logd(i, s[i], t[i + 1]);
}
}
assert(s == t.substr(1));
#endif
}
E. Coloring
会做的题一眼秒,不会做的题想1h都想不出来。
TBA。
F. Too Many Constraints
TBA。
标签:std,字符,Educational,Rated,int,Codeforces,mid,++,le 来源: https://www.cnblogs.com/zengzk/p/16369422.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。