首页 > 其他分享 >Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)

Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)

时间:2024-07-14 09:12:09浏览次数:9  
标签:AtCoder ch puts Beginner Contest int ll long define

这场比赛还是比较水的
A,B,C跳过
D题dij把点权和边权都转换为边权即可
E题DP
可以用\(map\)存一下等差数列的差
先说\(O(n^4)\),\(f_{len,i,j,t}\)分别表示长度,现在在\(i\),上一个在\(j\)
显然动态转移方程就有了\(f_{len,i,j,k}=\sum_{k=1}^{k=j-1} f_{len-1,j,k,t}\)

点击查看代码
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define lid (rt<<1)
#define rid (rt<<1|1)
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define int long long
using namespace std;
const int N = 85,mod=998244353;
ll n,m,a[N],ans[N];
map <ll,ll> f[N][N][N];
main()
{
	speed();
	cin>>n;
	ll mi=1e9,mx=0;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];mi=min(mi,a[i]);
		mx=max(mx,a[i]);
	}
	for(int i=1;i<=n;i++)
	{
//		f[1][i][i][0]=1;
		for(int j=1;j<=i-1;j++)
		{
			f[2][i][j][(ll)(a[i]-a[j])]=1;
		}
	}
	for(int le=3;le<=n;le++)
	{
//		ll ans=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=i-1;j++)
			{
				ll t=a[i]-a[j];
					for(int k=1;k<=j-1;k++)
						if(a[j]-a[k]==t)
							f[le][i][j][t]=(f[le-1][j][k][t]+f[le][i][j][t])%mod;
				ans[le]=(ans[le]+f[le][i][j][t])%mod;
	//			cout<<le<<" "<<f[le][i][j][t]<<endl;
				
			}				
		}	
//		cout<<le<<" "<<ans<<endl;	
	}

	for(int k=1;k<=n;k++)
	{
		if(k==1)cout<<n<<" ";
		else if(k==2)cout<<1ll*n*(n-1)/2<<" ";
		else
		{
//			ll ans=0;
//			for(int i=mi;i<=mx;i++)

			cout<<ans[k]<<" ";
		}
	}
	return 0;
}

然后就水过了,其实我们还可以压缩提下状态,\(map\)结构体
把前三维全部压成一维,代码如下(借的\(qinyun\)对的)

点击查看代码
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
#define CLOSE() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define GG puts("============================")
#define Ct(x); if(x)puts("Yes");else puts("No");
#define CT(x); if(x)puts("YES");else puts("NO");
#define ct(x); if(x)puts("yes");else puts("no");
#define pii pair<int,int>
#define fi first
#define se second
#define re register
#define int ll
#define pt(x) putchar(x)
#define M(x,y) memset(x,y,sizeof x)

inline ll read()
{
	re ll ans=0;bool f=0;re char ch=getchar();
	for(;!isdigit(ch);ch=getchar())if(ch=='-')f=1;
	for(;isdigit(ch);ch=getchar())ans=(ans<<1)+(ans<<3)+(ch^48);
	return f?~ans+1:ans;
}

void print(ll n)
{
	if(n<0)putchar('-'),n=-n;
	if(n>9)print(n/10);
	putchar(n%10+48);
}

void _print(ll n)
{
	print(n);
	pt(' ');
}

void __print(ll n)
{
	print(n);
	pt('\n');
}

struct node
{
	int i,d,len;
	bool operator < (const node a) const
	{
		if(i!=a.i)return i<a.i;
		if(d!=a.d)return d<a.d;
		return len<a.len;
	}
	
	
};

const int mod=998244353;
map<node,int>mp;
int a[100],t[100],ans[100];

signed main()
{
	int n=read();
	for(int i=1;i<=n;++i)
		a[i]=read();
	
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<i;++j)
			for(int l=1;l<=n;++l)
			{
				if(l==1)++mp[(node){i,a[i]-a[j],l}],t[l+1]=(t[l+1]+1)%mod;
				else mp[(node){i,a[i]-a[j],l}]=(mp[(node){i,a[i]-a[j],l}]+mp[node{j,a[i]-a[j],l-1}])%mod,t[l+1]=(t[l+1]+mp[node{j,a[i]-a[j],l-1}])%mod;
//				if(l==2)cout<<i<<' '<<j<<' '<<t[3]<<" "<<mp[node{j,a[i]-a[j],l-1}]<<endl;
//				cout<<i<<" "<<j<<' '<<mp[{3,0,1}]<<endl;
			}
	}
	
	_print(n);
	for(int i=2;i<=n;++i)
		_print(t[i]);
	
	return 0;
}
/*
10
1 1 1 1 1 1 1 1 1 1

4
1 1 1 1
*/

