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

AtCoder Beginner Contest 361

时间:2024-08-17 20:05:58浏览次数:5  
标签:std AtCoder Beginner int ans using ABC361 include 361

ABC361 A - Insert

题目传送门


代码(签到题)

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int n,m,x,a[111];
int main(){
	cin>>n>>m>>x;
	for (int i=1;i<=n;++i) cin>>a[i];
	for (int i=1;i<=m;++i) cout<<a[i]<<' ';
	cout<<x<<' ';
	for (int i=m+1;i<=n;++i) cout<<a[i]<<' ';
	return 0;
}

ABC361 B - Intersection of Cuboids

题目传送门


分析

没想到这场竟然 B 题被卡了很久,实际上相交的话那么左下角坐标分别的最大值和右上角坐标分别的最小值可以构成交集长方体,

用这个长方体的八个角所在的小正方体判断是否同时存在两个长方体中。


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <queue>
using namespace std;
int a[6],b[6],c[6];
int iut(){
    int ans=0,f=1; char c=getchar();
    while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans*f;
}
void print(int ans){
    if (ans>9) print(ans/10);
    putchar(ans%10+48);
}
bool check(int lx,int ly,int lz,int rx,int ry,int rz){
    if (lx>=rx||ly>=ry||lz>=rz) return 0;
	if (a[0]<=lx&&rx<=a[3]&&a[1]<=ly&&ry<=a[4]&&a[2]<=lz&&rz<=a[5]){
        if (b[0]<=lx&&rx<=b[3]&&b[1]<=ly&&ry<=b[4]&&b[2]<=lz&&rz<=b[5]) return 1;
        return 0;
    }
	return 0;
}
int main(){
    for (int i=0;i<6;++i) a[i]=iut();
	for (int i=0;i<6;++i) b[i]=iut();
    for (int i=0;i<3;++i) c[i]=max(a[i],b[i]);
    for (int i=4;i<6;++i) c[i]=min(a[i],b[i]);
	for (int i=0;i<2;++i)
	for (int j=0;j<2;++j)
	for (int k=0;k<2;++k)
	if (check(c[0+i*3]-i,c[1+j*3]-j,c[2+k*3]-k,c[0+i*3]+(i^1),c[1+j*3]+(j^1),c[2+k*3]+(k^1)))
		return !printf("Yes");
    return !printf("No");
}

ABC361 C - Make Them Narrow

题目传送门


代码(这才是真的签到题,上一题啥玩意啊)

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <queue>
using namespace std;
int n,k,a[200011],ans=0x3f3f3f3f;
int iut(){
    int ans=0,f=1; char c=getchar();
    while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans*f;
}
void print(int ans){
    if (ans>9) print(ans/10);
    putchar(ans%10+48);
}
int main(){
    n=iut(),k=n-iut();
    for (int i=1;i<=n;++i) a[i]=iut();
    sort(a+1,a+1+n);
    for (int i=1;i+k-1<=n;++i) ans=min(ans,a[i+k-1]-a[i]);
    return !printf("%d",ans);
}

ABC361 D - Go Stone Puzzle

题目传送门


分析

实际上就是广搜求最短路,不过位运算有点麻烦而已


代码

// LUOGU_RID: 172720686
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
string strS,strT;
queue<pair<int,int> >q;
int dp[65535][16],n,S,T,b[16];
int main(){
	cin>>n>>strS>>strT;
	for (int i=0;i<(1<<n);++i)
	for (int j=0;j<=n;++j) dp[i][j]=-1;
	for (int i=0;i<n;++i)
	if (strS[i]=='B') S=S<<1|1;
	    else S=S<<1;
	for (int i=0;i<n;++i)
	if (strT[i]=='B') T=T<<1|1;
	    else T=T<<1;
	dp[S][n]=0,q.push(make_pair(S,n));
	while (!q.empty()){
		pair<int,int>t=q.front(); q.pop();
		int now=t.first,x=t.second;
		if (now==T&&x==n) break;
		for (int i=0;i<n;++i) b[i+(i>=x)*2]=(now>>(n-i-1))&1;
		for (int i=0,t;i<x-1;++i){
			swap(b[x],b[i]),swap(b[x+1],b[i+1]),t=0;
			for (int j=0;j<i;++j) t=t<<1|b[j];
			for (int j=i+2;j<n+2;++j) t=t<<1|b[j];
			if (dp[t][i]==-1){
				dp[t][i]=dp[now][x]+1;
				q.push(make_pair(t,i));
			}
			swap(b[x],b[i]),swap(b[x+1],b[i+1]);
		}
		for (int i=x+2,t;i<=n;++i){
			swap(b[x],b[i]),swap(b[x+1],b[i+1]),t=0;
			for (int j=0;j<i;++j) t=t<<1|b[j];
			for (int j=i+2;j<n+2;++j) t=t<<1|b[j];
			if (dp[t][i]==-1){
				dp[t][i]=dp[now][x]+1;
				q.push(make_pair(t,i));
			}
			swap(b[x],b[i]),swap(b[x+1],b[i+1]);
		}
	}
	return !printf("%d",dp[T][n]);
}

