首页 > 其他分享 >AtCoder Regular Contest 066(缺d)

AtCoder Regular Contest 066(缺d)

时间:2025-01-12 20:10:51浏览次数:1  
标签:AtCoder 066 int long 括号 arc066 Regular bigoplus dp

\(AT\_arc066\_a\)
https://www.luogu.com.cn/problem/AT_arc066_a
题解:长度为\(n\)的队列,其\(A\)数组固定,直接判断题目给定\(A\)数组是否符合题意即可。若符合题意,答案为\(2^{\frac{n}{2}}\),否则答案为\(0\)。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int N=1e5+10,P=1e9+7;

int n;
int cnt[N];

int qpow(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=(LL)res*a%P;
		a=(LL)a*a%P;
		b>>=1;
	}
	return res;
}

int main(){
	cin >> n;
	for(int i=1; i<=n; i++){
		int x;
		cin >> x;
		cnt[x]++;
	}
	bool flag=1;
	for(int i=1-(n%2); i<=n-1; i+=2){
		if(i&&cnt[i]!=2) flag=0;
		if(!i&&cnt[i]!=1) flag=0;
	}
	if(!flag) cout << 0 << endl;
	else cout << qpow(2,n/2) << endl;
	return 0;
}

\(AT\_arc066\_b\)
https://www.luogu.com.cn/problem/AT_arc066_b
题解:设\(u=a\bigoplus b,v=a+b\)。
引理\(1\):若只考虑满足\(a\& b=a\)的\((a,b)\)可保证答案不重不漏。
证明:移项得\(a=u\bigoplus b,v=b+u\bigoplus b\),观察式子\(b+u\bigoplus b\),发现对于\(u\)的二进制表示为\(1\)的位,\(b\)的取值对\(v\)无影响,于是钦定\(u\& b=u\)或钦定\(u\& b=0\)都可以保证不重不漏,这里钦定\(u\& b=u\),那么\(a=u\bigoplus b\),可得\(a\& b=a\),证毕。
接下来考虑枚举\(v\),令\(f(v)\)表示所有满足条件且\(v_1<=v\)的\((u_1,v_1)\)个数,考虑将当前\(a,b\)的最后一位去掉,由钦定条件\(a\& b=a\)知\(a,b\)最后一位只有可能是\((0,0),(0,1),(1,1)\),于是有\(f(v)=f(\frac{v}{2})+f(\frac{v-1}{2})+f(\frac{v-2}{2})\)。
引理\(2\):按\((0,0),(0,1),(1,1)\)划分的三子集内,不会出现相同的\((u,v)\)。
证明:反证法。假设在不同子集内出现相同的\((u,v)\),首先考虑\(v\)的奇偶性,于是只有\((0,0),(1,1)\)可能出现相同\((u,v)\)。由于\(1+1\)的进位,为保证下一位\(v\)的奇偶仍然相同,下一位只有可能是\((0,0),(0,1)\)或者\((0,1),(1,1)\),那么\(u=a\bigoplus b\)的条件就不满足了,证毕。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int P=1e9+7;

map<int,int> f;

int dp(int n){
	if(!n) return 1;
	if(f.count(n)) return f[n];
	return f[n]=(dp(n/2)+dp((n-1)/2)+dp((n-2)/2))%P;
}

signed main(){
	int n;
	cin >> n;
	f[0]=1,f[1]=2;
	cout << dp(n) << endl;
	return 0;
}

\(AT\_arc066\_c\)
https://www.luogu.com.cn/problem/AT_arc066_c
题解:先探究性质。
性质\(1\):括号只会出现在减号之后,这是因为加号之后的括号是可去的。
性质\(2\):不会出现相邻的括号对,这是因为括号间有符号才有意义。
性质\(3\):括号只会嵌套两层。考虑形如\(a_1-(a_2-(a_3-(a_4)))=a_1-a_2+a_3-a_4=a_1-(a_2-a_3)-(a_4)\),所以三层以上嵌套都可被简化为\(1\)层或\(2\)层括号。
考虑\(dp\),令\(f(i,j)\)为前\(i\)位,当前有\(j\)个未匹配的左括号的最大价值,考虑转移。
转移\(1\):当前不加括号,\(f(i,j)=f(i-1,j)\pm a_i\),\(a_i\)前符号根据原符号以及当前嵌套的括号数决定。
转移\(2\):加一个左括号,\(f(i,j)=f(i-1,j-1)\pm a_i\),\(a_i\)前符号根据当前嵌套的括号数决定。
转移\(3\):加一个右括号,\(f(i,j)=f(i-1,j+1)\pm a_i\),\(a_i\)前符号根据原符号以及当前嵌套的括号数决定。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N=1e5+10;

int n;
int a[2*N],f[N][3];
char s[2*N];

