首页 > 其他分享 >AtCoder Beginner Contest 296

AtCoder Beginner Contest 296

时间:2023-05-23 15:47:18浏览次数:44  
标签:AtCoder cout Beginner int 奇偶性 数组 296 题意

AtCoder Beginner Contest 296

D

题意

给出n和m,问\(1\leq i,j\leq n\),使得\(ij\geq m\),求出这个乘积的最小值

思路

这两个乘数至少有一个在\([1,\sqrt{m}]\),枚举

代码

void solve() 
{	
	
	cin>>n>>m;
	int x=sqrt(m);
	if(n>=m) {cout<<m<<endl;return;}
	if(x*x==m) 
	{
		if(n<x) cout<<-1<<endl;
		else cout<<m<<endl;
		return;
	}
	else if(n<=x) {cout<<-1<<endl;return;}  
	int mn=1e18;
	for(int i=1;i<=(x+1);i++) 
	{
		int k = (m+i-1)/i;
		if(k<=n&&k*i>=m) mn=min(mn,k*i);
	}
	cout<<mn<<endl;
}

E

题意

这题抽象出来就是给出一个图,第i轮在对方可能让你走任意步数K时,你是否能选择一个能走到终点i且距离终点i为K的点。

思路

很显然,假设当前为第i轮,若在图中i不是环内点,那对方可能来个很大的步数让你无法获胜。若是环内点,则对方选任意步数你都能通过选择另一个环内点调整距离。

代码