ABC361 E - Tree and Hamilton Path 2

题目传送门


分析

如果还要回到起点的话遍历的顺序按欧拉序每条边都会正好经过两遍,
所以求最短距离也就是边权和两倍再减去树的直径


代码

#include <iostream>
using namespace std;
const int N=200011;
struct node{int y,w,next;}e[N<<1];
long long ans,dp[N],sum;
int as[N],n,et=1;
void dfs(int x,int fa){
	for (int i=as[x];i;i=e[i].next)
	if (e[i].y!=fa){
		dfs(e[i].y,x);
		ans=max(ans,dp[x]+dp[e[i].y]+e[i].w);
		dp[x]=max(dp[x],dp[e[i].y]+e[i].w);
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for (int i=1,x,y,w;i<n;++i){
		cin>>x>>y>>w,sum+=w*2;
		e[++et]=(node){y,w,as[x]},as[x]=et;
		e[++et]=(node){x,w,as[y]},as[y]=et;
	}
	dfs(1,0);
	cout<<sum-ans;
	return 0;
}

ABC361 F - x = a^b

题目传送门


分析

考虑立方或者幂次更高的数已经很少了,不妨特判平方的情况,剩下的数直接枚举并去重即可


代码

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <unordered_map>
using namespace std;
unordered_map<long long,bool>v;
long long n,ans;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n,ans=sqrt((long double)n);
	for (int i=3;i<=61;i+=2){
		for (long double j=2;;++j)
		if (pow(j,i)<=n){
			long long t=pow(j,i);
			if (sqrt(t)!=floor(sqrt(t))&&!v[t]){
				v[t]=1,++ans;
			}
		}else break;
	}
	cout<<ans;
	return 0;
}

ABC361 G - Go Territory

题目传送门


分析

将四连通格点个数转化为连通块大小后,不妨按横坐标拆分成列状的连通块,

然后用并查集进行合并连边,由于连边的数目可能很多,可以采用双指针交叉连边。

注意网格是无界的所以最外一圈要留出来。


代码

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
const int N=200003;
vector<int>G[N]; map<pair<int,int>,int>uk;
int f[N<<2],n,m; long long ans,siz[N<<2];
int getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
void merge(int x,int y){
    int u=getf(x),v=getf(y);
    if (u<v) u^=v,v^=u,u^=v;
    if (u>v) f[u]=v,siz[v]+=siz[u];
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n,ans=1ll*N*N-n;
    for (int i=-1;i<N-1;++i){
        G[i+1].push_back(-2);
        G[i+1].push_back(N-1);
    }
    for (int i=1;i<=n;++i){
        int x,y;
        cin>>x>>y;
        G[x+1].push_back(y);
    }
    m=uk[make_pair(0,0)]=f[1]=1,siz[1]=N;
    for (int i=0;i<N-1;++i){
        sort(G[i+1].begin(),G[i+1].end());
        int l=G[i+1].size(),L=G[i].size(),I=0,J=0;
        for (int j=0;j<l-1;++j){
            uk[make_pair(i+1,j)]=++m,f[m]=m;
            siz[m]=G[i+1][j+1]-G[i+1][j]-1;
        }
        while (I<L-1&&J<l-1){
            if (max(G[i][I],G[i+1][J])+1<=min(G[i][I+1],G[i+1][J+1])-1)
                merge(uk[make_pair(i,I)],uk[make_pair(i+1,J)]);
            if (G[i][I+1]>G[i+1][J+1]) ++J;
            else if (G[i][I+1]<G[i+1][J+1]) ++I;
                else ++I,++J;
        }
    }
    cout<<ans-siz[1];
    return 0;
}

