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

AtCoder Beginner Contest 359

时间:2024-06-24 13:20:35浏览次数:30  
标签:AtCoder Beginner int cin long ++ x2 x1 359

https://atcoder.jp/contests/abc359/tasks

A - Count Takahashi

void solve() {
	int n;
	cin >> n;

	int ans = 0;
	while (n --){
		string s;
		cin >> s;
		if (s == "Takahashi"){
			ans ++;
		}
	}

	cout << ans << endl;
}

B - Couples
void solve() {
int n;
cin >> n;

	vector<int> a(2 * n);
	for (auto& x : a){
		cin >> x;
	}

	int m = 2 * n;
	int ans = 0;
	for (int i = 0; i < m - 2; ++i){
		if (a[i] == a[i + 2]){
			ans ++;
		}
	}

	cout << ans << '\n';
}

C - Tile Distance 2

题意:给定一个平面,平面内砖块(2 * 1)按一定规则排列,其中x + y是偶数时,代表砖块的左半部分。每次跨越砖块的代价是1, 给定两个2维坐标,问最少的代价。

思路:将x的坐标在砖块内向移动方向靠近,然后求出x和y方向的移动距离。然后x方向专门移动的距离要被y的距离抵消掉一部分,最后分情况讨论x和y方向的移动距离的大小关系即可。

总结:题目有点绕,赛时没注意到坐标为偶数在左边这个条件,硬是根据奇偶性相同来写了很多行代码。其次关于x砖块内移动坐标没有处理好,写的很乱。 算是个小思维题吧,没想清楚。

void solve() { 
	long long x1, x2, y1, y2;
	cin >> x1 >> y1 >> x2 >> y2;

	if (x1 < x2){
		if ((x1 + y1) % 2 == 0){
			x1 ++;
		}
		if (x1 != x2 && ((x2 + y2) & 1)){
			x2 --;
		}
	}
	else if (x1 > x2){
		if ((x1 + y1) & 1){
			x1 --;
		}
		if (x1 != x2 && ((x2 + y2) % 2 == 0)){
			x2 ++;
		}
	}

	long long dis_y = abs(y1 - y2);
	long long dis_x = abs(x1 - x2);

	if (dis_y >= dis_x){
		cout << dis_y << '\n';
	}
	else{
		cout << dis_y + ((dis_x - dis_y) + 1) / 2 << '\n';
	}

}

D - Avoid K Palindrome

题意:给定长度为n的字符串和k,字符串包含'A', 'B', 或'?'。 可以将'?'变为a和b,假设有q个?,则一共有1 << q种字符串。 在字符串中,任意长度为k的子串不是回文串,则该串ok。问所有串中有多少个ok串(k <= 10)。

思路:状压dp,A和B分别作为二进制中的0和1。先预处理前k位,看哪些掩码在s的前k为中符合条件。然后依此从k + 1到第n位开始遍历字符,找到所有合法的转移前的状态,并判断转移后的状态在s中是否合法,递推更新状态计数即可,最后统计数量。

总结:这种题目应该是第二次见,上次做到类似的题目是蓝桥杯的一个统计题,不过那个题目不给出一个模板,而是问所有可能的组合数中的合法元素数量,相较于这个题来说就是少了一些转移条件,不过那个字符串长度有1e5,这个才1000。很经典的题,感谢出题人。

