首页 > 其他分享 >2023CSP-S 复赛模测(日记和×××) - 模拟赛记录

2023CSP-S 复赛模测(日记和×××) - 模拟赛记录

时间:2024-11-01 17:09:28浏览次数:1  
标签:2023CSP string idx int 模测 length indeg 短路 复赛

Preface

这套题说实话挺水的,它的水不仅仅是在数据上(实际得分比期望得分高了 \(50+\) 分),而且正解也神奇得不像个正解(全是各种分类讨论卡子任务的,感觉像是出题人水平不够一样)。

日记和最短路(shortway

(话说最短路的英语不应该是 shortest path 吗?)

题目中给了一个 DAG,然后要求用两种方式跑最短路。

看到 DAG,又要求最短路,第一时间想到先拓扑排序再做 DP,似乎只需要 \(O(N+M)\) 的时间复杂度。

然而这里有一个大问题:因为边权是一个字符串,而在组成最短路和比较路径大小的时候最坏时间复杂度是 \(O(\sum \lvert w_i \rvert)\),所以按照以上方法的实际时间复杂度应当是 \(O(N+M\sum \lvert w_i \rvert)\),虽然不可能卡得满,但是硬要算的话,期望得分应当只有 \(16\) 分才对。

然而,用这样的方法可以卡到 \(96\) 分,可见数据几乎完全没有卡字符串比较和合并的时间复杂度。

正解似乎是要拆点什么的,但是我不会,所以就只放上面说的 \(96\) 分代码了:

#include<queue>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;

const int N=1e5+5,M=5e5+5;
int n,m;

struct Allan{
	int to,nxt;
	string val;
}edge[M];
int head[N],idx;
inline void add(int x,int y,string &z)
{
	edge[++idx]={y,head[x],z};
	head[x]=idx;
	return;
}

int indeg[N];
queue<int> q;
int top_order[N],top_idx;
void TopSort(int src)
{
	q.push(src);
	indeg[src]--;
	while(!q.empty())
	{
		int x=q.front(); q.pop();
		top_order[++top_idx]=x;
		for(int i=head[x];i;i=edge[i].nxt)
		{
			int y=edge[i].to;
			indeg[y]--;
			if(!indeg[y])
				q.push(y);
		}
	}
	return;
}

string sp1[N];
bool cmp1(const string &x,const string &y,const string &z)
{
	if(z=="-") return true;
	else if(x.length()+y.length()!=z.length())
		return x.length()+y.length()<z.length();
	else return x+y<z;
}
void Solve1()
{
	for(int p=1;p<=top_idx;p++)
	{
		int x=top_order[p];
		for(int i=head[x];i;i=edge[i].nxt)
		{
			int y=edge[i].to; string z=edge[i].val;
			if(cmp1(sp1[x],z,sp1[y])) //sp[x]+z<sp[y]
				sp1[y]=sp1[x]+z;
		}
		if(x!=n) sp1[x].clear();
	}
	return;
}

string sp2[N];
bool cmp2(const string &x,const string &y,const string &z)
{
	if(z=="-") return true;
	else return x+y<z;
}
void Solve2()
{
	for(int p=1;p<=top_idx;p++)
	{
		int x=top_order[p];
		for(int i=head[x];i;i=edge[i].nxt)
		{
			int y=edge[i].to; string z=edge[i].val;
			if(cmp2(sp2[x],z,sp2[y])) //sp[x]+z<sp[y]
				sp2[y]=sp2[x]+z;
		}
		if(x!=n) sp2[x].clear();
	}
	return;
}

int main()
{
	freopen("shortway.in","r",stdin);
	freopen("shortway.out","w",stdout);
	
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	
	cin>>n>>m;	
	for(int i=1;i<=m;i++)
	{
		int x,y; string z;
		cin>>x>>y>>z;
		add(x,y,z);
		indeg[y]++;
	}
	
	TopSort(1);
	for(int i=1;i<=n;i++)
		sp1[i]=sp2[i]="-";
	sp1[1]=sp2[1]="";
	Solve1();
	Solve2();
	cout<<sp1[n]<<' '<<sp2[n]<<endl;
	
	return 0;
}

标签:2023CSP,string,idx,int,模测,length,indeg,短路,复赛
From: https://www.cnblogs.com/jerrycyx/p/18520827

相关文章

  • CSP-S 2024 复赛游记
    Day-2空白的一天。huge不想太多天连着打模拟赛,并且想在明天安排一场,所以安排了专题。今天是dp专题。听了丁真的去做AT的dp专题了,很晚才看Vjudge。效率有点低啊,这状态怎么打复赛(。Day-1全真模拟,换了座位。模拟赛有关。挂了40pts,不挂Rank1了,不过问题不大,考前挂......
  • CSP-J 2024 复赛题解
    T1数据仅有52,极小的数据范围导致这题只有一个问题:如何简短方便的去重并统计。我选择了map做法:每个输入查找map中之前是否记录过此元素,如果记录过则证明已经拥有这张牌,反之则记录并将统计数增加。代码如下:#include<bits/stdc++.h>usingnamespacestd;intn;map<stri......
  • [游记] [CSP-S 2024 复赛] 于是回家开始上物理课
    2024.10.26(Day1)记Day0上午打[cdqz大团队](?)的模板大赛,被薄纱。手速慢,还有几发没AC。下午写了个线段树2的板子,打算写CRT板子,发现不会exgcd求逆元,于是去重学exgcd,写了一点博客。晚上颓了一会儿,查了下C++的/和%,关于C++%到底是怎样的还是没搞清楚,决定先不管,......
  • 信息学奥赛复赛复习20-CSP-S2019-01格雷码-数据类型范围、unsigned 关键字、无符号范
    PDF文档回复:202410231P5657[CSP-S2019]格雷码[题目描述]通常,人们习惯将所有n位二进制串按照字典序排列,例如所有2位二进制串按字典序从小到大排列为:00,01,10,11。格雷码(GrayCode)是一种特殊的nn位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地......
  • 信息学奥赛复赛复习20-CSP-S2019-01格雷码-数据类型范围、unsigned 关键字、无符号范
    PDF文档公众号回复关键字:202410231P5657[CSP-S2019]格雷码[题目描述]通常,人们习惯将所有n位二进制串按照字典序排列,例如所有2位二进制串按字典序从小到大排列为:00,01,10,11。格雷码(GrayCode)是一种特殊的nn位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同......
  • 准备CSP 复赛
    用来方便自己复习版本C++14目录快读和快输注意事项缺省源快读和快输链接:浅谈C++IO优化——读优输优方法集锦最全快读、快写模板「持续更新」-凌云_void-博客园读入、输出优化-OIWiki打的时候一定要注意运算符优先级QWQ(有时候真的很难发现)错误示例:int......
  • 2024 信友队 CSP-J 第二轮(复赛)模拟赛
    A火柴#include<cstdio>intcnt[10]={0,1,2,3,3,2,3,4,5,3};charnum[10][10]={"","I","II","III","IV","V","VI","VII","VIII","IX"};......
  • 信息学奥赛复赛复习18-CSP-J2023-01小苹果-向上取整、向下取整、模拟算法
    PDF文档公众号回复关键字:202410211P9748[CSP-J2023]小苹果[题目描述]小Y的桌子上放着n个苹果从左到右排成一列,编号为从1到n。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第1个苹果开始、每隔2个苹果拿走1个苹果。随......
  • 『模拟赛』信友队2024CSP-S第二轮(复赛)模拟赛
    Rank意外地好A.坦白签。首先对\(m=0\)很好求,正着跑一遍就行。接着考虑\(m\lt0\)时什么时候遗忘会更优。发现是\(\oplus\)操作,因此答案为偶时(即事件为奇时)遗忘会使答案+1。为判断是否比原先优,我们提前处理出后缀和即可。这题关键在想出一个性质,\(m=i\)是由\(m=i-......
  • 信友队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......