signed main(){
	cin >> n;
	for(int i=1; i<=2*n-1; i++)
		if(i%2) cin >> a[i];
		else cin >> s[i];
	for(int i=0; i<=n; i++)
		for(int j=0; j<=2; j++) f[i][j]=-1e18;
	f[0][0]=0;
	for(int i=1; i<=n; i++)
		for(int j=0; j<=2; j++){
			int cnt=j+(s[2*i-2]=='-');
			if(cnt%2) f[i][j]=max(f[i][j],f[i-1][j]-a[2*i-1]);
			else f[i][j]=max(f[i][j],f[i-1][j]+a[2*i-1]);
			if(s[2*i-2]=='-'&&j){
				cnt=j;
				if(cnt%2) f[i][j]=max(f[i][j],f[i-1][j-1]-a[2*i-1]);
				else f[i][j]=max(f[i][j],f[i-1][j-1]+a[2*i-1]);
			}
			if(j<2){
				cnt=j+1+(s[2*i-2]=='-');
				if(cnt%2) f[i][j]=max(f[i][j],f[i-1][j+1]-a[2*i-1]);
				else f[i][j]=max(f[i][j],f[i-1][j+1]+a[2*i-1]);
			}
		}
	cout << max(f[n][0],max(f[n][1],f[n][2])) << endl;
	return 0;
}

\(AT\_arc066\_d\)
https://www.luogu.com.cn/problem/AT_arc066_d

标签:AtCoder,066,int,long,括号,arc066,Regular,bigoplus,dp
From: https://www.cnblogs.com/lastxuans/p/18651749

相关文章

  • atcoder 388 b-e题
    binclude<bits/stdc++.h>usingnamespacestd;/**@brief主函数,程序入口@returnint返回值为0,表示程序正常结束*/intmain(){//输入数组长度n和天数dintn,d;cin>>n>>d;//定义一个vector,用于存储输入数据vector<pair<int,int>>a(n);//输入数组a的元......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......
  • Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
    CountArrays:一眼秒的计数题。思路显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是\(1\),就会形成一个基环树森林。那么考虑这个环上能填什么数。因为所有数都小于等于他后面的数,所以所有数都只能相等。这就启发我们在基环树上缩点之后再进行计数。那么当缩完点......
  • AtCoder Beginner Contest 388 (abc388) 赛后复盘
    为什么不会E????A-B模拟即可。C每一个大麻薯可以和所有小于等于自己\(\frac12\)的麻薯结合,二分即可。时间复杂度\(O(n\logn)\)。点击查看代码#include<bits/stdc++.h>#definelllonglong#definei128__int128#definemem(a,b)memset((a),(b),sizeof(a))#def......
  • HHKB Programming Contest 2025(AtCoder Beginner Contest 388)
    A-?UPC题意:给你一个字符串,把他的第一个字符和"UPC"输出。输出即可。点击查看代码voidsolve(){std::strings;std::cin>>s;std::cout<<s[0]<<"UPC\n";}B-HeavySnake题意:n条蛇由厚度和长度,重量为厚度乘长度,问长度加上1~k时,最大的蛇的重量分别......
  • AtCoder Beginner Contest 387
    A-HappyNewYear2025题意给定正整数\(A,B\),求\((A+B)^2\)思路模拟代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ inta,b; cin>>a......
  • VP UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 38
    A-Equally题意:给你三个数,判断能不能分成大于一组后每组和相等。只可能分成两个和一个或者三组一个的。点击查看代码voidsolve(){inta,b,c;std::cin>>a>>b>>c;if((a==b&&b==c)||(a+b==c)||(b+c)==a||(a+c)==b){ s......
  • Atcoder ABC329E Stamp 题解 [ 绿 ] [ 线性 dp ]
    Stamp:难点主要在dp转移的细节与分讨上,但通过改变状态设计可以大大简化分讨细节的题。观察首先要有一个观察:只要某一个前缀能被覆盖出来,那么无论它后面多出来多少,后面的字符串都可以帮他重新覆盖回去。这也就是dp为啥没有后效性的原因。除此之外,还要注意一个字符串不仅能在......
  • VP AtCoder Beginner Contest 387
    A-HappyNewYear2025按题意输出即可。点击查看代码voidsolve(){inta,b;std::cin>>a>>b;std::cout<<(a+b)*(a+b)<<"\n";}B-9x9Sum直接遍历累加满足不等于x的数即可,注意这个九九乘法表是9*9的矩阵,不是我们学的下三角。点击查看......
  • 组会PPT_Learning Representations from Imperfect Time Series Data via Tensor Rank
    系列博客目录文章目录系列博客目录参数解释:下图就是一个简单的多模态图片,图像的金毛和文本的金毛,一起被模型学习,嵌入一个公共的隐空间。什么是秩?张量秩是描述张量可以通过多少个较低阶张量的乘积来表示。先说一下矩阵的秩,比如A,他的秩为2,因为100这个向量无......