首页 > 其他分享 >AtCoder Beginner Contest 383 赛后复盘

AtCoder Beginner Contest 383 赛后复盘

时间:2024-12-07 22:22:49浏览次数:3  
标签:AtCoder Beginner Contest int res read maxn mod define

C>>>>>>>>D。

A

模拟即可。

B

唯一坑点是被染湿的格子不一定要和加湿器连通,枚举两个加湿器然后计算所有点即可,时间复杂度 \(O(h^3m^3)\)。

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

#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 11
int h,w,d;
char ch[maxn][maxn];
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
bool vis[maxn][maxn];
int check(int x,int y,int dep) {
	int res=0;
	For(i,1,h) For(j,1,w) {
		if(!vis[i][j]&&ch[i][j]!='#'&&abs(i-x)+abs(j-y)<=d) {
			vis[i][j]=1;
			res++;
		}
	}
	return res;
}
void work() {
	cin>>h>>w>>d;
	For(i,1,h) For(j,1,w) cin>>ch[i][j];
	int ans=0;
	For(i,1,h) For(j,1,w) 
	{
		if(ch[i][j]=='#') continue;
		For(k,1,h) For(l,1,w) {
			if(k==i&&l==j) continue;
			if(ch[k][l]=='#') continue;
			m0(vis);
			int res=check(i,j,d)+check(k,l,d);
			ans=max(ans,res);
		}
	}
	cout<<ans;
}