F题 鸽了

G题
AC自动机板子

标签:AtCoder,ch,puts,Beginner,Contest,int,ll,long,define
From: https://www.cnblogs.com/wlesq/p/18300778

相关文章

  • AtCoder Beginner Contest 362 补题记录(A~E,G)
    A分三类情况讨论即可。voidsolveqwq(){intr=io.read(),g=io.read(),b=io.read();stringqwq=io.readstring();if(qwq=="Blue")printf("%lld\n",min(r,g));elseif(qwq=="Red")printf("%lld\n",......
  • Solution - Atcoder AGC021D Reversed LCS
    考虑到\(\operatorname{LCS}(T,T')\)这个形式实在是不太优美,考虑转化一下形式。感受一下,能够知道\(T\)的最长回文子序列\(|\operatorname{LPS}(T)|=|\operatorname{LCS}(T,T')|\)。具体证明可以见zhihu,本人暂时还没看懂。那么接下来对于单个串的\(\operatorname{LPS......
  • Solution - Atcoder ARC127E Priority Queue
    考虑转化一下,每个最后留下来的集合都相对的对应着一个被删除的集合。于是考虑去对被删除的数去计数。然后贪心的,去让每一次\(2\)操作删除的数都是前面加入中还剩下的最后加入的数(因为有的可能被前面的\(2\)操作删了)。对于证明,考虑到如果不是剩下的最后加入的,那么中间可能会......
  • SMU Summer 2024 Contest Round 3
    1.To3原题链接:http://162.14.124.219/contest/1007/problem/I记录数组中除3余数的种类和个数,以及数组元素总和除3的余数,最后判断(考虑总余数为1,两个元素余数为2和总余数为2,两个元素余数为1的特殊情况)查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespa......
  • SMU Summer 2024 Contest Round 2
    1.MinimumWidth原题链接:http://162.14.124.219/contest/1006/problem/C二分一行最大容量,如果check小于等于总行数就扩大,反之则缩小查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;inta[1000000],b[1000000];boolcheck(intx){......
  • 【atcoder】习题——位元枚举
    题意:求i&M的popcount的和,i属于0……N主要思路还是变加为乘。举个例子N=22,即10110假设M的第3位是1,分析N中:00110001110010000101发现其实等价于0010001100000001也就是左边第4位和第5位不变,右边第1位和第2位不变拼接起来,相当于0000~001101110011110110001101......
  • SMU Summer 2024 Contest Round 3(7.10)
    寻找素数对思路:数的范围为10000,直接筛出所有范围内的质数,n2的枚举所有质数对和的情况#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definePIIpair<int,int>constintN=1e4+5;vector<int>pri;intidx,st[N];voidinit(){for(in......
  • SMU Summer 2024 Contest Round 3
    SMUSummer2024ContestRound3寻找素数对题意给你一个偶数,找到两个最接近的素数,其和等于该偶数。思路处理出1e5以内的素数,然后遍历,更新最接近的答案。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;vector<int>euler_range(intn){......
  • Solution - Atcoder ABC177F I hate Shortest Path Problem
    考虑按题目所述的进行DP。设计状态\(f_{i,j}\)代表强制要求\((i,j)\)要走向\((i+1,j)\)最小的横坐标之差,这是因为对应的纵坐标之差是确定的。对于转移,考虑到对于\(j\not\in[a_i,b_i]\),直接从上面转移下来即可,即\(f_{i,j}\leftarrowf_{i-1,j}\)。对于\(j......
  • SMU Summer 2024 Contest Round 2
    Sierpinskicarpet1.这道题的核心其实在于,我们要观察到点的位置是在每一个小图形的正方形内,和一个大图型的中心正方形处的,那么通过观察可以发现,如果满足在这个正方形处,那么一定(3k-1+1)<=x,y<=(2*3k-1)2.这个k是什么意思呢?当我们n=3的时候k可以取1,2,3,也就是对应每一级的中间宫......