void solve() { 
    int n, k;
    cin >> n >> k;

    string s;
    cin >> s;

    vector<vector<MInt>> dp(n, vector<MInt>(1 << k));
    for (int i = 0; i < (1 << k); ++i){
        if (valid(i, k)){
            bool ok = true;
            for (int j = 0; j < k; ++j){
                if ((s[j] - 'A') != ((i >> j) & 1) && s[j] != '?'){
                    ok = false;
                    break;
                }
            }
            if (ok){
                dp[k - 1][i] = 1;
            }
        }
    }

    for (int i = k; i < n; ++i){
        for (int j = 0; j < (1 << k); ++j){
            if (valid(j, k)){
                if (s[i] == 'A' || s[i] == '?'){
                    if (valid(j >> 1, k)){
                        dp[i][j >> 1] += dp[i - 1][j];
                    }
                }
                if (s[i] == 'B' || s[i] == '?'){
                    if (valid((j >> 1) | (1 << (k - 1)), k)){
                        dp[i][((j >> 1) | (1 << (k - 1)))] += dp[i - 1][j];
                    }
                }
            }
        }
    }

    MInt ans = 0;
    for (int i = 0; i < (1 << k); ++i){
        if (valid(i, k)){
            ans += dp[n - 1][i];
        }
    }

    cout << ans << '\n';
}

有模板写题就是好用,只要维护固定的几个函数即可。
模板放在了下面的仓库,如果使用,请点进去点个star。
https://github.com/yxc-s/programming-template/tree/master
该仓库是一个新仓库,旨在打造一个通用的C++算法编程竞赛模板,包含数据结构,数论等各种实用的算法编程模板。如果您使用的语言不是C++,也可以将对应的代码实现翻译成其他语言来使用。

标签:AtCoder,Beginner,int,cin,long,++,x2,x1,359
From: https://www.cnblogs.com/yxcblogs/p/18263982

相关文章

  • ABC 359
    submissionsA,B直接模拟即可。C纵向的距离很好算。有两种情况:横向距离更小。这个直接输出纵向距离。更大。减去纵向的步数。横向距离怎么算?我们考虑把\(s,e\)都移动到方块靠左,然后就是横坐标之和。D简单的dp。设\(dp_{i,msk}\)为到了第\(i\)为,目前前面的状......
  • ABC359E的有趣解法
    题意:给定一个h序列,对于\(h_i\),找到一个\(j\)满足\(j<i\)且\(h_j>=h_i\),令\(ans_i=h_i*(i-j+1)+ans_j+1\),最后输出ans序列。赛时给了个很魔怔的解法,不知道是不是正解,反正是过了(摊手)我们可以开一个idx数组,将h[i]从小到大排序后将其原下表存入idx数组,这样我们从前......
  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359(3/6)A-CountTakahashiProblemStatementYouaregivenNNNstrings.Thei......
  • AtCoder Beginner Contest 359
    A-CountTakahashi(abc359A)题目大意给定\(n\)个字符串,问有多少个字符串是Takahashi解题思路注意判断比较即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)
    A-CountTakahashi(abc359A)解题思路遍历判断即可神奇的代码#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<map>#include<set>#include<cstring>usingnamespacestd;#defineendl'\n......
  • ABC359 G - Sum of Tree Distance
    题目链接题目大意给出一棵树,树上每个节点都有一种颜色,求所有颜色相同的节点两两之间距离的总和。 题解想来写题解主要是看了一下官方解法都写的需要“重心分解”,应该是对应中文语境下的树的点分治。实际上点分治写起来很费事,可以用启发式合并替代。具体来说,dfs时每个节点......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • abc359_G Sum of Tree Distance 题解
    题目链接:Atcoder或者洛谷先考虑暴力,显然是枚举整棵树的路径,这个枚举复杂度显示是\(O(n^2)\),还不考虑计算\(f(i,j)\),考虑使用点分治优化枚举复杂度:\(O(n\log{n})\)。接下来考虑如何计算每条路径的\(f(i,j)\),注意到\(f(i,j)\):当且仅当\(a[i]=a[j]\)时,答案加上\(dis(i,j......
  • AtCoder Beginner Contest 359 解题报告
    AtCoderBeginnerContest359吐槽:A-F还算正常,G题你tm给我放了个出过的板子(ABC340G)是几个意思啊???ASimulate.#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineendl'\n'#definePBemplace_back#definePPBpop_back#defineMPmake_pai......
  • AtCoder ABC 358
    比赛链接A-WelcometoAtCoderLandAC_Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){strings,t;cin>>s>>t;if(s=="AtCoder"&&t=="Land")co......