首页 > 其他分享 >Codeforces Round 882 (Div. 2)

Codeforces Round 882 (Div. 2)

时间:2023-08-04 19:45:19浏览次数:61  
标签:882 le 吸血鬼 询问 Codeforces DIO 替身 字符串 Div

link

题号:CF1847A~F

A

题意:
给定一个数组 \(\{x_1,x_2,\cdots,x_n\}\) 和一个整数 \(k\),记 \(f(l,r)=\sum_{i=0}^{i < r-l} |x_{l+i}-x_{l+i+1}|\),求将数组划分为 \(k\) 个部分的划分方案,使得对每个部分的 \(f(l,r)\) 之和最小.

题解:

简单题,首先我们注意到,如果将 \(l,l+1\) 隔开,那么 \(|x_l-x_{l+1}|\) 这个数就不会计入答案,那么令 \(b_i=|x_i-x_{i+1}|(i<n)\),那么问题就变为从 \(b\) 中选出最大的 \(k\) 个数减掉。方法很多

        read(n);read(k);int ans=0; 
		for(int i=1;i<=n;i++)read(a[i]);
		for(int i=1;i<n;i++)b[i]=abs(a[i+1]-a[i]);
		sort(b+1,b+n);reverse(b+1,b+n);
		for(int i=k;i<n;i++)ans+=b[i];
		cout<<ans<<"\n";

B

乔纳森正在与迪奥的吸血鬼手下战斗。其中有 \(n\) 个吸血鬼,它们的强度分别为 \(a_1, a_2,\cdots, a_n\)。
将 \((l,r)\) 表示由索引 \(l\) 到 \(r\) 的吸血鬼组成的一组。乔纳森意识到每个这样的组的强度取决于它们的最弱环节,即按位与操作。更具体地说,组 \((l,r)\) 的强度等于 \(f(l,r) =\) \(a_l \ \& \ a_{l+1} \ \& \ a_{l+2} \ \& \cdots \& \ a_r\)。这里,\(\&\) 表示按位与操作。

乔纳森希望能快速击败这些吸血鬼手下,因此他会将吸血鬼分成连续的组,使得每个吸血鬼正好属于一组,并且这些组的强度之和尽量小。在所有可能的分组方式中,他希望找到组数最多的方式。

给定每个吸血鬼的强度,找出在所有可能的分组方式中,拥有最小强度之和的组的最大数量。

题解:

注意到,\(\&\) 肯定是单调不增的。那么显然最小强度之和必定是整个序列 \(\&\) 的值,故本质上问题是从前往后或从后往前找到若干个拼在一起,\(\&\) 和为0的段。

        read(n);int ans=1; 
		for(int i=1;i<=n;i++)read(a[i]);
		k=(1ll<<33ll)-1ll;int cnt=0;
		for(int i=1;i<=n;i++){
			k&=a[i];
			if(k==0){
				k=(1ll<<33ll)-1ll;
				++cnt;
			}
		}
		ans=max(ans,cnt);
		cnt=0,k=(1ll<<33ll)-1ll;
		for(int i=n;i;--i){
			k&=a[i];
			if(!k){
				++cnt;k=(1ll<<33ll)-1ll;
			}
		}
		ans=max(ans,cnt);
		cout<<ans<<"\n";

C

DIO 意识到星尘十字军已经知道了他的位置,并且即将要来挑战他。为了挫败他们的计划,DIO 要召唤一些替身来迎战。起初,他召唤了 $ n $ 个替身,第 $ i $ 个替身的战斗力为 $ a_i $。依靠他的能力,他可以进行任意次以下操作:

  • 当前的替身数量为 \(m\)。
  • DIO 选择一个序号 \(i \text{ } ( 1 \le i \le m )\)。
  • 接着,DIO 召唤一个新的替身,其序号为 \(m+1\),战斗力为 \(a_{m + 1} = a_i \oplus a_{i + 1} \oplus \ldots \oplus a_m\)。其中,运算符 \(\oplus\) 表示按位异或
  • 现在,替身总数就变成了 \(m+1\)。

但对于 DIO 来说,不幸的是,星尘十字军通过隐者之紫的占卜能力,已经知道了他在召唤替身迎战的事情,而且他们也知道初始的 \(n\) 个替身的战斗力。现在,请你帮他们算一算 DIO 召唤的替身的最大可能战斗力(指单个替身的战斗力,并非所有替身战斗力之和)。

题解:

手玩一下,容易发现本质上 \(a_x(x>m)\) 无论怎么选,都必定是 \(a_1\sim a_m\) 的某一个子段的异或值。所以就变成了Trie板子题。

D

给出一个长度为 \(n\) 的字符串 \(s\),字符串仅由 01 构成。

给出 \(m\) 个区间 \([l_i,r_i]\) (\(1\le i\le m\),\(1\le l_i\le r_i\le n\)),你需要将字符串 \(s\) 的子段 \([l_i,r_i]\) 依次拼接,得到新的字符串 \(t\)。

你可以对字符串 \(s\) 进行操作,每次操作可以交换任意两个字符的位置,注意操作不是实际改变,不会影响后续的询问。定义对于字符串 \(s\),\(f(s)\) 表示最小的操作次数,使得拼接得到的新字符串 \(t\) 的字典序最大。

