首页 > 其他分享 >Educational Codeforces Round 157 (Rated for Div. 2) - VP 记录

Educational Codeforces Round 157 (Rated for Div. 2) - VP 记录

时间:2024-11-13 11:32:42浏览次数:1  
标签:Educational Rated 157 int sum nd len trie include

Preface

啊啊啊为什么我老是被简单题卡啊!

image

A. Treasure Chest

A 题题面这么长吓我一跳。

分类讨论,钥匙在前面可以拿了钥匙直接到箱子那里;箱子在前面就尽量把箱子往钥匙搬,让折回的距离尽量小。

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;

int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		int x,y,k; scanf("%d%d%d",&x,&y,&k);
		if(y<=x) printf("%d\n",x);
		else
		{
			x=min(x+k,y);
			printf("%d\n",y+(y-x));
		}
	}
	return 0;
}

B. Points and Minimum Distance

所求为曼哈顿距离,途中肯定不能走回头路(所以需要排序),所以距离只与起点和终点的坐标有关。

把点位排个序然后以前一半为横坐标,后一半为纵坐标,这样可以让起点和终点的曼哈顿距离最小且不走回头路。

证明不来,打出来发现样例对了我就直接交了,详细证明可以在这里找找,有好几篇有详细证明的。

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;

const int N=105;
int n,a[N<<1];

int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n<<1;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+(n<<1)+1);
		printf("%d\n",(a[n]-a[1])+(a[n<<1]-a[n+1]));
		for(int i=1;i<=n;i++)
			printf("%d %d\n",a[i],a[n+i]);
	}
	return 0;
}

C. Torn Lucky Ticket

不知道是什么做法的题。

因为位数较小,所以可以对于每个数都枚举位数并查找和。

具体来说,设 \(c(i,j)\) 表示长度为 \(i\),和为 \(j\) 的数的数量。

对于某个数 \(x\),设长度为 \(len_x\),\(sum_x(i)\) 表示 \(i\) 个数位的和。

如果 \(x\) 要和在左侧拼上一个 \(y\) ,设 \(x\) 的右边 \(i\) 位要作为新数的右边部分,那么 \(x\) 左边还剩下 \((len_x-i)\) 位,新数左右两侧数位数量相等,所以 \(len_y+(len_x-i)=i\),解得 \(len_y=i-(len_x-i)\)。

此时右半部分的和为 \(sum_x(i)\),左侧剩下 \(sum_x(len_x)-sum_x(i)\),所需 \(y\) 的数位总和就为 \(sum_x(i)-(sum_x(len_x)-sum_x(i))\)。

所以此时合法的 \(y\) 的数量就为:

\[c ( i-(len_x-i), sum_x(i)-(sum_x(len_x)-sum_x(i)) ) \]

同理,要在 \(x\) 右边拼上一个 \(y\),合法的 \(y\) 的数量就为:

\[c ( (len_x-i)-i, (sum_x(len_x)-sum_x(i))-sum_x(i) ) \]

所以答案就为:

\[\sum_{x=1}^{n}\left( \sum_{i=1}^{len_x} c(i-(len_x-i), sum_x(i)-(sum_x(len_x)-sum_x(i))) + \sum_{i=1}^{len_x} c((len_x-i)-i, (sum_x(len_x)-sum_x(i))-sum_x(i)) \right) \]

化简一下(\(sum_x\) 表示 \(sum_x(len_x)\)):

\[\sum_{x=1}^{n} \sum_{i=1}^{len_x} (c(2i-len_x,2sum_x(i)-sum_x)+c(len_x-2i,sum_x-sum_x(i))) \]

#include<cstdio>
using namespace std;

const int N=2e5+5;
int n,a[N];
int cnt[15][105];
int num[N][10],sum[N][10],len[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		int t=a[i];
		while(t)
		{
			num[i][++len[i]]=t%10; t/=10;
			sum[i][len[i]]=sum[i][len[i]-1]+num[i][len[i]];
		}
		cnt[len[i]][sum[i][len[i]]]++;
	}
	long long ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=len[i];j++)
		{
			//sum[j]=?+(sum[len]-sum[j]); j=?+(len-j)
			int nd_len=j-(len[i]-j),nd_sum=sum[i][j]-(sum[i][len[i]]-sum[i][j]);
			if(nd_len>0&&nd_sum>0) ans+=cnt[nd_len][nd_sum];
		}
		for(int j=1;j<=len[i];j++)
		{
			//sum[j]+?=sum[len]-sum[j]; j+?=len-j
			int nd_len=(len[i]-j)-j,nd_sum=(sum[i][len[i]]-sum[i][j])-sum[i][j];
			if(nd_len>0&&nd_sum>0) ans+=cnt[nd_len][nd_sum];
		}
	}
	printf("%lld\n",ans);
	return 0;
}

D. XOR Construction

好题。

如果知道了 \(b_1\) 其它的 \(b\) 也都能一下推出来(\(b_i=b_{i-1} \oplus a_{i-1}\))。

枚举 \(b_1\),通过二进制建立 \(a\) 前缀异或和的 01-Trie,插入 \(b_1\) 查找最大异或值,判断是否小于 \(n\) 即可。

这里有很多我这种做法的详解。

#include<cstdio>
#include<bitset>
using namespace std;

const int N=2e5+5,LogN=20;
int n,a[N],sum[N],b[N];

