Idea: Roms
Tutorial
Tutorial is loading...
Solution (Roms)
for _ in range(int(input())):
l, r = map(int, input().split())
print(min(l, r, (l + r) // 3))
Idea: Roms
Tutorial
Tutorial is loading...
Solution (Roms)
for _ in range(int(input())):
n, x, m = map(int, input().split())
l, r = x, x
for _ in range(m):
L, R = map(int, input().split())
if max(l, L) <= min(r, R):
l = min(l, L)
r = max(r, R)
print(r - l + 1)
Idea: BledDest
Tutorial
Tutorial is loading...
Solution (BledDest)
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n, m;
cin >> n >> m;
vector<vector<int> > a(n, vector<int>(m));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> a[i][j];
vector<vector<int> > cnt(n + m - 1, vector<int>(2));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cnt[i + j][a[i][j]]++;
int ans = 0;
for(int i = 0; i <= n + m - 2; i++)
{
int j = n + m - 2 - i;
if(i <= j) continue;
ans += min(cnt[i][0] + cnt[j][0], cnt[i][1] + cnt[j][1]);
}
cout << ans << endl;
}
int main() {
int t;
cin >> t;
for(int i = 0; i < t; i++)
solve();
}
Idea: adedalic
Tutorial
Tutorial is loading...
Solution (adedalic)
fun main() {
val n = readLine()!!.toInt()
val a = readLine()!!.split(' ').map { it.toInt() }
val minDiv = IntArray(1e7.toInt() + 2) { it }
for (i in 2 until minDiv.size) {
if (minDiv[i] != i)
continue
for (j in i until minDiv.size step i)
minDiv[j] = minOf(minDiv[j], i)
}
fun getPrimeDivisors(v: Int): ArrayList<Int> {
val ans = ArrayList<Int>()
var curVal = v
while (curVal != 1) {
if (ans.isEmpty() || ans.last() != minDiv[curVal])
ans.add(minDiv[curVal])
curVal /= minDiv[curVal]
}
return ans
}
val d1 = IntArray(n)
val d2 = IntArray(n)
for (id in a.indices) {
val list = getPrimeDivisors(a[id])
if (list.size < 2) {
d1[id] = -1
d2[id] = -1
} else {
d1[id] = list[0]
list.removeAt(0)
d2[id] = list.reduce { s, t -> s * t }
}
}
println(d1.joinToString(" "))
println(d2.joinToString(" "))
}
Idea: Roms
Tutorial
Tutorial is loading...
Solution (Roms)
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
const int MOD = 998244353;
int mul(int a, int b) {
return (a * 1LL * b) % MOD;
}
int n, m;
int a[N], b[N];
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; ++i) scanf("%d", a + i);
for (int i = 0; i < m; ++i) scanf("%d", b + i);
reverse(a, a + n);
reverse(b, b + m);
a[n] = -1;
int mn = a[0];
int pos = 0;
while (pos < n && mn > b[0]) {
++pos;
mn = min(mn, a[pos]);
}
if (pos == n || mn < b[0]) {
puts("0");
return 0;
}
assert(mn == b[0]);
int res = 1;
int ib = 0;
while (true) {
assert(mn == b[ib]);
if (ib == m - 1){
if(*min_element(a + pos, a + n) != b[ib]) {
puts("0");
return 0;
}
break;
}
bool f = true;
int npos = pos;
while (npos < n && mn != b[ib + 1]) {
++npos;
mn = min(mn, a[npos]);
if (f && mn < b[ib]){
f = false;
res = mul(res, npos - pos);
}
}
if (npos == n || mn != b[ib + 1]) {
puts("0");
return 0;
}
++ib;
pos = npos;
}
printf("%d\n", res);
return 0;
}
Idea: Neon
Tutorial
Tutorial is loading...
Solution (pikmike)
#include <bits/stdc++.h>
#define forn(i, n) for (int i = 0; i < int(n); i++)
using namespace std;
const long long INF = 1e18;
const int MOD = 1000'000'007;
const int inv2 = (MOD + 1) / 2;
struct edge{
int v, u, w;
};
struct frac{
long long x, y;
frac(long long a, long long b){
if (b < 0) a = -a, b = -b;
x = a, y = b;
}
};
bool operator <=(const frac &a, const frac &b){
return a.x * b.y <= a.y * b.x;
}
struct line{
long long m, c;
frac intersectX(const line &l) { return frac(c - l.c, l.m - m); }
};
int add(int a, int b){
a += b;
if (a >= MOD)
a -= MOD;
if (a < 0)
a += MOD;
return a;
}
int mul(int a, int b){
return a * 1ll * b % MOD;
}
int calc(int a1, int d, int n){
assert(n >= 0);
return mul(mul(n, inv2), add(mul(2, a1), mul(add(n, -1), d)));
}
int main() {
int n, m;
long long q;
scanf("%d%d%lld", &n, &m, &q);
vector<edge> e(m);
vector<int> hv(n);
forn(i, m){
scanf("%d%d%d", &e[i].v, &e[i].u, &e[i].w);
--e[i].v, --e[i].u;
hv[e[i].v] = max(hv[e[i].v], e[i].w);
hv[e[i].u] = max(hv[e[i].u], e[i].w);
}
int ans = 0;
vector<long long> d(n, -INF), nd(n);
d[0] = 0;
forn(val, m){
long long mx = 0;
forn(i, n)
mx = max(mx, d[i]);
if (val)
ans = add(ans, mx % MOD);
nd = d;
forn(i, m){
nd[e[i].v] = max(nd[e[i].v], d[e[i].u] + e[i].w);
nd[e[i].u] = max(nd[e[i].u], d[e[i].v] + e[i].w);
}
d = nd;
}
vector<line> fin;
forn(i, n) fin.push_back({hv[i], d[i]});
sort(fin.begin(), fin.end(), [](const line &a, const line &b){
if (a.m != b.m)
return a.m < b.m;
return a.c > b.c;
});
fin.resize(unique(fin.begin(), fin.end(), [](const line &a, const line &b){
return a.m == b.m;
}) - fin.begin());
vector<line> ch;
for (auto cur : fin){
while (ch.size() >= 2 && cur.intersectX(ch.back()) <= ch.back().intersectX(ch[int(ch.size()) - 2]))
ch.pop_back();
ch.push_back(cur);
}
long long prv = 0;
q -= m;
forn(i, int(ch.size()) - 1){
frac f = ch[i].intersectX(ch[i + 1]);
if (f.x < 0) continue;
long long lst = min(q, f.x / f.y);
if (lst < prv) continue;
ans = add(ans, calc((ch[i].c + ch[i].m * prv) % MOD, ch[i].m % MOD, lst - prv + 1));
prv = lst + 1;
}
ans = add(ans, calc((ch.back().c + ch.back().m * prv) % MOD, ch.back().m % MOD, q - prv + 1));
printf("%d\n", ans);
return 0;
}
Idea: Neon
Tutorial
Tutorial is loading...
Solution (Ne0n25)
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define sz(a) int((a).size())
#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define fore(i, l, r) for (int i = int(l); i < int(r); ++i)
const int INF = 1e9;
const int N = 10010;
int n, m;
string s, t;
int dp[N][N];
int nxt[N];
int main() {
cin >> s >> t;
n = sz(s), m = sz(t);
forn(i, n) if (s[i] != '.') {
int bal = 0;
nxt[i] = -1;
fore(j, i, n) {
if (s[j] == '.') --bal;
else ++bal;
if (bal == 0) {
nxt[i] = j;
break;
}
}
}
forn(i, n + 1) forn(j, m + 1)
dp[i][j] = INF;
dp[0][0] = 0;
forn(i, n) forn(j, m + 1) {
dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1);
if (j < m && s[i] == t[j])
dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j]);
if (s[i] != '.' && nxt[i] != -1)
dp[nxt[i] + 1][j] = min(dp[nxt[i] + 1][j], dp[i][j]);
}
cout << dp[n][m] << endl;
}