signed main() {
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int _=1;
//	int _=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

C

用一个优先队列,每一次将能走最多的步数的点弹出进行搜索,因为先走最多步数一定更优。
实际上就是一个 bfs。
由于每个点只会被遍历一次,所以时间复杂度是 \(O(hw)\)。

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

#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 1010
int h,w,d;
char ch[maxn][maxn];
bool vis[maxn][maxn];
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
struct node {
	int x,y,dep;
	bool operator<(const node &x) const {
		return dep<x.dep;
	}
};
void work() {
	cin>>h>>w>>d;
	priority_queue<node> q;
	For(i,1,h) For(j,1,w) { 
		cin>>ch[i][j]; 
		if(ch[i][j]=='H') q.push({i,j,d});
	}
	while(!q.empty()) {
		auto [x,y,d]=q.top(); q.pop();
		if(vis[x][y]) continue;
		vis[x][y]=1;
		For(i,1,4) {
			int X=x+dx[i],Y=y+dy[i];
			if(X>0&&X<=h&&Y>0&&Y<=w&&!vis[X][Y]&&ch[X][Y]!='#'&&d>0) q.push({X,Y,d-1});
		}
	}
	int ans=0;
	For(i,1,h) For(j,1,w) ans+=vis[i][j];
	cout<<ans;
}

signed main() {
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int _=1;
//	int _=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

D

简单计数题。
因为一共有 \(9\) 个因子,根据小学学过的只有完全平方数才有奇数个因子的特性,想到枚举完全平方数。然后你发现这并不可行。
怎么优化?我们首先可以察觉到,这个完全平方数一定绝大部分是形如 \(a^2b^2\)(满足 \(a\ne b\) 且 \(a,b\) 均为质数),他的因子分别是 \(a,a^2,b,b^2,ab,a^2b,ab^2,ab^2,a^2b^2\)。
同时,还有这样一种 \(a^8\)(\(a\) 为质数),他的因子分别为 \(a\) 的 \([1,8]\) 次幂。
我们筛出质数然后查找就好啦!大样例告诉我们答案不会很大,所以可行!

点击查看代码
#include<bits/stdc++.h>
#define int ll
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050
int pr[1100010],top;
bool vis[1100010];
int n;
void work() {
	For(i,2,1100000) {
		if(vis[i]) continue;
		pr[++top]=i;
		for(int j=i+i;j<=1100000;j+=i) {
			vis[j]=1;
		}
	}
	cin>>n;
	int ans=0;
//	For(i,1,top) For(j,i+1,top) For(k,j+1,top) if(pr[i]*pr[i]*pr[j]*pr[k]<=n) ans++;
	For(i,1,top){
		if(pr[i]*pr[i]*pr[i]*pr[i]>n) break;
		if(pr[i]<=100&&pr[i]*pr[i]*pr[i]*pr[i]*pr[i]*pr[i]*pr[i]*pr[i]<=n) ans++;
		For(j,i+1,top) {
			if(pr[i]*pr[i]*pr[j]*pr[j]<=n) ans++; 
			else break;
		}
	} 
	cout<<ans;
}

signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	int _=1;
//	int _=read();
	For(i,1,_) {
		work();
	}
	return 0;
}
/*

*/

标签:AtCoder,Beginner,Contest,int,res,read,maxn,mod,define
From: https://www.cnblogs.com/CodingGoat/p/18592762

相关文章

  • atcoder 杂题 #02
    atcoder杂题#02arc065_bConnectivity。arc137_bCount1's。abc287_fComponents。abc308_gMinimumXorPairQuery。arc065_b对两种边分别建图求并查集,其实就是求有多少个点满足两个图都在同一个并查集。可以把一个点的并查集标号扔进map<pair<int,int>,int>里,就......
  • 题解:AtCoder Beginner Contest AT_abc380_d ABC380D Strange Mirroring
    题目大意给定一个字符串$S$,执行$10^{100}$次以下操作:首先,令字符串$T$为字符串$S$中所有大写字母变为小写字母,小写字母变为大写字母的结果。其次,将$T$拼接在$S$后面。接下来,有一些询问:请输出在所有操作执行完成之后$S$的第$K$个字母。思路乍一看,好大的数......
  • 题解:AtCoder Beginner Contest AT_abc373_d ABC373D Hidden Weights
    题目传送门题目翻译给你一个$N$个点,$M$条边的有向图,其中边有边权。现在让你给每一个点设置一个点权$a$,使得对于任意两点$x$和$y$,如果$x$到$y$有一条边,边权为$w$,那么需要满足$a_y-a_x=w$。现在让你输出一组合法的分配方案,题目保证存在,输出任意一组都行。思路1(注意......
  • atcoder 杂题 #01
    atcoder杂题#01arc163_cHarmonicMean。arc065_cManhattanCompass。abc303_fDamageoverTime。arc065_dShuffling。arc163_c可能因为数学不好,所以栽在了这道Luogu评的绿题上。题目大意:求一个长为\(n\)的正整数序列\(a\)使得\(\sum\frac1{a_i}=1\),要求......
  • Magical Palette( The 2024 ICPC Asia Shenyang Regional Contest)
    MagicalPalette(The2024ICPCAsiaShenyangRegionalContest)题目描述:体面总结小白兔有一个魔法调色板,调色板是一个(n×m......
  • 1.1 Beginner Level学习之“了解 ROS 服务和参数”(第七节)
    学习大纲:1.ROS服务ROS服务是一种节点之间的通信方式,允许一个节点发送请求并接收响应。它采用的是同步机制,即一个节点会发送请求,等待另一个节点处理并返回结果。这个机制适合需要及时反馈的情况。rosservice是ROS提供的一个工具,专门用来与服务进行交互。它可以列出、查......
  • AtCoder Beginner Contest 382-E
    Problem有无数包牌,每包有\(N\)张牌。在每一包牌中,第\(i\)张牌是稀有牌,概率为\(P_i\%\)。每张牌是否稀有与其他牌是否稀有无关。逐一打开包装,并获得每包中的所有卡片。当你一直开包直到总共获得至少\(X\)张稀有卡牌时,求你开包的预期次数。Constraints\(1\leqN\leq5......
  • AtCoder Beginner Contest 382 Solution
    A-DailyCookie(abc382A)题目大意给定一个长度为N的字符串,有很多.和@,一共有D天,每天会使一个@变成.,问D天之后有几个.解题思路数一下有几个.,答案会加D个.。代码voidsolve(){intn,d;strings;cin>>n>>d>>s;cout<<count(s.begin(),s.end(),'.......
  • AtCoder Beginner Contest 380 Solution
    A-1232336个数问是不是1个1,2个2,3个3#include<bits/stdc++.h>usingnamespacestd;inta[4];intmain(){strings;cin>>s;for(inti=0;i<s.size();i++)a[s[i]-'0']++;if(a[1]==1&&a[2]==2......
  • AtCoder Beginner Contest 382 赛后复盘
    abc381的赛后总结不见了。(人话:没写)A-B模拟即可C因为好吃的会被前面的人吃掉,后面的人只能捡垃圾吃,所以实际上能吃东西的\(a\)成单调递减。所以我们直接二分在哪个区间即可,时间复杂度\(O(m\logn)\)。点击查看代码#include<bits/stdc++.h>#definelllonglong#de......