Educational Codeforces Round 130 (Rated for Div. 2)
补题喽!!!
A. Parkway Walk
Solution
没啥好说的,题目都是晃人的,最终都是要花费的。
Code
void solve()
{
int sum = 0, x;
cin >> n >> m;
for(int i = 1; i <= n; ++i) cin >> x, sum += x;
cout << max(sum - m, 0ll) << "\n";
}
B. Promo
Solution
非常基础的前缀和查询题。
Code
int n, q, a[N], s[N];
void solve()
{
cin >> n >> q;
for(int i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + 1 + n, greater<int>());
for(int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i];
while(q--)
{
int r, l;
cin >> r >> l;
cout << s[r] - s[r - l] << "\n";
}
}
C. awoo's Favorite Problem
Solution
总结来看,b作为a和c移动的跳板,没有任何影响。我们首先看a、c的数量是否相同,相同则可以继续往下做,不同我们就看a、c的相对位置是否满足相对关系,因为a只能往后走,c只能往前走,所以第一个字符串a的位置与第二个字符串a的位置,对应都是<=的位置关系,c同理。判断即可。
Code
int n;
string s, t;
void solve()
{
cin >> n >> s >> t;
string s1 = "", s2 = "";
for(int i = 0; i < n; ++i)
{
if(s[i] != 'b') s1 += s[i];
if(t[i] != 'b') s2 += t[i];
}
if(s1 != s2)
{
cout << "NO\n";
return;
}
vector<int> c1, c2;
for(int i = 0; i < n; ++i)
{
if(s[i] == 'c') c1.push_back(i);
if(t[i] == 'c') c2.push_back(i);
}
for(int i = 0; i < c1.size(); ++i)
{
if(c1[i] < c2[i])
{
cout << "NO\n";
return;
}
}
vector<int> a1, a2;
for(int i = 0; i < n; ++i)
{
if(s[i] == 'a') a1.push_back(i);
if(t[i] == 'a') a2.push_back(i);
}
for(int i = 0; i < a1.size(); ++i)
{
if(a1[i] > a2[i])
{
cout << "NO\n";
return;
}
}
cout << "YES\n";
}
D. Guess The String
Solution
记录每次新出现字符的位置,如果没有出现,说明查询1-i数量相等,二分寻找该字符。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 100;
char ask1(int i)
{
cout << "? 1 " << i << endl;
char t;
cin >> t;
return t;
}
int ask2(int l, int r)
{
cout << "? 2 " << l << " " << r << endl;
int t;
cin >> t;
return t;
}
int n;
char ans[N], sum;
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
vector<int> v;
cin >> n;
for(int i = 1; i <= n; i++)
{
int t = ask2(1, i);
if(t > sum)
{
ans[i] = ask1(i);
v.push_back(i);
}
else
{
int l = 0, r = v.size() - 1;
while(l < r)
{
int mid = (l + r + 1) >> 1;
int t = ask2(v[mid], i);
if(t != v.size() - mid + 1) l = mid;
else r = mid - 1;
}
ans[i] = ans[v[l]];
v[l] = i;
sort(v.begin(), v.end());
}
sum = t;
}
cout << "! ";
for(int i = 1; i <= n; ++i) cout << ans[i];
return 0;
}

浙公网安备 33010602011771号