int trie[N<<1][2],idx=1;
void insert(bitset<LogN+5> x)
{
	int p=1;
	for(int i=LogN;i>=0;i--)
	{
		bool t=x[i];
		if(!trie[p][t]) trie[p][t]=++idx;
		p=trie[p][t];
	}
	return;
}
bool check(bitset<LogN+5> x)
{
	int p=1,now=0;
	for(int i=LogN;i>=0;i--)
	{
		bool t=x[i];
		if(trie[p][!t]) //可以异或出1 
		{
			p=trie[p][!t];
			now=(now<<1)+1;
		}
		else
		{
			p=trie[p][t];
			now=(now<<1)+0;
		}
	}
	return now<n;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]^a[i];
		insert(sum[i]);
	}
	for(b[1]=0;b[1]<n;b[1]++)
		if(check(b[1])) break;
	printf("%d ",b[1]);
	for(int i=2;i<=n;i++)
		printf("%d ",sum[i-1]^b[1]);
	return 0;
}

标签:Educational,Rated,157,int,sum,nd,len,trie,include
From: https://www.cnblogs.com/jerrycyx/p/18543344

相关文章

  • Educational Codeforces Round 80 (CF1288)
    EducationalCodeforcesRound80(CF1288)A.Deadline题意给出正整数\(n,d\),求不等式\(x+\lceil\frac{d}{x+1}\rceil\len\)是否有非负整数解。思路先不考虑上取整,\[x+\frac{d}{x+1}=x+1+\frac{d}{x+1}-1\ge2\sqrtd-1\]当且仅当\(x+1=\frac{d}{x+1}\)即\(......
  • Educational Codeforces Round 158 (Rated for Div. 2) - VP记录
    A.LineTrip油量必须支持车子通过所有加油站间的空间,还要注意开回来的时候终点不能加油。点击查看代码#include<cstdio>#include<algorithm>usingnamespacestd;constintN=55;intn,x,a[N];intmain(){ intT;scanf("%d",&T); while(T--) { scanf("%d%d",&am......
  • Educational Codeforces Round 144 (Rated for Div. 2) C. Maximum Set
    我们要选出最长的子序列,使得每一个数都是前一个数的倍数。因此自然我们可以想到选择最小值然后每次乘\(2\)。所以有\(l\times2^k\ler\),即\(k=\left\lfloor\log_2\frac{r}{l}\right\rfloor\)。所以最大的集合大小就是\(k+1\)。然后考虑最大的集合中最小值可能不同,我假设......
  • 每日OJ题_牛客_BC157素数回文_数学_C++_Java
    目录牛客_BC157素数回文_数学题目解析C++代码Java代码牛客_BC157素数回文_数学素数回文_牛客题霸_牛客网描述:现在给出一个素数,这个素数满足两点:1、  只由1-9组成,并且每个数只出现一次,如13,23,1289。2、  位数从高到低为递减或递增,如2459,87631。请你判断一下,这......
  • 第二届教育发展与社会科学国际学术会议 (EDSS 2025) The 2nd International Conferen
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz三、大会介绍第二届教育发展与社会科学国际学术会议(EDSS2025)定于2025年1月17-19日在中国上海举行。会议旨在为从事“教育”与“社会科学......
  • Educational Codeforces Round 159 (Rated for Div. 2) - VP记录
    Preface重点策略:\[\large\textbf{\underline{先写简单好写的算法,再逐步修改优化}}\]十分有效,百试百灵,屡试不爽。A.BinaryImbalance当有相邻两字符不相等时,就可以不断向中间插入0。所以输出NO当且字符串全为1。点击查看代码#include<cstdio>usingnamespacestd;......
  • DB157S-ASEMI小贴片整流桥DB157S
    编辑:llDB157S-ASEMI小贴片整流桥DB157S型号:DB157S品牌:ASEMI封装:DBS-4特性:贴片桥堆正向电流:1.5A反向耐压:1000V恢复时间:>2000ns引脚数量:4芯片个数:4芯片尺寸:50MIL浪涌电流:50A漏电流:>10uA工作温度:-55℃~150℃包装方式:3k/盘;30k/箱备受欢迎的DB157S整流桥ASEMI品牌DB157......
  • 洛谷P1157 组合的输出(Python)
    伤痕,是男子汉的勋章。——圣斗士星矢一、题目P1157组合的输出https://www.luogu.com.cn/problem/P1157二、代码defpri(L):foriinrange(len(L)):ifL[i]==True:print("{:3d}".format(i),end='')defdfs(n,r,cur,count):#n,r为题......
  • Educational Codeforces Round 161 (Rated for Div. 2) - VP记录
    Preface先被A题硬控\(20\)分钟,有点不爽。又看到E题AC的人比D题多而去嗑E题去了,结果D题反而是我更能做的。将问题排序:根据你所需付出的努力,将能够最快解决的问题排在前面。(答题的次序为:以前做过的,容易的,不熟悉的,难的)——李博杰《骗分导论》\(\rmP_{114}\)所以......
  • Educational Codeforces Round 171 (Rated for Div. 2) 题解
    A.PerpendicularSegments显然构造一个\(k\timesk\)的左下角是原点的正方形即可。voidslv(){ intx,y,k;Read(x,y,k); intmn=min(x,y); if(mn*mn*2>=k*k) Write(0,'',0,'',mn,'',mn,'\n'), Write(0,......