蒙青创五一集训模拟考入门组

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