蒙青创五一集训模拟考入门组
Done
OI
Start at: 2025-5-2 8:30
3.5
hour(s)
Host:
41
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n, mp[N];
struct node {
int pre, nxt, a, b, c, id;
} p[N];
bool cmp(node a, node b) {
return a.c > b.c;
}
signed main() {
freopen("muladd.in","r",stdin);
freopen("muladd.out","w",stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i].a;
p[i].id = i;
}
for (int i = 1; i < n; i++) {
cin >> p[i].b;
}
for (int i = 1; i < n; i++) {
cin >> p[i].c;
}
sort(p + 1, p + n, cmp);
for (int i = 1; i <= n; i++) {
mp[p[i].id] = i;
}
for (int i = 1; i < n; i++) {
p[i].pre = mp[p[i].id - 1];
p[i].nxt = mp[p[i].id + 1];
}
for (int i = 1; i < n; i++) {
p[p[i].nxt].a = (p[i].a + p[i].b) * p[p[i].nxt].a;
p[p[i].pre].nxt = p[i].nxt;
p[p[i].nxt].pre = p[i].pre;
}
cout << p[n].a << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int T;
double A, B, C, a, b, c;
int main() {
freopen("geometry.in","r",stdin);
freopen("geometry.out","w",stdout);
cin >> T;
while (T--) {
//1.B==0
cin >> a >> b >> c >> A >> B >> C;
//Ax +C = 0
if (B == 0) {
double x = -C / A;
double y = a * x * x + b * x + c;
printf("%.6lf (%.6lf,%.6lf)\n", 0.00, x, y);
continue;
} else {
//Ax+By+C=0 y=-(A/B)x-C/B
//ax^2+bx+c=-(A/B)x-C/B
//ax^2+(b+A/B)x+c+(C/B) = 0
double aa = a, bb = b + A / B, cc = c + C / B;
double delta = bb * bb - 4 * aa * cc;
if (abs(delta) < 1e-9) {
double x = (-bb) / (2 * aa);
double y = a * x * x + b * y + c;
printf("%.6lf (%.6lf,%.6lf)\n", 0.00, x, y);
continue;
} else if (delta > 0) {
double x1 = (-bb + sqrt(delta)) / (2 * aa);
double x2 = (-bb - sqrt(delta)) / (2 * aa);
if (x1 < x2)
swap(x1, x2);
double y1 = a * x1 * x1 + b * x1 + c;
double y2 = a * x2 * x2 + b * x2 + c;
printf("%.6lf (%.6lf,%.6lf) (%.6lf,%.6lf)\n", 0.00, x1, y1, x2, y2);
continue;
} else if (delta < 0) {
/*
* 取二次函数上一点(x0,a*x0*x0+b*x0+c)
* Ax+by+C=0
* 带入点到直线距离公式D = abs(Ax0+B*(a*x0*x0+b*x0+c)+C)/sqrt(A*A+B*B)
* 求Ax+B*(a*x*x+b*x+c)+C的最小值
* Ax+B*a*x^2+B*b*x+B*c+C
* B*a*x^2+(A+B*b)x+B*c+C的最小值
* x = (A+B*b)/(-2*B*a)
*/
double x = (A + B * b) / (-2 * B * a);
double y = a * x * x + b * x + c;
double d = abs(A * x + B * y + C) / sqrt(A * A + B * B);
printf("%.6lf (%.6lf,%.6lf)\n", d, x, y);
continue;
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5005;
struct node {
int a, b, c;
} p[N];
int n, f[N][N], A, B, C; //f[i][j]前i件商品,买了j件c的最小花费
//if(i-j<=A)f[i][j] = f[i-1][j]+p[i].a
//f[i][j] = f[i-1][j]+p[i].b
//f[i][j] = f[i-1][j-1]+p[i].c
bool cmp(node a, node b) {
return a.a - a.b < b.a - b.b;
}
signed main() {
freopen("furniture.in","r",stdin);
freopen("furniture.out","w",stdout);
cin >> n >> A >> B >> C;
for (int i = 1; i <= n; i++) {
cin >> p[i].a >> p[i].b >> p[i].c;
}
sort(p + 1, p + n + 1, cmp);
memset(f, 0x3f, sizeof(f));
f[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= C; j++) {
if (i - j <= A)
f[i][j] = f[i - 1][j] + p[i].a;
else
f[i][j] = f[i - 1][j] + p[i].b;
if (j > 0)
f[i][j] = min(f[i][j], f[i - 1][j - 1] + p[i].c);
}
}
cout << f[n][C] << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
struct node {
int v, w;
};
int n, m, k, q;
vector<node>e[2][N];
int a[N], dis[2][N], book[N];
int tree[N << 2];
void pushup(int rt) {
tree[rt] = min(tree[rt << 1], tree[rt << 1 | 1]);
}
void build(int l, int r, int rt) {
if (l == r) {
if (dis[0][l] > 1e18 || dis[1][l] > 1e18)
tree[rt] = 1e18;
else
tree[rt] = dis[0][l] + dis[1][l] * a[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
pushup(rt);
}
void update(int l, int r, int rt, int p) {
if (l == r) {
if (dis[0][l] > 1e18 || dis[1][l] > 1e18)
tree[rt] = 1e18;
else
tree[rt] = dis[0][l] + dis[1][l] * a[l];
return;
}
int mid = (l + r) >> 1;
if (p <= mid)
update(l, mid, rt << 1, p);
else
update(mid + 1, r, rt << 1 | 1, p);
pushup(rt);
}
int query(int l, int r, int rt, int L, int R) {
if (L <= l && r <= R) {
return tree[rt];
}
int mid = (l + r) >> 1;
int sum = 1e18;
if (L <= mid)
sum = min(sum, query(l, mid, rt << 1, L, R));
if (R > mid)
sum = min(sum, query(mid + 1, r, rt << 1 | 1, L, R));
return sum;
}
void dijkstra(int s, int id) {
memset(book, 0, sizeof(book));
memset(dis[id], 0x3f, sizeof(dis[id]));
dis[id][s] = 0;
priority_queue<pair<int, int> >q;
q.push({0, s});
while (!q.empty()) {
int tmp = q.top().second;
q.pop();
if (book[tmp])
continue;
book[tmp] = 1;
for (int i = 0; i < e[id][tmp].size(); i++) {
int v = e[id][tmp][i].v;
int w = e[id][tmp][i].w;
if (dis[id][v] > dis[id][tmp] + w) {
dis[id][v] = dis[id][tmp] + w;
q.push({-dis[id][v], v});
}
}
}
}
signed main() {
/*
1出发,坐火车的最小费用
a dis1[a]+dis2[a]*cost[a]
n出发,开车的最少天数
*/
freopen("play.in", "r", stdin);
freopen("play.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k >> q;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= m; i++) {
int x, y, z;
cin >> x >> y >> z;
e[0][x].push_back({y, z});
e[0][y].push_back({x, z});
}
for (int i = 1; i <= k; i++) {
int x, y, z;
cin >> x >> y >> z;
e[1][x].push_back({y, z});
e[1][y].push_back({x, z});
}
dijkstra(1, 0);
dijkstra(n, 1);
build(1, n, 1);
for (int i = 1; i <= q; i++) {
int x, y;
cin >> x >> y;
a[x] = y;
update(1, n, 1, x);
cout << query(1, n, 1, 1, n) << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int n,m,tree[N<<2],a[N];
void pushup(int rt)
{
tree[rt] = tree[rt*2] + tree[rt*2+1];
}
void build(int l,int r,int rt)
{
if(l==r){
tree[rt] = a[l];
return;
}
int mid = (l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update(int l,int r,int rt,int p,int c)
{
if(l==r){
tree[rt]+=c;
return;
}
int mid = (l+r)>>1;
if(p<=mid)update(l,mid,rt<<1,p,c);
else update(mid+1,r,rt<<1|1,p,c);
pushup(rt);
}
int query(int l,int r,int rt,int L,int R)
{
//L--l--r--R
if(L<=l && r<=R){
return tree[rt];
}
int mid = (l+r)>>1;
int sum = 0;
if(L<=mid)sum+=query(l,mid,rt<<1,L,R);
if(R>mid)sum+=query(mid+1,r,rt<<1|1,L,R);
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
int pos,x,y;
cin>>pos>>x>>y;
if(pos==1){
update(1,n,1,x,y);
}
else cout<<query(1,n,1,x,y)<<"\n";
}
return 0;
}
- Status
- Done
- Rule
- OI
- Problem
- 4
- Start at
- 2025-5-2 8:30
- End at
- 2025-5-2 12:00
- Duration
- 3.5 hour(s)
- Host
- Partic.
- 41