首页 > 其他分享 >题解(开始学知识点

题解(开始学知识点

时间:2023-04-27 21:36:21浏览次数:55  
标签:知识点 MIN int 开始 dfs MAXN 题解 now dis

D. Frog Traveler 1900 dp gq!

https://codeforces.com/contest/1602/problem/D
题解:我们可以通过类似bfs的过程找到每个点的能到达的所需步数最小的点,完成更新,但每个点能被哪些点到达很难判断,故我们反过来考虑,如果我们能得到从n->0的最短跳跃次数,亦得解,而每个点下一步能到达的点容易求解,且为连续的一段序列,故我们可以从底部向上迭代,每次更新只会更新上次更新到的数的上界之上的位置(显然),故我们只会更新每个点1次,复杂度为O(n)。
代码拿了佬的):

#include <bits/stdc++.h>
#define TT template<typename T>
using namespace std;
 
typedef long long LL;
const int MAXN = 300005;
const int INF = 0x3f3f3f3f;
int n;
int a[MAXN],b[MAXN],dis[MAXN],pre[MAXN],to[MAXN],ans[MAXN],anstot;
 
LL Read()
{
	LL x = 0,f = 1; char c = getchar();
	while(c > '9' || c < '0'){if(c == '-') f = -1;c = getchar();}
	while(c >= '0' && c <= '9'){x = (x*10) + (c^48);c = getchar();}
	return x * f;
}
TT void Put1(T x)
{
	if(x > 9) Put1(x/10);
	putchar(x%10^48);
}
TT void Put(T x,char c = -1)
{
	if(x < 0) putchar('-'),x = -x;
	Put1(x); if(c >= 0) putchar(c);
}
TT T Max(T x,T y){return x > y ? x : y;}
TT T Min(T x,T y){return x < y ? x : y;}
TT T Abs(T x){return x < 0 ? -x : x;}
 
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read();
	for(int i = 1;i <= n;++ i) a[i] = Read();
	for(int i = 1;i <= n;++ i) b[i] = Read(); 
	for(int i = 0;i <= n;++ i) dis[i] = INF;
	queue<int> q; q.push(n);
	int MIN = n+1; dis[n] = 0;
	while(!q.empty() && MIN > 0)
	{
		int x = q.front(); q.pop();
		for(int i = x-a[x];i < MIN;++ i)
			if(dis[x]+1 < dis[i+b[i]]) 
				dis[i+b[i]] = dis[x]+1,q.push(i+b[i]),pre[i+b[i]] = i,to[i+b[i]] = x;//pre是滑了之前的,to是从哪里来的 
		MIN = Min(MIN,x-a[x]);
	}
	if(dis[0] == INF) Put(-1,'\n');
	else 
	{
		Put(dis[0],'\n');
		int now = 0;
		while(now != n) ans[++anstot] = pre[now],now = to[now];
		for(int i = anstot;i >= 1;-- i) Put(ans[i],' ');
	}
	return 0;
}

树上背包3 gq!

http://oj.daimayuan.top/course/8/problem/271
题解:我们可以发觉问题的本质是选一些数但要求若儿子选了则父亲必须选取,这种子树关系可以联想到dfs序,我们将树变为dfs序,从后往前进行线性dp,转移决策为选当前节点或者跳过当前子树,即f[i][j]=max(f[i+1][j-w[k]]+a[k],f[i][j]),即可O(nm)完成转移。

#include<bits/stdc++.h>
//#define int long long
#define pb push_back
using namespace std;
const int N=1e3+10;
int a[N],l[N],r[N],w[N],id[N],f[N][10005];
vector<int> g[N];
int tot;
void dfs(int x){
	l[x]=++tot;
	id[tot]=x;
	for(auto it:g[x]){
		dfs(it);
	}
	r[x]=tot+1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
	int n,q,m;cin>>n>>m;
	for(int i=2;i<=n;i++){
		int x;cin>>x;
		g[x].pb(i);
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++) cin>>w[i];
	dfs(1);
	for(int i=1;i<=m;i++){
		f[n+1][i]=-1e9;
	}
	for(int i=n;i>=1;i--){
		for(int j=0;j<=m;j++){
			int k=id[i],e=id[i+1];
			f[i][j]=f[r[k]][j];
			if(j>=w[k])
			f[i][j]=max(f[i+1][j-w[k]]+a[k],f[i][j]);
		}
	}
	for(int i=0;i<=m;i++){
		if(f[1][i]>=0)
		cout<<f[1][i]<<endl;
		else cout<<0<<endl;
	}
}

