首页 > 其他分享 >ABC 365

ABC 365

时间:2024-08-10 10:16:19浏览次数:3  
标签:std ABC int long 365 using include dp

赛时通过:A、B、C。

赛后补题:D、E。

A

依题判断即可。

#include<bits/stdc++.h>
using namespace std;
int y;
int main(){
	cin>>y;
	if(y%4!=0) cout<<365;
	if(y%4==0&&y%100!=0) cout<<366;
	if(y%100==0&&y%400!=0) cout<<365;
	if(y%400==0) cout<<366;
}

B

排序即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e2+5;
int n;
pair<int,int> a[N];

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].first,a[i].second=i;
	sort(a+1,a+n+1);
	cout<<a[n-1].second;
	return 0;
}

C

显然 \(x\) 越大,总费用越大,具有单调性。二分即可求出最大的 \(x\)。

当 $ \sum a_i > M$ 时,\(x\) 便可无限大。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=2e5+5;
int n,m,a[N];

bool check(int x){
	int s=0;
	for(int i=1;i<=n;i++) s+=min(x,a[i]);
	return s<=m;
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	int s=0;
	for(int i=1;i<=n;i++) cin>>a[i],s+=a[i];
	if(s<=m) cout<<"infinite",exit(0);
	int l=0,r=m+1;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(check(mid)) l=mid;
		else r=mid;
	}
	cout<<l;
	return 0;
}

D

首先贪心是错误的。详情见这份 Hack https://atcoder.jp/contests/abc365/editorial/10601 (https://atcoder.jp/contests/abc365/editorial/10601)。

然后考虑 dp。因为过于简单,所以具体细节见代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=2e5+5;
int n;
string s;
int dp[N][3];
//0/1/2:R/P/S
//R->S S->P P->R

signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>s,s="#"+s;
	if(s[1]=='R')
		dp[1][0]=0,
		dp[1][1]=1,
		dp[1][2]=-1e9;
	else if(s[1]=='P')
		dp[1][0]=-1e9,
		dp[1][1]=0,
		dp[1][2]=1;
	else
		dp[1][0]=1,
		dp[1][1]=-1e9,
		dp[1][2]=0;
	for(int i=2;i<=n;i++){
		if(s[i]=='R')
			dp[i][0]=max(dp[i-1][1],dp[i-1][2]),
			dp[i][1]=max(dp[i-1][0],dp[i-1][2])+1;
		else if(s[i]=='P')
			dp[i][1]=max(dp[i-1][0],dp[i-1][2]),
			dp[i][2]=max(dp[i-1][0],dp[i-1][1])+1;
		else
			dp[i][0]=max(dp[i-1][1],dp[i-1][2])+1,
			dp[i][2]=max(dp[i-1][0],dp[i-1][1]);
	}
	cout<<max({dp[n][0],dp[n][1],dp[n][2]});
}

E

灵茶八题 T3。

看到异或运算,考虑二进制拆位。

考虑异或的一个性质:

\[S_r \oplus S_{l-1} = \oplus ^ {r} _ {i=l} A_i \]

其中:

\[S_i=\oplus ^ {i} _ {j=1} A_j \]

(这是因为,\(S_r\) 与 \(S_{l-1}\) 的相同部分会被消去)

于是,我们求出 \(S\) 数组(\(n+1\) 位),其中第 \(0\) 位是为了提取长度为 \(1\) 的子数组。

能提取出一个子数组,当且仅当 \(S_r\) 与 \(S_{l-1}\) 的某一位的异或值为 \(1\),不然这俩的贡献就是 \(0\)。

考虑二进制拆位。对于 \(S\) 数组中的每一位,只有两位分别是 \(0,1\) 时,才会有贡献。

于是我们统计出每一位中 \(1\) 的个数 \(x\),则 \(0\) 的个数即为 \(n+1-x\),通过乘法原理计算可得贡献即为 \((n+1-x) \times x\),再乘上 \(2^j\) 即为当前位的贡献,累加即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=2e5+5,M=31;
int n,ans;
int a[N],s[N];

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i],s[i]=s[i-1]^a[i];
	}
	int ans=0;
    for(int j=0;j<31;j++){
        int cnt=0;
        for(int i=0;i<=n;i++) cnt+=s[i]>>j&1; 
		ans+=(cnt)*(n+1-cnt)*(1<<j);
    }
    for(int i=1;i<=n;i++) ans-=a[i];
    cout<<ans;
	return 0;
}

