地球发动机(earth)
【题目描述】
“啊,地球,我的流浪地球……”
——《流浪地球》
在一条直线上,从左到右排列着n台地球发动机,每台发动机有着固定的位置坐标Ai和功率Pi,保证Ai<Ai+1。此外,由于地球发动机的特性,每台发动机还有一个参数Xi,如果一台发动机运行,则坐标范围在[Ai,Ai+Xi]的其它发动机就无法运行。现在你想让正在运行的发动机总功率最大,请输出这个总功率。
【输入数据】
第一行一个整数n,意义如上所述。
接下来n行,每行三个整数Ai,Pi,Xi,意义如题面所述。
【输出数据】
一行一个整数,表示可能的最大功率。
【样例输入】
4
2 5 1
5 4 3
8 10 3
9 2 2
【样例输出】
15
【数据范围】
对于20%的数据,n≤10,0<Ai,Pi,Xi≤10;
对于50%的数据,n≤2000,0<Ai,Pi,Xi≤105;
对于100%的数据,n≤105,0<Ai,Pi,Xi≤109。
图(graph)
【题目描述】
小H有一张n个点,m条边的无向连通图,他想从图中选出一些边,保证通过这些边a和b连通,c和d连通,同时选出的边数尽量少。
【输入数据】
第一行两个整数n,m,表示图中的边数和点数。
第二行四个整数a,b,c,d,意义如题面所述。
接下来m行,每行两个整数a,b,表示点a和点b间有一条边。
【输出数据】
一行一个整数,表示最少需要选出的边数。
【样例输入】
5 8
3 4 1 3
2 1
3 2
4 3
5 3
4 2
1 4
5 4
2 1
【样例输出】
2
【数据范围】
对于所有数据,保证1≤a,b,c,d≤n;
对于10%的数据,0<n,m≤20;
对于30%的数据,0<n,m≤300;
对于60%的数据,0<n≤300;
对于100%的数据,0<n,m≤3000。
树(tree)
【题目描述】
小H有一棵n个节点的树T,每个节点上有一个非负整数Ai,他想知道所有距离不超过k的点对 ( x , y ) (x<y)上数的亦或值的和。
【输入数据】
第一行两个正整数n,k,表示树上的节点数和给定的距离k。
第二行n个非负整数,第i个数表示第i个节点上的数是Ai。
接下来n-1行,每行两个正整数u,v,表示节点u和节点v之间有一条边。保证输入是一棵树。
【输出数据】
一行一个整数,表示所有距离不超过k的点对上数的亦或值的和。
【样例输入】
6 3
7 4 4 3 2 0
2 1
6 2
5 6
3 5
4 1
【样例输出】
51
T1
题意概括:每个元素包含坐标xxx,地盘yyy,收益ppp,[x,x+y][x,x+y][x,x+y]只能由一种元素收益
首先DP方程
f[i][1]f[i][1]f[i][1]表示iii选
f[i][0]f[i][0]f[i][0]表示iii不选
f[i][1]f[i][1]f[i][1]要从所有a[j].x+y>a[i].x的f[j][0]a[j].x+y>a[i].x的f[j][0]a[j].x+y>a[i].x的f[j][0]过继过来
f[i][0]f[i][0]f[i][0]要从之前所有的最大值过继过来
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int pos,id;
long long data;
node(int x,long long y):pos(x),data(y){
}
node(){
}
bool operator <(node x) const
{
return pos>x.pos;
}
};
int n,a[100005],x[100005],h,t;
long long f[100005][2],ans,p[100005];
node q[100005];
priority_queue<node> o;
int main()
{
cin>>n;
for (int i=1;i<=n;i++) scanf("%d %lld %d",&a[i],&p[i],&x[i]);
long long y=0;
h=1;
for (int i=1;i<=n;i++)
{
while (h<=t)
{
if (a[i]>q[h].pos)
{
y=max(y,q[h].data+p[q[h].id]);
h++;
}
else break;
}
while (!o.empty())
{
if (a[i]>o.top