Part2 基础算法
模拟
点击查看代码
int n;
struct Node{
int a, b, g, k;
}node[N];
void solve() {
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> node[i].a >> node[i].b >>
node[i].g >> node[i].k;
}
int x, y; cin >> x >> y;
int ans;
for (int i = 1; i <= n; i ++) {
int a = node[i].a, b = node[i].b,
g = node[i].g, k = node[i].k;
if (x >= a && x <= a + g && y >= b && y <= b + k)
ans = i;
}
cout << ans << endl;
}
点击查看代码
int n;
void solve() {
cin >> n;
if (n == 0) {
printf("1");
return ;
}
for (int i = n; i >= 0; i --) {
int num; cin >> num;
if (i == n) {
if (num == 0) continue;
if (num > 0) {
if (num == 1) printf("x^%d", i);
else printf("%dx^%d", num, i);
} else {
if (num == -1) printf("-x^%d", i);
else printf("%dx^%d", num, i);
}
}
else if (i == 0) {
if (num == 0) continue;
if (num > 0) {
printf("+%d", num);
} else {
printf("%d", num);
}
}
else if (i == 1) {
if (num == 0) continue;
if (num > 0) {
if (num == 1) printf("+x");
else printf("+%dx", num);
} else {
if (num == -1) printf("-x");
else printf("%dx", num);
}
}
else {
if (num == 0) continue;
if (num > 0) {
if (num == 1) printf("+x^%d", i);
else printf("+%dx^%d", num, i);
} else {
if (num == -1) printf("-x^%d", i);
else printf("%dx^%d", num, i);
}
}
}
}
点击查看代码
int n, na, nb;
int a[N], b[N];
int check(int x, int y) {
if (x == 0) {
if (y == 0) return 1;
else if (y == 1 || y == 4) return 2;
else return 3;
} else if (x == 1) {
if (y == 1) return 1;
else if (y == 2 || y == 4) return 2;
else return 3;
} else if (x == 2) {
if (y == 2) return 1;
else if (y == 3) return 2;
else return 3;
} else if (x == 3) {
if (y == 3) return 1;
else return 3;
} else {
return 1;
}
}
void solve() {
cin >> n >> na >> nb;
for (int i = 0; i < na; i ++)
cin >> a[i];
for (int i = 0; i < nb; i ++)
cin >> b[i];
int ans1 = 0, ans2 = 0;
for (int i = 0; i < n; i ++) {
int x = a[i % na],
y = b[i % nb];
bool fl = false;
if (x > y) {
swap(x, y);
fl = true;
}
if (check(x, y) == 2) {
if (!fl) ans2 ++;
else ans1 ++;
}
else if (check(x, y) == 3) {
if (!fl) ans1 ++;
else ans2 ++;
}
//cout << ans1 << ' ' << ans2 << endl;
}
// 0 1 2 3 4 0 1 2 3 4
// 0 3 4 2 1 0 0 3 4 2
cout << ans1 << ' ' << ans2 << endl;
}
点击查看代码
struct Node{
int st;
string name;
}node[N];
int n, m;
int a[N], b[N];
void solve() {
cin >> n >> m;
for (int i = 0; i < n; i ++)
cin >> node[i].st >> node[i].name;
int nw = 0;
while (m --) {
int x, y;
cin >> x >> y;
int st = node[nw].st;
if (x == 0) {
if (st == 0) {
nw = (nw - y + n) % n;
} else {
nw = (nw + y) % n;
}
} else {
if (st == 0) {
nw = (nw + y) % n;
} else {
nw = (nw - y + n) % n;
}
}
}
cout << node[nw].name << endl;
}
二分答案
点击查看代码
double a, b, c, d;
double f(double x) {
return a * x * x * x + b * x * x + c * x + d;
}
void solve () {
cin >> a >> b >> c >> d;
for (int i = -100; i <= 99; i ++) {
double l = i, r = i + 1;
if (f(l) == 0) {
printf("%.2lf ", l);
continue;
}
if (f(l) * f(r) < 0) {
for (int j = 1; j <= 60; j ++) {
double mid = (l + r) / 2;
if (f(mid) * f(l) <= 0) r = mid;
else l = mid;
}
printf("%.2lf ", l);
}
}
return ;
}
点击查看代码
int n, m, L;
int a[N];
bool check(int x) {
int cn = 0;
int i = 0, j = 1;
while (j <= n + 1) {
int l = a[i], r = a[j];
if (r - l < x) {
j ++;
cn ++;
} else {
i = j;
j ++;
}
}
return cn <= m;
}
void solve () {
cin >> L >> n >> m;
a[0] = 0;
a[n + 1] = L;
for (int i = 1; i <= n; i ++) cin >> a[i];
int l = 1, r = L + 1;
while (l < r) {
int mid = (l + r + 1) / 2;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << l << endl;
return ;
}
点击查看代码
bool bfs(int sx, int sy, int mx) {
queue<PII> q;
mem0(vis);
q.push({sx, sy});
vis[sx][sy] = true;
int cn = 0;
while (q.size()) {
PII pi = q.front();
q.pop();
int x = pi.fi, y = pi.sc;
for (int i = 0; i < 4; i ++) {
int xx = x + dx[i], yy = y + dy[i];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= m
&& a[xx][yy] <= mx && !vis[xx][yy]) {
q.push({xx, yy});
vis[xx][yy] = true;
if (xx == n) cn ++;
}
}
}
return cn == m;
}
bool check(int x) {
bool fl = false;
if ((bfs(1, 1, x)))
fl = true;
return fl;
}
void solve () {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++)
cin >> a[i][j];
}
int l = 1, r = 1000 + 1;
while (l < r) {
int mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
return ;
}
点击查看代码
ll n, m, s, ans = 0x3f3f3f3f3f3f3f3f, res;
PLL a[N], b[N];
ll sw[N], sv[N];
bool check(ll x) {
for (int i = 1; i <= n; i ++) {
if (a[i].fi >= x)
sw[i] = sw[i - 1] + 1, sv[i] = sv[i - 1] + a[i].sc;
else
sw[i] = sw[i - 1], sv[i] = sv[i - 1];
}
ll nw = 0;
for (int i = 1; i <= m; i ++)
nw += (sw[b[i].sc] - sw[b[i].fi - 1]) * (sv[b[i].sc] - sv[b[i].fi - 1]);
res = llabs(nw - s);
if (nw - s < 0) return false;
else return true;
}
void solve () {
cin >> n >> m >> s;
for (int i = 1; i <= n; i ++) cin >> a[i].fi >> a[i].sc;
for (int i = 1; i <= m; i ++) cin >> b[i].fi >> b[i].sc;
ll l = 0, r = 1e6 + 1;
while (l < r) {
ll mid = (l + r + 1) / 2;
if (check(mid)) l = mid;
else r = mid - 1;
if (res < ans) ans = res;
}
cout << ans << endl;
return ;
}
点击查看代码
int n, m;
int a[N], d[N], s[N], t[N];
int c[N], ne[N];
bool check(int x) {
for (int i = 1; i <= n; i ++) {
ne[i] = ne[i - 1] + c[i];
if (ne[i] > a[i]) {
return false;
}
}
return true;
}
void solve () {
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= m; i ++) {
cin >> d[i] >> s[i] >> t[i];
c[s[i]] += d[i];
c[t[i] + 1] -= d[i];
}
if (check(m)) {
cout << 0 << endl;
return ;
}
int l = 1, r = m;
while (l < r) {
int mid = (l + r) / 2;
if (check(mid)) l = mid + 1;
else r = mid;
}
cout << -1 << endl << l << endl;
return ;
}
点击查看代码
int n, m;
ll a[N], lo[N];
ll check(ll x) {
ll nw = 0, cn = 0;
for (int i = 1; i <= n; i ++) {
if (lo[i] >= 0) {
nw += lo[i];
if (nw >= x) {
cn ++;
nw = 0;
}
} else {
nw += lo[i];
if (nw < 0) nw = 0;
}
}
return cn;
}
void solve () {
cin >> n >> m;
for (int i = 1; i <= n; i ++)
cin >> lo[i];
ll l = 1, r = 1e18;
while (l < r) {
ll mid = (l + r) / 2;
if (check(mid) > m) l = mid + 1;
else if (check(mid) <= m) r = mid;
}
if (check(l) != m) {
cout << -1 << endl;
return ;
}
cout << l << ' ';
r = 1e18;
while (l < r) {
ll mid = (l + r) / 2;
if (check(mid) >= m) l = mid + 1;
else r = mid;
}
cout << l - 1 << endl;
return ;
}