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

AtCoder Beginner Contest 296

时间:2023-04-02 20:34:20浏览次数:47  
标签:AtCoder Beginner int ll cin ++ vec 数组 296

AtCoder Beginner Contest 296

比赛连接

好久没写题解了~~

D - M<=ab

题意就是给定N,M, 求一个最小的数x同时满足x>=M且x=a*b(a<=N,b<=N);

N,M<=1e12

开始脑瘫想了二分,仔细一想很明显x不满足单调性,想了下暴力的时间复杂度巨大...

纠结了一会,发现因子最大是sqrt(m),只需要枚举一下因子x,然后求出最小的y使得M<=x*y最小, 推一下就会发现y=(m/i)上取整。

时间负责度: O(sqrt(m)), 不超过1e6

注意:枚举到sqrt(m)+1, wa4 -_-

void solve(int Tcase = 1) {
	ll n, m;
	cin >> n >> m;
	ll ans = 1e18;
	for (ll i = 1; i <= min(n, (ll)sqrt(m) + 1); i++) {
		ll j = m / i + (m % i != 0);
		if (j > n) continue;
		if (i * j >= m) ans = min(ans, i * j);
	}
	cout << (ans==1e18?-1:ans) << '\n';
}

E - Transition Game

简单来说,就是a给出的数字x要在一个环内,如果x不在一个环内,那么b可以给一个巨大的循环次数,那么x永远不可能出现在黑板上,如果x在环内,那么无论你给出什么数字,最终只要一直循环便可恰好停留在黑板上。

想到拓扑排序,那么问题就解决了。

const int N = 200010;
int n;
vec<int> e[N];
void solve(int Tcase = 1) {
	cin >> n;
	vec<int> a(n + 1, 0);
	vec<int> idg(n + 1, 0);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		idg[a[i]]++;
		e[i].pb(a[i]);
	}
 
	queue<int> que;
	for (int i = 1; i <= n; i++) {
		if (!idg[i]) que.push(i);
	}
	int ans = n;
 
	while (!que.empty()) {
		int t = que.front();
		que.pop();
		ans--;
		for (auto v : e[t]) {
			if (--idg[v] == 0) {
				que.push(v);
			}
		}
	}
	cout << ans << '\n';
}

F - Simultaneous Swap

满足:

  • 数组中各个数出现次数相同

  • 如果有数组中有相同的数,那么就一定可以

    例如:
    A:1 1 2 3 4 5 
       i j
    B:5 2 4 3 1 1
                 k
    通过保持a数组不变,不停的调整b数组
    
  • 否则,数组中每个数各不相同,那么考虑,每次交换会产生什么影响

    会改变a和b中的逆序数对数量
    A: +1 -1 -1 +1
    B: +1 -1 +1 -1
        2 -2  0  0
    会发现,变化都是以+、-2或0为单位;(x)
    而最终a和b的逆序对是相等的。
    所以a和b的初始逆序对的奇偶性要相等,因为条件(x)
    

那么问题就解决了,归并排序或者数据结构维护一下逆序对即可。

const int N = 200010;
int c[N];
int n;
void modify (int x, int y) {
	for (x; x <= n; x += x & -x) c[x] += y;
}
int query(int x) {
	int s = 0;
	for (x; x; x -= x & -x) s += c[x];
	return s;
}

void solve(int Tcase = 1) {
	cin >> n;
	vec<int> a(n), b(n);

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	for (int i = 0; i < n; i++) {
		cin >> b[i];
	}

	ll res1 = 0, res2 = 0;
	for (int i = n - 1; i >= 0; i--) {
		modify(a[i], 1);
		res1 += query(a[i] - 1);
	}

    for (int i = 1; i <= n; i++) c[i] = 0;
    for (int i = n - 1; i >= 0; i--) {
        modify(b[i], 1);
        res2 += query(b[i] - 1);
    }

	sort(a.begin(), a.end());
	sort(b.begin(), b.end());

	bool f = 0;
	for (int i = 0; i < n; i++) {
		if (a[i] != b[i]) {
			cout << "No\n";
			return ;
		}
		if (i && a[i] == a[i - 1]) {
			f = 1;
		}
	}
	
	if (f) {
		cout << "Yes\n";
		return ;
    }

    cout << ((res1+res2)%2==0? "Yes":"No");
}

标签:AtCoder,Beginner,int,ll,cin,++,vec,数组,296
From: https://www.cnblogs.com/rufu/p/17281281.html

相关文章

  • AtCoder Beginner Contest 144
    AtCoderBeginnerContest144https://atcoder.jp/contests/abc144补一下3.23做的。D-WaterBottle分类讨论,三角函数。#include<bits/stdc++.h>#definepiacos(-1)usingnamespacestd;intmain(){inta,b,x;cin>>a>>b>>x;......
  • AtCoder Beginner Contest 296 A-E
    AtCoderBeginnerContest296A-Alternately1voidsolve(){2intn=read();3strings;4cin>>s;5intans=1;6for(inti=0;i<s.size()-1;i++){7if(s[i]==s[i+1])ans=0;8}9puts(ans>0?"Yes&......
  • AtCoder Beginner Contest 296
    AtCoderBeginnerContest296赛时代码A-Alternately//Problem:A-Alternately//Contest:AtCoder-AtCoderBeginnerContest296//URL:https://atcoder.jp/contests/abc296/tasks/abc296_a//MemoryLimit:1024MB//TimeLimit:2000ms////PoweredbyCP......
  • AtCoder Beginner Contest 153
    AtCoderBeginnerContest153https://atcoder.jp/contests/abc153这套比较简单。E-CrestedIbisvsMonster完全背包#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+5,M=1e4+5;lln,m,a[N],b[N],f[M*2],mx;int......
  • AtCoder Beginner Contest 296
    DM<=ab枚举。复杂度\(O(\sqrt{m})\)。C++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);i64n,m;cin>>n>>m;if(m&......
  • AtCoder Beginner Contest 296 ABCD
    https://atcoder.jp/contests/abc296A-Alternately#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;constLLN=2e6+10,M=3023;constLLmod=100000007;cons......
  • AtCoder Beginner Contest 152
    AtCoderBeginnerContest152https://atcoder.jp/contests/abc152F我看了半天,编码方式那里还算是感觉比较玄乎,这题确实妙。D-Handstand2只需记录两端数字即可,不要想太复杂。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lln,sum,a[10][10];......
  • AtCoder Beginner Contest 295
    题解报告基本的一些理解和问题都在注释中A:ProbablyEnglish//水题#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<unordered_map>usingnamespacestd;constintmaxn=1e3+10;strings[......
  • AtCoder Beginner Contest 246
    AtCoderBeginnerContest246A(思维)A这个题大意是告诉你一个矩形的三个点,求第四个点,并且已知每条边都是平行于\(x\)轴或者是\(y\)轴的,那么我们可以确定,\(x\)坐标只有两......
  • AtCoder Beginner Contest 295
    A-ProbablyEnglish#include<bits/stdc++.h>usingnamespacestd;intread(){intx=0,f=1,ch=getchar();while((ch<'0'||ch>'9')&&ch......