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

AtCoder Beginner Contest 271

时间:2022-10-04 20:33:40浏览次数:81  
标签:AtCoder le Beginner int else 271 now id pl

AtCoder Beginner Contest 271

D - Flip and Adjust

一共有 \(N\) 张牌,每一面都写着一个整数。卡 \(i(1 \le i \le N)\) 前面写着整数 \(a_i\),后面写着整数 \(b_i\)。你可以选择是否放置每张卡片的正面或背面可见。

确定是否可以将卡片放置到可见整数的和完全等于 \(S\) 的位置,如果可能的话,找到卡片的位置来实现这一点。

数据范围:$ 1 \le N \le 100,1 \le S \le 10^4$。

经典小背包方案,不想说了,嗯,就是这样。

Code.

#include<bits/stdc++.h>
using namespace std;
const int N=110,M=1e4+10;
int n,s,a[N],b[N],ans,f[N][M],yl[N],t[N][M];
int main()
{
	scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
	f[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=s;j>=a[i];j--) {f[i][j]|=f[i-1][j-a[i]]; if(f[i-1][j-a[i]]) t[i][j]=1;}
		for(int j=s;j>=b[i];j--) {f[i][j]|=f[i-1][j-b[i]]; if(f[i-1][j-b[i]]) t[i][j]=2;}
	}
	if(! f[n][s]) return puts("No"),0;
	puts("Yes"); int p=s;
	for(int i=n;i;i--) {yl[i]=t[i][p]; if(yl[i] == 1) p-=a[i]; else p-=b[i];}
	for(int i=1;i<=n;i++) if(yl[i] == 1) printf("H"); else printf("T"); puts("");
	return 0;
}

E - Subsequence Path

有 \(N\) 个编号为 \(1,...,N\) 的城镇和 \(M\) 条编号为 \(1,...,M\) 的道路。每条路都有方向; \(i\) 路\((1 \le i \le M)\) 从 \(A_i\) 镇到 \(B_i\) 镇。路 \(i\) 的长度是 \(C_i\)。

给定长度为 \(K\) 的序列 \(E=(E1,...,EK)\),由 \(1\) 到 \(m\) 之间的整数组成。从城镇$ 1$ 到城镇 \(N\) 的道路称为好路径,如果:按照路径中使用的顺序排列的道路的数字序列是 \(E\) 的子序列。

注意,序列的子序列是通过从原始序列中删除 \(0\) 个或多个元素并在不改变顺序的情况下连接其余元素而获得的序列。求一条好路所用道路长度的最小总和。

数据范围:\(2 \le N \le 2 \times 10^5,1 \le C_i \le 10^9\)。

难度诈骗题,简单的思考,如果当前的路 \(i\) 能用,仅当之前有一条路可以走到这条路的起点,且 \(i\) 会影响它到达的终点 \(v\),所以只需要标记这条路的起点是否出现过,如果出现过就更新到达点的答案就可以了。

Code.

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e5+10;
int w[N<<1],d[N],st[N],idx,n,m,k;
struct nod {int u,v,c;} pl[N];
signed main()
{
	memset(d,0x7f,sizeof d); cin>>n>>m>>k; int tmp=d[1];
	for(int i=1,u,v,c;i<=m;i++) {cin>>u>>v>>c; pl[i]={u,v,c};}
	st[1]=1; d[1]=0;
	while(k -- )
	{
		int id; cin>>id;
		if(! st[pl[id].u]) continue ;
		else
		{
			st[pl[id].v]=1; int u=pl[id].v;
			d[u]=min(d[pl[id].u]+pl[id].c,d[u]);
		}
	}
	if(tmp == d[n]) puts("-1"); else cout<<d[n];
	return 0;
}

F - XOR on Grid Path

有一个有 \(N\) 行 \(N\) 列的网格。我们用 \((i,j)\) 表示第 \(i\) 行 \((1 \le i \le N)\) 和第 \(j\) 列\((1 \le j \le N)\) 交点处的数值。点 \((i,j)\) 上面写着一个非负整数 \(a_{i j}\)。

当你在点 \((i,j)\) 处时,你可以移动到点 \((i+1,j)\) 或点 \((i,j+1)\),你不允许走出网格。

求出从点 \((1,1)\) 到点 \((N,N)\) 的路径个数,使所访问的路径上的异或和为 \(0\)。