void solve() 
{	
	cin>>n;
	vector<vector<int>> g(n+1);
	for(int i=1;i<=n;i++) 
	{
		cin>>a[i];
		g[i].push_back(a[i]);
		in[a[i]]++;
	}

	queue<int> q;
	for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
	while(q.size()) 
	{
		int x=q.front();
		q.pop();
		vis[x]=1;//区分环内外的点
		for(auto to : g[x]) 
		{
			if((--in[to])==0) 
			{
				q.push(to);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++) if(!vis[i]) ans++;
	cout<<ans<<endl;
}

F

题意

选择三个数\(i,j,k\),然后交换\(a[i],a[j]\),交换\(b[i],b[k]\),问能否通过这样的操作让数组a和数组b完全相同。

思路

首先如果两个数组包含的元素不同就失败。
包含元素相同,则可通过两次操作,在不改变a的情况下,改变b数组中任意三个数的位置,让他们循环左移一次。
交换后b数组的逆序对奇偶性不变,这样判断a数组的奇偶性和b数组的奇偶性是否相同即可。
还有一种特殊情况,如果有元素相同,则可通过只用两个相同元素来调整其他元素的位置,一定成功。

代码

int tr[N*2];
int a[N],b[N],cnt1[N],cnt2[N];
void add(int x,int k) 
{
	while(x<=n)
	{
		tr[x]+=k;
		x+=(x&-x);
	}
}

int sum(int x) 
{
	int res=0;
	while(x) res+=tr[x],x-=x&-x;
	return res;
}

void solve() 
{
	cin>>n;
	int flag=0;
	for(int i=1;i<=n;i++) cin>>a[i],cnt1[a[i]]++;
	for(int i=1;i<=n;i++) cin>>b[i],cnt2[b[i]]++;
	for(int i=1;i<=n;i++) 
	{
		if(cnt1[i]!=cnt2[i]) {cout<<"No\n";return;}
		if(cnt1[i]>1||cnt2[i]>1) flag=1;
	}
	if(flag==1) {cout<<"Yes\n";return;}
	int ans1=0,ans2=0;
	for(int i=n;i>=1;i--) 
	{
		ans1+=sum(a[i]-1);
		add(a[i],1);
	}
	memset(tr,0,sizeof(tr));
	for(int i=n;i>=1;i--) 
	{
		ans1+=sum(b[i]-1);
		add(b[i],1);
	}
	if((ans1+ans2)%2==0) {cout<<"Yes\n";}
	else cout<<"No\n";
}

标签:AtCoder,cout,Beginner,int,奇偶性,数组,296,题意
From: https://www.cnblogs.com/LIang2003/p/17425400.html

相关文章

  • AtCoder Regular Contest 139 C One Three Nine
    洛谷传送门AtCoder传送门闲话:做这场的B用时跟C差不多不会直接构造,因此这是一个无脑做法。考虑对于\(\forallx\in[1,n],y\in[1,m],(x+3y,3x+y)\)看成一个点,那么选择的\((x,y)\)要满足,不存在一行或一列有超过\(1\)个点。这启发我们对于合法的点\((a......
  • Atcoder 选做
    [ARC103F]DistanceSums(构造,重心)首先显然\(D_i\)的最小值被重心取到,不妨以重心为根。对于一条边连接的两个点\(x,y\),不妨设这条边\(x\)侧的点数为\(siz_x\),\(y\)侧为\(siz_y\)。那么\(D_y=D_x+siz_x-siz_y=D_x+siz_x-(n-siz_x)=D_x+2\timessiz_x-n\)。那么......
  • Atcoder Grand Contest 060 D - Same Descent Set
    先推式子。设\(f(S)\)表示decent集合恰好为\(S\)的排列个数,\(g(S)\)表示\(S\)是\(p\)的decent集合的一个子集的排列\(p\)个数,\(g'(\{a_1,a_2,\cdots,a_k\})=\dfrac{n!}{a_1!(a_2-a_1)!(a_3-a_2)!\cdots(a_k-a_{k-1})!(n-a_k)!}\),那么有:\[\begin{aligned}ans=&\......
  • Atcoder Beginner Contest ABC302 题解
    代码见此:https://atcoder.jp/contests/abc302/submissions?f.Task=&f.LanguageName=&f.Status=&f.User=frequenter。AAttackhttps://atcoder.jp/contests/abc302/tasks/abc302_a直接计算a/b,有余数的话答案加一。BFindSnukehttps://atcoder.jp/contests/abc302/tasks/abc......
  • AtCoder Regular Contest 132 D Between Two Binary Strings
    洛谷传送门AtCoder传送门提供一个dp思路。下文设串长为\(n\),串中\(1\)个数为\(m\)。考虑如何求\(d(s,t)\)。设\(s\)的\(1\)位置分别为\(a_1,a_2,...,a_m\),\(t\)的\(1\)位置分别为\(b_1,b_2,...,b_m\)。那么\(d(s,t)=\sum\limits_{i=1}^m|a_i-b......
  • AtCoder Beginner Contest 302 Ex Ball Collector
    洛谷传送门AtCoder传送门考虑如果只询问一次怎么做。连边\((a_i,b_i)\),对于每个连通块分别考虑。这是ARC111B,如果一个连通块是树,肯定有一个点不能被选;否则有环,一定能构造一种方案,使得每个点都被选。那么现在对于每个点都要求,考虑dfs时合并当前的\((a_u,b_u)\),并且使用......
  • 【题解】Atcoder ABC302 F,G,Ex
    完全不会G和Ex,这些套路还是要积累一下的。F.MergeSet题目描述:给定\(n\)个集合,每次可以合并两个有交的集合,问最少多少次合并可以让\(1\)和\(m\)位于同一个集合中。题目分析:一开始将题读成了将\([1,m]\)位于同一个集合中,然后就感觉这个题相当不可做。因为集合的元......
  • AtCoder Regular Contest 130 E Increasing Minimum
    这题太神仙了吧!感觉还不是很懂,但是尽力理一下思路。设\(t_x\)为最大的\(j\)使得\(i_j=x\),不存在则\(t_x=0\)。设\(1\simn\)的数按照\(t\)从小到大排序后是\(p_1,p_2,...,p_n\),设\(q_i\)为\(i\)在\(p\)中的排名,即\(q_{p_i}=i\)。发现正着不好考虑,......
  • AMME2000 BMET2960 解析
    辅导BMET9960、辅导MATLAB程序语言AMME2000/BMET2960/BMET9960-Assignment2,2023Due:11:59pmFriday19thMay(Week12)2023AssignmentInformaonAssignment2focusesonyourunderstandingoftheanalycalandnumericalsoluontotheWaveEquaonandLaplaceEq......
  • AtCoder Beginner Contest 302
    A-Attack(abc302a)题目大意给定怪物的血量\(a\)和你每次攻击扣除的血量\(b\),问打多少次怪物才会死。解题思路答案即为\(\lceil\frac{a}{b}\rceil=\lfloor\frac{a+b-1}{b}\rfloor\)神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=long......