首页 > 其他分享 >AtCoder Beginner Contest 360 - VP记录

AtCoder Beginner Contest 360 - VP记录

时间:2024-11-06 20:21:27浏览次数:1  
标签:AtCoder return 蚂蚁 Beginner Contest int LL using include

A - A Healthy Breakfast

高桥日常出境。

头一次知道 getchar() 的返回值是 int

点击查看代码
#include<cstdio>
using namespace std;

int main()
{
	char s[3]={getchar(),getchar(),getchar()};
	     if(s[0]=='R'&&s[1]=='M') puts("Yes");
	else if(s[0]=='R'&&s[2]=='M') puts("Yes");
	else if(s[1]=='R'&&s[2]=='M') puts("Yes");
	else puts("No");
	return 0;
}

B - Vertical Reading

题目可以转化成从 \(c\) 开始,每次跳 \(w\) 个字符。

所以直接枚举 \(c\) 和 \(w\) + 暴力判断。

点击查看代码
#include<cstdio>
#include<cstring>
using namespace std;

const int N=105;
int n,m;
char s[N],t[N];

int main()
{
	scanf("%s%s",s+1,t+1);
	n=strlen(s+1),m=strlen(t+1);
	for(int w=1;w<n;w++)
		for(int c=1;c<=w;c++)
		{
			bool flag=true;
			int p=1;
			for(int i=c;i<=n;i+=w,p++)
			{
				if(s[i]!=t[p])
				{
					flag=false;
					break;
				}
			}
			p--;
			if(flag && p==m)
			{
				printf("Yes\n");
				return 0;
			}
		}
	printf("No\n");
	return 0;
}

C - Move It

贪心,在每个盒子里多出的物品中选最轻的拿走。

点击查看代码
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

const int N=1e5+5;
int n,a[N],w[N];
vector<int> box[N];

bool cmp(int x,int y){return w[x]<w[y];}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		box[a[i]].push_back(i);
	}
	for(int i=1;i<=n;i++)
		scanf("%d",&w[i]);
	long long ans=0;
	for(int i=1;i<=n;i++)
	{
		sort(box[i].begin(),box[i].end(),cmp);
		for(int j=0;j<(int)box[i].size()-1;j++)
			ans+=w[box[i][j]];
	}
	printf("%lld\n",ans);
	return 0;
}

D - Ghost Ants

同向蚂蚁永远不互相穿过,所以只用考虑不同向的蚂蚁;又因为正向蚂蚁和逆向蚂蚁互相穿过只算一对,所以只用考虑每只正向蚂蚁会穿过多少逆向蚂蚁。

