img

牛客挑战赛72

A

核心代码如下:

1
2
3
4
5
6
7
8
vector<int>nums;
for(int i=0;i<T;++i){
cin>>temp;
nums.push_back(temp);
}
for(int i=1;i<T-1;++i){
if(nums[i]<nums[i-1]&&nums[i]<nums[i+1])ans++;
}

B

B题思路就是用优先队列去存储分数和下标,一开始小于6全部入堆,答案扔0

如果等于6了,看分数,分数大就踢人,并且把踢的人的下标扔进答案,不然就不管他,就扔0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<map>

#define x first
#define y second
#define pb push_back
#define PI acos(-1)
#define alli(a) a+1,a+1+n
#define all(a) a.begin(),a.end()

using namespace std;
typedef long long LL;
typedef pair<double,int> PII;
typedef unsigned __int128 ll;
const int N=2e5+5,M=2*N,MOD=1e9+7;

int n,m;
double a[N];
char s[N];
bool vis;
priority_queue<PII,vector<PII>,greater<PII>> q;
int main(){int T=1;
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
vector<int> v;
for(int i=1;i<=n;i++){
if(q.size()<6){
v.pb(0);
q.push({a[i],i});
m++;
}else if(q.top().x<a[i]){
v.pb(q.top().y);
q.pop();
q.push({a[i],i});
m++;
}else v.pb(0);
}
cout<<m<<'\n';
for(auto j:v) cout<<j<<' ';
// cout<< (r!=inf?r:-1)<<'\n';
// cout<< (vis?"YES\n":"NO\n");
}
return 0;
}

C

题意:给定一棵树,带点权。建立一个无向完全图,边 (u,v) 的权值为 lca(u,v) 的权值。求一条哈密顿路径,使边权和最大。输出这个边权和。n≤300。

假设哈密顿路径是有向的,则可以看作每个点对应着一条入边一条出边(除了起点终点)

维护 f[x][i] 表示以 x为根的子树中有 i 个点的出边经过根 x 时子树的答案。

考虑转移,将 x 的一个儿子 y 的答案合并到 x 的答案:

\(f'[x][i+j-k]=\min\{f[x][i]+f[y][j]+k\cdot val[x]\}\)

另外,由于更新前后的 f 不同,所以用 f′ 表示用子树 y 更新后的 f 。 最后用 f[1][1]表示答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define frep(i,a,n) for(int i=a;i>=n;i--)
#define PII pair<int,int>
#define lowbit(x) (x&(-x))
const int mod=1e9+7;
const double pai=acos(-1.0);
#define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0);
#define LF(x) fixed<<setprecision(x)
const int N=1000;
int n,a[N];
int f[N][N];
int siz[N];
int s[N];
#define inf 1e18
vector<int>g[N];
void dfs(int x)
{
siz[x]=1;
rep(i,0,n)
{
f[x][i]=-inf;
}
f[x][1]=0;
for(int y:g[x])
{
dfs(y);
rep(i,0,n)
{
s[i]=-inf;
}
rep(i,0,siz[x])
{
rep(j,0,siz[y])
{
rep(k,0,min(i,j)*2)
{
if(i+j-k)
{
s[i+j-k]=max(s[i+j-k],f[x][i]+f[y][j]+k*a[x]);
}
}
}
}
siz[x]+=siz[y];
rep(i,0,n)
{
f[x][i]=s[i];
}
}
}
signed main()
{
cin>>n;
rep(i,1,n)
{
cin>>a[i];
}
rep(i,2,n)
{
int x;
cin>>x;
g[x].push_back(i);
}
dfs(1);
cout<<f[1][1];
return (0-0);
}

D

主席树,暂时没学,鸽了