标签:std,ABC,int,long,365,using,include,dp
From: https://www.cnblogs.com/XOF-0-0/p/18352000

相关文章

  • AT_abc208_d 题解
    题目传送门做完这道题后感觉对Floyd的理解更深了。根据题面要求,设\(f(k,i,j)\)表示从\(i\)到\(j\)的所有只经过\(1\simk\)的点的所有路径的最短距离。很明显\(k\)那一维是阶段,因为它描述了从\(i\)到\(j\)路径中的不同点,而我们就是根据这一条件来划分集合,这......
  • 【题解】ABC365(A~E)
    前四题30min切,然后T5死磕70min+几发小唐错,距离比赛结束还有16s交最后一发,AC了。目录A.LeapYear题目描述思路代码B.SecondBest题目描述思路代码C.TransportationExpenses题目描述思路代码D.AtCoderJanken3题目描述思路代码E.XorSigmaProblem题目描述思路代码A.Lea......
  • ABC349D题解
    [ABC349D]DivideInterval题解传送门:luogu|atcoder题目简述给定非负整数\(l\)和\(r\)(\(l<r\)),令\(S(l,r)\)表示序列\((l,l+1,\ldots,r-2,r-1)\),其中包含从\(l\)到\(r-1\)的所有整数。此外,一个序列被称为“好序列”,当且仅当它可以表示为\(S(2^ij,2^{i}(j+1))\),......
  • ABC349D题解
    [ABC349D]DivideInterval题解传送门:luogu|atcoder题目简述给定非负整数$l$和$r$($l<r$),令$S(l,r)$表示序列$(l,l+1,\ldots,r-2,r-1)$,其中包含从$l$到$r-1$的所有整数。此外,一个序列被称为“好序列”,当且仅当它可以表示为$S(2^ij,2^{i}(j+1))$,其中$i$和$j$......
  • ABC365F Takahashi on Grid 题解
    ##题目大意有一个网格图,对于$i=1,2,\dotsn$,第$i$列的$[L_i,U_i]$上的单元格是可到达的,形如下面这张图。![](https://img.atcoder.jp/abc365/4d07a40c98eda33ee86b773e564681c7.png)图中对于$i=1,2,\dots7$,$[L_i,U_i]$分别为:```15331311142435```......
  • AtCoder Beginner Contest 365(A~E)
    AtCoderBeginnerContest365(A~E)A问题陈述给你一个介于\(1583\)和\(2023\)之间的整数\(Y\)。求公历\(Y\)年的天数。在给定的范围内,\(Y\)年的天数如下:如果\(Y\)不是\(4\)的倍数,则为\(365\)天;如果\(Y\)是\(4\)的倍数,但不是\(100\)的倍数,则为\(366......
  • AtCoder Beginner Contest 365(4/7)
    比赛链接:https://atcoder.jp/contests/abc365solve:ABC开头:感觉好久没打abc了,这场被D单防了qwq,该好好练练dp了A.LeapYear思路:签到题,闰年判断代码:#include<bits/stdc++.h>usingi64=longlong;voidsolve(){intn;std::cin>>n;if(n%400==0){......
  • Atcoder ABC299 E-G
    AtcoderABC299E-GE-NearestBlackVertex链接:E-NearestBlackVertex(atcoder.jp)简要题意:问题陈述给你一个简单连接的无向图,有\(N\)个顶点和\(M\)条边(简单图不包含自循环和多条边)。在\(i=1,2,\ldots,M\)中,\(i\)-th边双向连接顶点\(u_i\)和......
  • AtCoder Beginner Contest 365
    AtCoderBeginnerContest365A-LeapYear给出年份,判断这一年有多少天闰年条件已经给出,逐条判断模拟即可。#include<iostream>usingnamespacestd;intmain(){inty;cin>>y;if(y%400==0||y%4==0&&y%100!=0)cout<<366<<endl;else......
  • 【全网首发】2024华数杯数学建模ABC题选题分析+解题思路代码+成品论文更新
    建议选哪道题?A题特点:数理分析题目此题难度较大与国赛难度较为贴近B题特点B题以运筹学/网络科学,图论、优化问题为主,涉及到的概念多,对基础要求较高,不建议优先选择。常用MATLAB函数例如toposort(有向无环图的拓扑顺序)、isomorphism(计算两个图之间的同构)、centrality(衡量节点......