很明显,会和在 \(a_i\) 处的正向蚂蚁互相穿过的逆向蚂蚁的起始坐标应当在区间 \([a_i,a_i+2t]\) 内,所以将逆向蚂蚁排序以后二分(可以用 lower_bound 和 `upper_bound)找在这个区间内最左和最右的蚂蚁编号,其间蚂蚁的数量就可以累计到答案里。

点击查看代码
#include<cstdio>
#include<bitset>
#include<algorithm>
using namespace std;

const int N=2e5+5;
int n,aidx,bidx;
long long t,a[N],b[N];
char str[N];
bitset<N> type;

int main()
{
	scanf("%d%lld%s",&n,&t,str+1);
	for(int i=1;i<=n;i++)
		type[i]=str[i]-'0';
	for(int i=1;i<=n;i++)
	{
		long long x; scanf("%lld",&x);
		if(type[i]) a[++aidx]=x;
		else b[++bidx]=x;
	}
	sort(b+1,b+bidx+1);
	long long ans=0;
	for(int i=1;i<=aidx;i++)
	{
		int l=lower_bound(b+1,b+bidx+1,a[i])-b;
		int r=upper_bound(b+1,b+bidx+1,a[i]+(t<<1))-b-1;
		ans+=(r-l+1);
	}
	printf("%lld\n",ans);
	return 0;
}

E - Random Swaps of Balls

之前从来没有接触过这方面的题目(DP 概率),所以第一眼就放弃然后去做后面的题了。

算法是从这篇题解里学习的,这里就不多赘述了。

#include<cstdio>
#define LL long long
using namespace std;

const int K=1e5+5,P=998244353;
LL n,k,f[K];

LL quick_pow(LL x,LL y)
{
	LL res=1;
	while(y)
	{
		if(y&1) res=res*x%P;
		x=x*x%P;
		y>>=1;
	}
	return res;
}
LL inv(LL x){return quick_pow(x,P-2);}

int main()
{
	scanf("%lld%lld",&n,&k);
	LL leave=(((n-1)*inv(n*n%P))<<1)%P;
	LL back=(inv(n*n%P)<<1)%P;
	f[0]=1;
	for(int i=1;i<=k;i++)
	{
		f[i]=(1-leave)*f[i-1]+back*(1-f[i-1]);
		f[i]=(f[i]%P+P)%P;
	}
	LL ans = f[k] + (1-f[k])*inv(n-1)%P * (2+n)%P*(n-1)%P*inv(2)%P;
	printf("%lld\n",(ans%P+P)%P);
	return 0;
}

G - Suitable Edit for LIS

第一眼感觉很可做的样子,最后居然独立切出来了(虽然不是场切)。

不过我这个方法细节特别多,而且似乎是个假做法(对拍了 \(3000+\) 组数据后发现了 Hack 数据,不过这个做法也可以说 \(99.99\%\) 正确吧,至少题目数据没有能 Hack 掉我)。

简而言之就是在原本树状数组求 LIS 的基础上各种判断是否能新插入一个数进去,而且在序列长度相同情况下的选择优先级也需要很仔细。

因为不一定正确就不写解析了。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<unordered_map>
using namespace std;

const int N=2e5+5;
int n,a[N],f[N];
bool added[N];

unordered_map<int,int> c;
inline int lowbit(int x){return x&-x;}
bool cmp_greater(int x,int y) //x>y
{
	if(f[x]!=f[y]) return f[x]>f[y];
	if(added[x]!=added[y]) return added[x]<added[y];
	if(a[x]!=a[y]) return a[x]<a[y]; //这一行和下一行可能交换与否都有可能出最优解
	if(x!=y) return x<y;
	return false;
}
int maxp(int x,int y)
{
	return cmp_greater(x,y)?x:y;
}
void update(int x,int y)
{
	for(x++;x<=1e9;x+=lowbit(x))
		c[x]=maxp(c[x],y);
	return;
}
int query(int x)
{
	int res=0;
	for(x++;x;x-=lowbit(x))
		res=maxp(res,c[x]);
	return res;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int ans=0;
	a[0]=-0x3f3f3f3f;
	for(int i=1;i<=n;i++)
	{
		int pos=query(a[i]-1);
		if(pos!=i-1 && a[pos]!=a[i]-1 && !added[pos])
		{
			printf("added in %d\n",i);
			added[i]=true;
			f[i]=f[pos]+2;
			update(a[i],i);
		}
		else
		{
			added[i]=added[pos];
			f[i]=f[pos]+1;
			update(a[i],i);
		}
		printf("f[%d]=%d(from %d)\n",i,f[i],pos);
		if(i!=n && !added[i]) ans=max(ans,f[i]+1);
		else ans=max(ans,f[i]);
	}
	printf("%d\n",ans);
	return 0;
}

标签:AtCoder,return,蚂蚁,Beginner,Contest,int,LL,using,include
From: https://www.cnblogs.com/jerrycyx/p/18530935

相关文章

  • AtCoder Beginner Contest 378 E
    https://atcoder.jp/contests/abc378/tasks/abc378_ehttps://atcoder.jp/contests/abc378/editorial/11300#include<bits/stdc++.h>#definexfirst#defineysecond#defineall(x)(x).begin(),(x).end()#definelowbit(x)(x)&-(x)usingnamespacestd;ty......
  • AtCoder Beginner Contest 378
    AtCoderBeginnerContest378总结A直接模拟,存\(1\)到\(4\)出现个数。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map&g......
  • AtCoder Beginner Contest 378
    ABC378光速切掉前四题,结果倒在了第五题。A-Pairing难度:红。弱智题,不解释。#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[5]={0};for(inti=1;i<=4;i++){intx;cin>>x;a[x]++;}intans=0;for(inti=1;i<=4;i++){......
  • AtCoder
    AtCoder做题记录AtCoderBeginnerContest378APairing检查一下\(1\sim4\)各有几个即可。代码BGarbageCollection根据\(d\)求出当天的余数,让后和\(r\)比较一些即可。代码。CRepeating用map存上一个该数的位置。代码。DCountSimplePaths疑似深搜板子。代......
  • AtCoder Beginner Contest 378 F题题解
    题目:F-AddOneEdge2思路:可以发现题目就是要我们找出有多少个点对满足连成后是一个简单环环上的点度都为3因为是一个简单图所以不可以有重边和自环那么就代表着这个环肯定是由两个度为2的点和大于1个度为3的点组成的注意到两个点的最近公共祖先一定可以跟这两个点形......
  • AtCoder Beginner Contest 378
    省流版A.判断奇偶性即可B.根据余数计算偏移天数即可C.用map记录每个数出现的位置即可D.枚举起点,枚举每步的方向,朴素搜索即可E.考虑前缀和的两数相减代替区间和的情况,减为负数则加回正数,用树状数组维护减为负数的情况数F.枚举点,作为连边的俩个点的lca,考虑维护路径点......
  • AtCoder Beginner Contest 378题解
    省流:dfs都会写错。正片:A:Pairing统计一下每个数字出现了多少次即可,每次减去2。#include<bits/stdc++.h>usingnamespacestd;inta,b,c,d,ans;map<int,int>mp;intmain(){ cin>>a>>b>>c>>d; mp[a]++,mp[b]++,mp[c]++,mp[d]++; while(mp[a]>=2)mp[a......
  • AtCoder Beginner Contest 378题解
    AtCoderBeginnerContest378题解总体情况十分钟翻盘局。A-Pairing题意有四个球,每次可以消掉两个颜色相同的球,问最多能效多少次?题解直接使用贪心即可代码//Problem:A-Pairing//Contest:AtCoder-AtCoderBeginnerContest378//URL:https://atcoder.j......
  • AtCoder Beginner Contest 378
    A-Pairing题意给\(4\)个数,每次选两个数字相同的丢掉。求最大操作数。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){inta,b,c,......
  • AtCoder Beginner Contest 363 - VP记录
    PrefaceA-PilingUpAtCoder日爆导致半天登不上去。这道题还是看的洛谷上的题面,用洛谷RMJ交的。点击查看代码#include<cstdio>usingnamespacestd;intmain(){ intr;scanf("%d",&r); if(r<=99)printf("%d\n",100-r); elseif(r<=199)printf("%d\......