标签:std,AtCoder,Beginner,int,ans,using,ABC361,include,361
From: https://www.cnblogs.com/Spare-No-Effort/p/18360054

相关文章

  • AtCoder Beginner Contest 045
    A-Trapezoids#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); inta,b,h; cin>>a>>b>>h; cout<<(a+b)*h/2; return0;}B-......
  • [AtCoder] E - Putting Candies
    ProblemLinkIfwepickA[i]the2ndtime,itmeanswehaveacycle.Proof:1sttimewepickA[i],thesumbeforeaddingA[i]isx;2ndtimewepickA[i],thesumbeforeaddingA[i]isy; Forthistohappenx%N==y%Nmusthold.Otherwisewewouldno......
  • 题解:AT_abc365_d [ABC365D] AtCoder Janken 3
    D-AtCoderJanken3题解题意:高桥和青木要玩石头剪刀布,给你一个长度为\(n\)的字符串\(s\),\(s\)表示青木在第\(i\)局游戏中的动作(R表示石头,P表示布,S表示剪刀。)。高桥不可以在任何一局中输给青木(即:高桥和青木只可以平局或高桥赢青木),且高桥第\(i\)局出的和第\(i-1\)局......
  • 题解:AtCoder Janken 3
    D-AtCoderJanken3题解题意高桥和青木要玩石头剪刀布,给你一个长度为\(n\)的字符串\(s\),\(s\)表示青木在第\(i\)局游戏中的动作(R表示石头,P表示布,S表示剪刀)。高桥不可以在任何一局中输给青木(即:高桥和青木只可以平局或高桥赢青木),且高桥第\(i\)局出的和第\(i-1\)局......
  • AtCoder Beginner Contest 044
    A-TakandHotels(ABCEdit)#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); intn,k,x,y; cin>>n>>k>>x>>y; intans=0; if......
  • Solution - Atcoder ARC171D Rolling Hash
    对于这个\(\operatorname{hash}(A_L,\cdots,A_R)\),一个比较经典的想法是做差分,即令\(s_i=\sum\limits_{j=1}^iA_jB^{i-j}\)。于是\(\operatorname{hash}(A_L,\cdots,A_R)=s_R-s_{L-1}\timesB^{R-L+1}\not=0\)。那么也就是\(s_R\not=s_{L-1}\ti......
  • Solution - Atcoder ABC155F Perils in Parallel
    首先可以按\(a_i\)排序,对于区间\([l_i,r_i]\)可以通过二分确定实际影响到的\(b_i\)的区间。考虑到区间\(i\in[l,r]\)的\(b_i\)都取反影响到的元素过多,考虑去减少影响到的元素。于是可以想到令\(c_i=b_i\oplusb_{i-1}\),那么对于区间\([l,r]\)操作实际影响......
  • Atcoder nomura2020F Sorting Game
    首先考虑如果固定了\(a\),如何判定这个\(a\)是否能被排序。如果存在\(a_i>a_j(i<j)\),那么\(a_i\)肯定要交换到\(a_j\)后面,那么就肯定会交换\(a_i,a_j\)。于是合法条件就是如果存在\(a_i>a_j(i<j)\),那么\(a_i,a_j\)只相差一个二进制位。那就还能知道此时一......
  • SpringBoot饮品店管理系统 毕业设计-附源码63617
    摘要随着社会的发展和人们生活水平的提高,饮品店在城市中的数量和规模不断增长。饮品店作为一个重要的零售业态,承载了人们对于饮品的需求和追求,具有广阔的市场潜力。然而,随着饮品店的数量增多和竞争加剧,传统的管理方式已经无法满足日益增长的需求。传统的饮品店管理方式往......
  • AtCoder Regular Contest 041 D 辺彩色
    洛谷传送门AtCoder传送门比较有意思的小清新题。第一步是时光倒流,看成是每次经过一条未被访问过的边才染色。奇偶相关容易想到二分图。发现若有一个黑白交替的奇环(即从一个点开始遍历完整个环得到的颜色序列是黑白交替地),那我们可以先染完这个环。又因为它是奇环,所以我们遍历......