手速题,可是还是慢了
void Solve()
{
cin >> n;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
for(int i = 2; i <= n; i ++ ) cout << a[i] * a[i - 1] << " ";
cout << edl;
}
B.Piano
只要把wbwbwwbwbwbw多复制几遍,暴力枚举即可。
刚开始想歪了,还想了会儿分类讨论
void Solve()
{
s = "wbwbwwbwbwbw";
s = s + s;
s = s + s;
s = s + s;
s = s + s;
s = s + s;
cin >> n >> m;
ll ok1 = 0;
for(int i = 0; i <= 13; i ++ )
{
ll ok = i;
ll sum1 = 0;
ll sum2 = 0;
while(sum1 <= n && sum2 <= m)
{
if(s[ok] == 'w') sum1 ++;
else sum2 ++;
ok ++;
if(sum1 == n && sum2 == m) ok1 = 1;
}
}
if(ok1) cout << "Yes" << edl;
else cout << "No" << edl;
}
C.Σ
先全加,再查找出现就减去(标记一下即可)
void Solve()
{
cin >> n >> m;
ll ans = m * (m + 1) / 2;
for(int i = 1; i <= n; i ++ )
{
ll x;
cin >> x;
if(x <= m && mp[x] == 0) ans -= x;
mp[x] ++;
}
cout << ans << edl;
}
一开始想了一会儿贪心,后来突然发现是预处理+暴力枚举的典题
void Solve()
{
cin >> n >> s;
s = " " + s;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
for(int i = 1; i <= n; i ++ )
{
if(s[i] == '0')
{
ans[0][i] = ans[1][i - 1];
ans[1][i] = ans[0][i - 1] + a[i];
}
else
{
ans[1][i] = ans[0][i - 1];
ans[0][i] = ans[1][i - 1] + a[i];
}
}
for(int i = n; i >= 1; i -- )
{
if(s[i] == '0')
{
bns[0][i] = bns[1][i + 1];
bns[1][i] = bns[0][i + 1] + a[i];
}
else
{
bns[1][i] = bns[0][i + 1];
bns[0][i] = bns[1][i + 1] + a[i];
}
}
ll ans1 = MAX;
for(int i = 1; i < n; i ++ )
{
ans1 = min(ans1,ans[0][i] + bns[0][i + 1]);
ans1 = min(ans1,ans[1][i] + bns[1][i + 1]);
}
cout << ans1 << edl;
}
E.Paint
看完题目感觉是从后往前染色,写完A一发直接WA,结果发现是题目少读了0也算一种颜色,
痛苦面具。。。
void Solve()
{
cin >> n >> m >> k;
ll ok = 0;
for(int i = 1; i <= k; i ++ )
{
cin >> a[i] >> b[i] >> c[i];
}
ll sum = n * m;
for(int i = k; i >= 1; i -- )
{
if(a[i] == 1)
{
if(mp1[b[i]]) continue;
mp1[b[i]] = 1;
ans[c[i]] += m;
if(ans[c[i]] == 0) ans.erase(c[i]);
n -= 1;
}
else
{
if(mp2[b[i]]) continue;
mp2[b[i]] = 1;
ans[c[i]] += n;
if(ans[c[i]] == 0) ans.erase(c[i]);
m -= 1;
}
}
for(auto it : ans)
{
if(it.first != 0) sum -= it.second;
}
if(sum) ans[0] = sum;
cout << ans.size() << edl;
for(auto it : ans)
{
cout << it.first << " " << it.second << edl;
}
}
F.SSttrriinngg in StringString
题目处处都在提示二分,我也顺从其意思直接写了一发二分套二分。
结果直接wa一半仔细一想,二分边界给小了,忙给1e18再交一发
这下更是痛苦面具,开始痛苦的dbug。。。
dbug了半天,发现好像炸ll了又把边界改成1e7,但好像又小了,使用2e7还小?!
最后红温使我4e7+ull一怒之下冲过去了。。。
ull a[26][N];
int ck(ull x)
{
if(x == 0) return 1;
ull ans = 0;
ull ok = 0;
for(int i = 0; i < ss.length(); i ++ )
{
ull x1 = ss[i] - 'a';
if(a[x1][s.length() - 1] == 0) return 0;
ans += x / a[x1][s.length() - 1];
ull op = x % a[x1][s.length() - 1];
if(op == 0)
{
op = a[x1][s.length() - 1];
ans -= 1;
}
if(a[x1][ok] + op <= a[x1][s.length() - 1])
{
ok = lower_bound(a[x1] + ok,a[x1] + s.length(),op + a[x1][ok]) - a[x1];
}
else
{
ans += 1;
op -= a[x1][s.length() - 1] - a[x1][ok];
ok = lower_bound(a[x1],a[x1] + s.length(),op) - a[x1];
}
}
if(ok) ans ++;
if(ans > n) return 0;
else return 1;
}
void Solve()
{
cin >> n;
cin >> s >> ss;
s = " " + s;
for(int i = 1; i < s.length(); i ++ )
{
a[s[i] - 'a'][i] ++;
}
for(int i = 0; i < 26; i ++ )
{
for(int j = 1; j < s.length(); j ++ )
{
a[i][j] += a[i][j - 1];
}
}
ull l = 0;
ull r = 400000000000000000;
while(l <= r)
{
ull mid = (l + r) >> 1;
if(ck(mid)) l = mid + 1;
else r = mid - 1;
}
cout << r << edl;
}
G.Alone
时间已经来不及了,听说是一道线段树今晚补掉。