然后有 \(q\) 次询问,每次询问给出一个位置 \(x_i\),表示将原字符串 \(s\) 的 \(x_i\) 位置取反,注意是实际改变,会影响后续的询问。相应的,\(t\) 字符串也会发生改变。你需要求出每次询问后,\(f(s)\) 的值。

E

交互题。 \(n\le 5000\),询问次数不超过 \(500\)。

序列 \(a\) 长为 \(n\),其中 \(1\le a_i\le 4\),每一次询问给出3个 \(i,j,k(i<j<k)\),输入以 \(a_i,a_j,a_k\) 为边长的三角形的面积的平方乘16的结果,特别地,如果构不成三角形,输入0,求这个序列。

F

给定一个无穷长的整数数列的前 \(n\) 项 \(a_1,a_2 \dots a_n\),且对于任意 \(i > n\),\(a_i=a_{i-n}|a_{i-n+1}\).
你需要处理 \(q\) 次询问。每次询问给定一个整数 \(x\),请找出最小的 \(i\) 满足 \(a_i>x\)。如果不存在这样的 \(i\),输出 −1

标签:882,le,吸血鬼,询问,Codeforces,DIO,替身,字符串,Div
From: https://www.cnblogs.com/oierpyt/p/17606837.html

相关文章

  • Codeforces Round 424 (Div. 1)D. Singer House
    传送门显然要自底向上进行\(dp\)深度相同的子树结构相同所以可以利用深度来代表子树。那么就应该统计出有向路径的个数。考虑路径由链所拼成。那么状态里应该有有向链的条数。设\(f_{i,j}\)表示深度为\(i\)链条数为\(j\)的方案数。不选当前的节点则\(f_{i,j}=f_{i+1,k}\cdot......
  • Codeforces 1855B:Longest Divisors Interval 最长的连续约数区间
    1855B.LongestDivisorsIntervalDescription:对于一个整数\(n\)\((1\leqn\leq10^{18})\),找到一段最长的区间\([l,r]\),使得区间内所有数均为\(n\)的约数。Analysis:如果\(n\)是一个奇数(非\(2\)的倍数),由于\(odd=odd\timesodd\),则不可能有连续的两个整数均为......
  • Codeforces Round 449 (Div. 1) D. Nephren Runs a Cinema 卡特兰数
    luogu链接题意不再赘述。优先枚举的应该是\(VIP\)用户,枚举范围应该是\([0,n-l]\)之后总客户数为\(s=n-i\)再考虑枚举\(100\)的总人数为\(x\)则要求\(s-2x\in[l,r]\)这部分方案数应该为从\((0,0)\)到达\((s-x,x)\)且不越过\(y=x\)的方案数。利用折线法求出方案数为\(C(s,x)......
  • Educational 151 DIV2 T3 strong password
    T3strongpassword就是对于输入的每一个\(l,r\),我们遍历\(s[l]~s[r]\),对于每次遍历,我们设置一个临时指针\(cur\),然后通过指针右移寻找所需要的值在外面我们弄两个指针,分别代表每次遍历\([l,r]\)的区间的指针\(nmx\)和全局指针\(mx\)我们用临时指针更新单次区间的......
  • Educational Codeforces Round 38 C- F
    EducationalCodeforcesRound38C-Fhttps://codeforces.com/contest/938今天写出了三题ovoC.ConstructingTests多画几个图就能发现,对于\(n\timesn\)的正方形来说,要使得\(m\timesm\)的子正方形至少有一个\(0\),则最少的\(0\)个数为\(\lfloor\frac{n}{m}\rfloo......
  • 重构之Divergent Change(发散式变化)&Shotgun Surgery (散弹式修改)
    5.DivergentChange发散式变化描述:一个类被锚定了多个变化,当这些变化中的任意一个发生时,就必须对类进行修改。解释:一个类最好只因一种变化而被修改操作:你应该找出某特定原因而造成的所有变化,然后运用ExtractClass将它们提炼到另一个类中。6.ShotgunSurgery散弹式修改描述:一种变化......
  • Educational Codeforces Round 104
    https://codeforces.com/contest/1487A.Arena统计与最小值不同的数字数量。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintM=(1<<15)-1;voidsolve(){intn;cin>>n;vector<int>a(n);for(......
  • Educational Codeforces Round 88
    A.BerlandPoker先尽可能的吧小丑给一个人,在把剩下的小丑尽可能的平分,最后计算差值即可。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m,k,t;cin>>n>>m>>k,t=n/k;inta=min(m,t);m-=a,k--;intb=(m......
  • Codeforces Round 889 (Div. 2) A-E
    传送门,不用谢。A给出排列每次可以交换两个数字,求最少多少次使得排列为错排。考虑在原位的数字个数为\(cnt\)则答案显然为\((cnt+1)>>1\)B求一个最大区间满足其中说有数字被\(n\)整除极其有趣,注意到样例解释具有迷惑性。考虑一个序列\([l,r]\)为答案那么从中可以看出\(1|n......
  • 1853 Round 887 (Div. 2)
    Desorting定义一次操作为选定一个\(i\),令\(a_{1\simi}\)自增,\(a_{i+1\simn}\),自减,求使得整个序列无序的最小操作次数若序列一开始就无序,输出\(0\)否则找到相邻两数差值最小的位置,在这个位置不断使用操作,可以证明这是最优方案#include<bits/stdc++.h>usingna......