首页 > 其他分享 >CSP-S前总复习

CSP-S前总复习

时间:2024-10-20 19:43:31浏览次数:1  
标签:ch const 复习 int maxn 数组 CSP getchar

里面大概有一两个星期吧,挑一些有价值的写。

[ABC369F] Gather Coins

来补的题目。

先考虑不输出方案的写法。排序过后可以用一个 DP 实现。

注意到 DP 的转移方程只和 max 有关,所以可以用数据结构优化。

排序过后保证横坐标不降,所以只需要对纵坐标开一个树状数组,维护最大值,能做到 \(\mathcal{O}(k\log n)\) 的转移。

现在要求输出方案,我们可以记录每一个 DP 数组中的元素从哪里转移过来,最后倒序查找输出。

这样的话我们同事需要对树状数组多维护点东西。除了基本的记录 max 数组,我们再开一个记录编号的数组,记录树状数组中每一个值对应的编号。

这样转移的时候更新最大值时可以同时更新编号数组,实现维护。

点击查看代码
#include <bits/stdc++.h>
// #define int long long
using namespace std;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int maxn=5e5+10;
const int mod=998244353;
const int inf=1e9+7;	
int n,m,k;
struct no
{
	int x,y;
}a[maxn];
int dp[maxn],pre[maxn];
int c[maxn<<1],d[maxn<<1];
int lb(int x){return x&-x;}
void add(int x,int y,int id){for(;x<=maxn;x+=lb(x)){if(c[x]<y)c[x]=y,d[x]=id;}}
no ask(int x){int ans=0,id=0;for(;x;x-=lb(x)){if(c[x]>ans){ans=c[x];id=d[x];}}return {ans,id};}
vector<char> v;
void work(no s,no t)
{
	for(int i=1;i<=abs(s.x-t.x);i++)v.push_back('D');
	for(int i=1;i<=abs(s.y-t.y);i++)v.push_back('R');
}
signed main()
{
#ifdef Lydic
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
//  #else
//   	freopen("Stone.in","r",stdin);
//   	freopen("Stone.out","w",stdout);
#endif
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)a[i]={read(),read()};
	sort(a+1,a+k+1,[](no x,no y){return x.x<y.x||x.x==y.x&&x.y<y.y;});
	for(int i=1;i<=k;i++)dp[i]=1;
	add(a[1].y,1,1);
	for(int i=2;i<=k;i++)
	{
		no now=ask(a[i].y);
		dp[i]=now.x+1;
		pre[i]=now.y;
		add(a[i].y,dp[i],i);
		// cout<<i<<' '<<pre[i]<<endl;
	}
	int ans=0,id=0;
	for(int i=1;i<=k;i++)
	{
		if(dp[i]>ans)
		{
			ans=dp[i];
            id=i;
		}
	}
	cout<<ans<<endl;
	// cout<<id<<endl;
	// cout<<a[id].x<<' '<<a[id].y<<endl;
	work(no{n,m},a[id]);
	// for(auto i : v)cout<<i;puts("");
	while(1)
	{
		if(!pre[id]){work(no{1,1},a[id]);break;}
		work(a[id],a[pre[id]]);
		id=pre[id];
	}
	reverse(v.begin(),v.end());
	for(auto i : v)cout<<i;puts("");
	return 0;
}

标签:ch,const,复习,int,maxn,数组,CSP,getchar
From: https://www.cnblogs.com/Lydic/p/18487719

相关文章

  • Linux学习笔记(复习版day008)
    1.僵尸进程僵尸进程(ZombieProcess)是指那些已经终止(即完成执行)的进程,但其父进程尚未读取其退出状态信息的进程。简单来说,僵尸进程的生命周期已经结束,但它的进程描述符仍然存在于系统中,以便父进程能够获取其退出状态。处理:1.top命令查询是否有僵尸进程,此处1zombie表示有一个......
  • CSP 模拟 51
    A排列最小生成树(pmst)首先想到\(n^2\)建边的做法,然后最小生成树的所有边权都小于\(n\),直接从头到尾连都能轻松满足这个。所以很多边是无用的,只要找边权小于\(n\)的边即可。所以对于位置差和权值差在\(\sqrtn\)以下的都找一遍即可,然后桶排跑MST即可。赛时根号都写脸......
  • 『模拟赛』信友队2024CSP-S第二轮(复赛)模拟赛
    Rank意外地好A.坦白签。首先对\(m=0\)很好求,正着跑一遍就行。接着考虑\(m\lt0\)时什么时候遗忘会更优。发现是\(\oplus\)操作,因此答案为偶时(即事件为奇时)遗忘会使答案+1。为判断是否比原先优,我们提前处理出后缀和即可。这题关键在想出一个性质,\(m=i\)是由\(m=i-......
  • 横扫CSS - HTML知识复习
    HTML常见元素<metaname="viewport">视口,默认像素980px。适配移动端。HTML版本对比HTML元素分类按默认样式分:块级block(div、p)、行内/内联inline(span)、inline-block(select)按内容分:*4.嵌套关系块级元素可以包含行内元素块级元素不一定能包含块级元素行内元素......
  • csp2024 游记
    前言今年赛前这段时间或许算得上是我OI生涯中最摆的一段时间了。每天到机房无非就是胡乱的看一些题,趴在桌子上,或者是写whk作业。当然这可能也和最近的状态有关。或许我也只有在刚开始的那几天的在线的,其它时候基本上啥都没干。本来今年是不太想停课的,可最终因为种种原因还是......
  • [全国/全省/全市]初赛知识点复习大汇总
    目录计算机结构与组成原理计算机发展及应用1、第一台电子计算机的诞生:ENIAC2、第一台具有存储程序功能的计算机:EDVAC。图灵计算机发展阶段世界上最快的超级计算机计算机应用计算机保护知识产权计算机病毒硬件系统的组成概述CPU中央处理器存储器概述存储容量......
  • 码城|挑战中,Java面试题复习第3天,坚持就是胜利【悟空非空也】
     ......
  • 信友队2024CSP-S第二轮(复赛)模拟赛
    2024CSP-S第二轮(复赛)模拟赛\(T1\)A.坦白\(30pts\)部分分\(30pts\):爆搜。点击查看代码llans[300010];chars[300010];intmain(){freopen("confess.in","r",stdin);freopen("confess.out","w",stdout);llt,n,cn......
  • csp-s 模拟 12
    csp-s模拟12T小h的几何whk我能说什么呢...T小w的代数仙人掌,DP,计数题本题部分分较有启发意义考虑是一棵树怎么做注意到\(n\)比较小,直接想想比较暴力的做法,可以用\(O(n^2)\)的复杂度枚举起点和终点,而由于是一棵树,两点之间的路径是唯一的,并且本题要求点集不重,......
  • 【信奥赛·C++基础语法】CSP-J C++ STL 标准模板库 - 算法
    序言标准模板库(STL)的算法部分提供了一系列强大的工具,用于对各种容器中的数据进行操作。这些算法可以大大提高编程效率,减少代码重复,使程序更加简洁、高效和可读。无论是处理简单的数据结构还是复杂的大规模数据,STL算法都能发挥重要作用。一、STL算法的分类排序算法快速......