标签:知识点,MIN,int,开始,dfs,MAXN,题解,now,dis
From: https://www.cnblogs.com/wjhqwq/p/17360256.html

相关文章

  • P1345 [USACO5.4]奶牛的电信Telecowmunication 题解
    一、题目描述:n个点,m条边,给定起点s和终点t,求最少删去几个点后,s和t不连通。注意,s和t不能删掉。1<=n<=100,1<=m<=600; 二、解题思路:刚刚学了最大费用流,知道最大流等于最小割。但此题割的不是边,是点。我们需要将将割点转化为割边。把一个点切成两半......
  • 【题解】P3185 [HNOI2007]分裂游戏
    P3185[HNOI2007]分裂游戏题目描述聪聪和睿睿最近迷上了一款叫做分裂的游戏。该游戏的规则是:共有\(n\)个瓶子,标号为\(0,1,\ldots,n-1\),第\(i\)个瓶子中装有\(p_i\)颗巧克力豆,两个人轮流取豆子,每一轮每人选择\(3\)个瓶子,标号为\(i,j,k\),并要保证\(i\ltj,j......
  • 【题解】P4363 [九省联考 2018] 一双木棋 chess
    原题链接题目描述菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋......
  • qt知识点总结
    Qt对象模型是Qt框架的核心之一,以下是一些Qt对象模型的知识点:继承:Qt对象模型采用了单一继承机制,即每个类只能从一个基类继承,这有助于避免多重继承带来的复杂性和不可预见的问题。多态性:Qt对象模型支持多态性,子类对象可以被视为其父类的对象,并使用相同的接口进行访问和操作......
  • qt知识点总结(二)
    Qt提供了丰富的容器类,以下是一些Qt容器类的知识点:QList:QList是Qt最基本的容器类之一,实现了一个可变大小的数组。可以插入、删除、移动和访问数组中的元素,支持随机访问和顺序访问。同时也提供了很多有用的成员函数,例如indexOf()、lastIndexOf()、sort()等。QVector:QVecto......
  • word从特定位置开始设定页码
    1、首先分隔符设置:光标放到要页码设置的第一页的开头,然后:布局------分隔符------分节符------下一页2、双击设置页码第一页的页脚,取消导航栏里的链接到上一页3、点击页码------设置页码格式(你需要的格式)------页码底端(选一个你需要的)OK搞定!如果分隔符出现了空白页的话就检查一......
  • BUAACTF2023 Writeup题解 by Joooook
    BUAACTF2023WriteupbyJoooook目录MiscWhichElementchatgptzhuzhuzhuzhu'srevengeScreenshotcarzymazeMCCryptoBlockCipherMathKeyExchangeWebmotaReverseoneQuiz'srevenge*SnakeMinesweepobfu可以从队名猜一下博主是哪里人(nooffline......
  • 从零开始基于Archlinux 安装 containerd + k8s
    下载ISO文件:https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/目录1.准备工作2.磁盘管理2.1磁盘分区2.2磁盘格式化2.3磁盘挂载3.安装系统3.1安装系统文件3.2配置fstab3.3配置系统3.4安装引导程序3.5安装OpenSSH3.6主机名3.7设置root密码3.8网络配置3.......
  • 【题解】XX Open Cup, GP of Moscow
    //createdon23.03.26目录A.AliceandBobB.BracketsC.CirclesD.DejaVuE.EasiestSumF.FunnySalesmanG.GraphColoringH.HiddenGraphI.InsectsJ.JoiningPointsA.AliceandBob对于链上的情况,异色点是一定不会选择走进同色段的(长度不小于\(2\)),因为一定不优。......
  • springboot入门时,发现Java版本与Spring boot版本无法对应导致错误的问题解决
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/......