数据范围:\(2 \le N \le 20\)。

数据范围很小,考虑个暴力,但又不是很暴力的东西,折半搜索。思路很简单,把询问沿对角线拆开,针对上一半的所有路径拿一个二维的哈希表吧到分割点时的异或值全都存下来,一条路径异或和为零,可以理解为上下两半异或值相等,所以下一半从终点向对角线跑,到分割点时加上哈希表已经存储的答案就可以了。

Code.

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=30;
int n,a[N][N],res; unordered_map<int,int> ma[N][N];
void dfs1(int x,int y,int now)
{
	if(x + y == n) return ma[x][y][now]++,void();
	else if(x + y < n) dfs1(x+1,y,now^a[x+1][y]),dfs1(x,y+1,now^a[x][y+1]);
}
void dfs2(int x,int y,int now)
{
	if(x + y == n) return res+=ma[x][y][now^a[x][y]],void();
	else if(x + y > n) dfs2(x-1,y,now^a[x-1][y]),dfs2(x,y-1,now^a[x][y-1]);
}
signed main()
{
	scanf("%lld",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&a[i][j]);
	dfs1(1,1,a[1][1]); dfs2(n,n,a[n][n]);
	printf("%lld",res);
	return 0;
}

标签:AtCoder,le,Beginner,int,else,271,now,id,pl
From: https://www.cnblogs.com/EastPorridge/p/16754392.html

相关文章

  • AtCoder Regular Contest 137 D
    一道很好的题目,运用了很多不同的技巧。结论1:枚举变换次数\(k\),若\(A_{i}\)对答案有贡献,当且仅当\(C_{n-i+k-1}^{k-1}\equiv1\mod2\)。首先我们可以统计\(A_{p}\)对......
  • Atcoder 题目选做
    ABC257G直接考虑\(\rmKMP\)的过程。\(\rmKMP\)可以帮助我们求出\(S\)的\(border\),并找到\(T\)中每一个位置能匹配上的\(S\)的最长前缀。那么我们就可以很......
  • 【合集】AtCoder 比赛题解
    PartAABCABC266(A-Ex)ABC267(A-G)ABC268(A-D)ABC269(A-F)ABC270(D-E)ABC271(C-F)PartBARCARC148(C)......
  • codeforces/AtCoder补题整理
    目录cf1738CEvenNumberAddicts(博弈/记忆化搜索)题意题解cf1739EResetKEdges(树,二分+贪心)题意题解cf1730DPrefixesandSuffixes(字符串,思维)题意题解cf1734DS......
  • AtCoder Beginner Contest 271
    AtCoderBeginnerContest271A-484558题意:把一个数转化为16进制map<int,char>mp;intmain(){ mp[10]='A'; mp[11]='B'; mp[12]='C'; mp[13]='D'; mp[......
  • AtCoder Beginner Contest 271(E,F,G,H)
    一个悲伤的故事。。。ABC271ESubsequencePath考虑设\(f_i\)为以第\(E_i\)条边结束的最优路径,设这条边是\(u_i\tov_i\)边权为\(w_i\)的边,那么转移可以枚举上......
  • AtCoder Beginner Contest 271
    尽量写的高质量一点,只写有意义的题目。C可以像题解一样通过二分来解决本题,这里提供一个桶+双指针的解法。先将书的序号排序,将相同的放在最后(unique函数),用桶维护共有......
  • AtCoder Beginner Contest 271赛后总结
    3.C-Manga题目大意:给出一本书的部分章节(数量n),当我们读取章节时,我们从1开始读并且按照顺序读取,如果某一个章节读取不了,那么就停止。现在我们有一种操作,可以将两个已有......
  • AtCoder Beginner Contest 266
    AtCoder五十连练第三练AtCoderBeginnerContest266D-SnukePanic(1D)高桥正试图抓住许多Snuke。有五个坑在坐标\(0,1,2,3,4\)号线,连接到Snuke的巢。现在,\(......
  • AtCoder ABC 270 题解(D-F)
    AtCoderABC270题解(D-F)D-Stones(博弈DP)题目:​ 现在有一堆石子,一个序列a表示每次可以从石头里拿走多少个石子。当无法再拿出石头的时候,游戏结束。两边都以最佳策略......