首页 > 其他分享 >ABC 377 Review

ABC 377 Review

时间:2024-10-27 16:09:38浏览次数:1  
标签:ABC int Review register long 端点 inline include 377

ABC 377 Review

A

模拟题,但是好像wa了一发,有点幽默

Code

#include<bits/stdc++.h>
using namespace std;
char s[5];
int main()
{
	for(register int i=1;i<=3;++i)s[i]=getchar();
	sort(s+1,s+4);
	if(s[1]=='A'&&s[2]=='B'&&s[3]=='C')cout<<"Yes";
	else cout<<"No";
	return 0;
}

B C

都是模拟题,甚至但是C题还是需要注意一下细节,去掉算重的答案就可以了。

CodeB

#include<bits/stdc++.h>
using namespace std;
char mp[10][10];
int n=8;
inline void input()
{
	for(register int i=1;i<=n;++i)
		for(register int j=1;j<=n;++j)
			cin>>mp[i][j];
}
inline bool check(int x,int y)
{
	for(register int i=1;i<=n;++i)
	{
		if(i==x)continue;
		if(mp[i][y]=='#')return 0; 
	}
	for(register int j=1;j<=n;++j)
	{
		if(j==y)continue;
		if(mp[x][j]=='#')return 0; 
	}
	return 1;
}
inline int calc()
{
	int ans=0;
	for(register int i=1;i<=n;++i)
	{
		for(register int j=1;j<=n;++j)
		{
			if(mp[i][j]=='#')continue;
			if(check(i,j))ans++;
		}
	}
	return ans;
}
int main()
{
	input();
	cout<<calc();
	return 0;
}

CodeC

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
inline bool valid(int x,int y)
{
	return 1<=x&&x<=n&&1<=y&&y<=n;
}
map<int,map<int,int>> vis;
int c1[8]={2,1,-1,-2,-2,-1,1,2},c2[8]={1,2,2,1,-1,-2,-2,-1};
inline void calc(int x,int y,int &ans)
{
	for(register int t=0;t<8;++t)
	{
		int tx=x+c1[t],ty=y+c2[t];
		if(!valid(tx,ty))continue;
		if(!vis[tx][ty])ans--,vis[tx][ty]=1;
	}
}
inline void solve()
{
	cin>>n>>m;
	int x,y;
	long long ans=n*n-m;
	for(register int i=1;i<=m;++i)
	{
		scanf("%lld%lld",&x,&y);
		if(vis[x][y])ans++;
		vis[x][y]=1;
		calc(x,y,ans);
	}
	cout<<ans;
}
signed main()
{
	solve();
	return 0;
}

D

太经典了,一卡题就坐牢,这次坐了一个小时的牢。

分析

其实还是想到了算法的。考虑如果一个左端点固定的话,那么它的右端点可以怎么取?

那么很显然地可以想到如下算法流程:

从 \(1-m\) 枚举左端点,每次经过了一个左端点,就把这个左端点和它对应的右端点一起删除掉。

那么假设当前枚举到了 \(x\) ,我们最多能取的右端点,肯定是当前还存在的最小右端点 \(-1\) 。

这样我们在这个位置上的 \(ans\) 就是 \((Min_r-1)-x+1=Min_r-x\) 。

细节

如果当前的区间已经被全部删没了,那么实际上还是可以产生答案,所以我们还要插入一个 \(m+1\) 的右端点。

左右端点都是可重的,因此对于每一个左端点,我们都要开一个vector来记录有哪些右端点与其对应,才可以方便删除。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10;
template<typename T>inline void re(T &x)
{
	x=0;
	int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
}
int n,m;
multiset<int>visl,visr;
inline void solve()
{
	re(n),re(m);
	vector<int> Rl[m+1]; 
	for(register int i=1,l,r;i<=n;++i)
	{
		re(l),re(r);
		visl.insert(l);
		visr.insert(r);
		Rl[l].push_back(r);
	}
	visr.insert(m+1);
	long long ans=0;
	for(register int x=1;x<=m;++x)
	{
		while(visl.size()&&visl.count(x-1))
		{
			visl.erase(visl.lower_bound(x-1));
			visr.erase(visr.lower_bound(Rl[x-1][Rl[x-1].size()-1]));
			Rl[x-1].pop_back();
		}
		int findr=*visr.upper_bound(0);
		ans+=findr-x;
	}
	cout<<ans;
} 
signed main()
{
	solve();
	return 0;
}

总结

又强化了set的使用技巧,学到了可重点对的记录方式。

最重要的是想到了就去写,代码能力就是不断锻炼出来的。

没有思路就换个角度,或者是开另外一道题。

标签:ABC,int,Review,register,long,端点,inline,include,377
From: https://www.cnblogs.com/Hanggoash/p/18508545

相关文章

  • abc377_E
    E-PermuteKtimes2思路这题由于序列P是一个排列,所以将P表示成一个图的时候,这个图将由\(m\)个环构成对于每个环上的点来说,第一回合它会移动到距离它为\(2\)的点上,距离它为\(2\)的点同时也以相同的方式移动,那么第二回合,它就会移动到距离它为\(4\)的点上,得出规律,一个点移动\(k......
  • 【Atcoder训练记录】AtCoder Beginner Contest 377
    训练情况赛后反思D题差一点点吧?可能不去乐跑就能写出来了A题我们发现ABC是字典序单调递增的,字符串先排序再判断是否为ABC即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ strings;cin>>s; sort(s.begin(),s.end()); i......
  • ABC372
    D题目大意:\(n\)座建筑排成一排,每座建筑的高度为\(h_i\)。\(\foralli\in[1,n]\),找出满足下面条件的\(j\)的数量:在建筑\(i\)到\(j\)中,没有建筑比\(j\)高的\(j\in[i+1,n]\)\(n\leq2\times10^5\),\({h}\)是\(1\)到\(n\)的排列。分析:考虑\(i\)不好处理,我们改为考虑每个......
  • ABC 053
    ABC053目录ABC053A-ABC/ARCB-AtoZStringC-X:YetAnotherDieGameD-CardEaterA-ABC/ARC题意:x>1200,输出"ARC",小于输出"ABC"Submission#59141472-AtCoderBeginnerContest053B-AtoZString题意:找出以'A'开头'Z&#......
  • Codeforces Round 981 (Div. 3) 10.24 (ABCDE)题解
    CodeforcesRound981(Div.3)2024.10.24题解A.SakurakoandKosuke题意:\(Sakurako\)与\(Kosuke\)正在玩游戏,一个点在原点\(x=0\)的起始位置。对于第\(i\)次操作,点会移动\(2\asti-1\)步。两人轮流操作,Sakurako先手,每次将点往负方向移动;Kosuke每次将点往正方向移动......
  • AT_abc195_e 题解
    思路这道题需要倒序计算。定义$dp_{i,j}=f$表示第$i$轮结束后余数为$j$,$f=1$时,Takahashi必胜,否则Aoki必胜。动态转移方程式令:$x=dp_{i,(j\times10+a_i)\bmod7}$$y=dp_{i,j\times10\bmod7}$$dp_{i-1,j}=\begin{cases}x\\operatorname{or}\y&b_i=T\x\......
  • 六个方向比较分析:ChatGPT-o1-preview与 ChatGPT-4o在论文写作辅助上的差异
    学境思源,一键生成论文初稿:AcademicIdeas-学境思源AI论文写作在学术研究和论文撰写的领域,人工智能助手正变得越来越重要。随着技术的不断进步,ChatGPT-o1-preview和ChatGPT-4o作为两个先进的语言模型,在辅助论文写作方面展现出了各自独特的优势和特点。本文将比较分析两个模......
  • CF 981 Review
    CF981Review打的最差的一场Div.3虽然可能有Div.3是ICPC赛制的原因,但是本质上还是自己太菜了。A模拟Code#include<bits/stdc++.h>usingnamespacestd;template<typenameT>inlinevoidre(T&x){ x=0;intf=1;charc=getchar(); while(!isdigit(c)){if(c=='-')f=-1;......
  • abc368_G
    G-AddandMultiplyQueries思路开始直接用的线段树,写完才意识到是假的由于题目说答案不会超过\(10^{18}\),所以一个询问区间内的大于2的b的个数不超过64个,这样一个区间内大于2的b的就可以把a分成不超过64个连续的区间,用树状数组维护,b大于2的位置可以用线段树二分或者set的做......
  • DAY42 ||完全背包理论 | 518. 零钱兑换 II | 377. 组合总和 Ⅳ|70. 爬楼梯 (进阶)
    完全背包理论什么是完全背包:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。不......