AtCoder Regular Contest 125

传送门

A−DialUpA-Dial UpADialUp 贪心贪心

首先当bbbaaa没有的元素的时候显然无解,否则我们可以找到离a1a_1a1最近的一个!a1!a_1!a1,让后交替着来构造bbb即可。

int n,m;
int a[N],b[N];int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);int ans=0;scanf("%d%d",&n,&m);int dx,dy,dxx,dyy; dx=dy=dxx=dyy=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]),dx+=a[i]==1,dy+=a[i]==0;for(int i=1;i<=m;i++) scanf("%d",&b[i]),dxx+=b[i]==1,dyy+=b[i]==0;dx=dx>0; dy=dy>0; dxx=dxx>0; dyy=dyy>0;if(dx<dxx||dy<dyy) {puts("-1");return 0;}ans+=m;int change=0;for(int i=2;i<=m;i++) if(b[i]!=b[i-1]) change++;if(a[1]==b[1]) {int cnt=INF;for(int i=2;i<=n;i++) if(a[i]!=a[1]) {cnt=min(cnt,i-1);cnt=min(cnt,n-i+1);}if(change) {ans+=cnt,ans+=change-1;if(cnt==INF) ans=-1;} } else {int cnt=INF;for(int i=2;i<=n;i++) if(a[i]!=a[1]) {cnt=min(cnt,i-1);cnt=min(cnt,n-i+1);}ans+=cnt;ans+=change;if(change&&cnt==INF) ans=INF; }printf("%d\n",ans);return 0;
}

B−SquaresB-SquaresBSquares 数学+推式子数学 + 推式子+

考虑题面中的式子就是x2−y=z2x^2-y=z^2x2y=z2,其中x∈[1,1012]x\in [1,10^{12}]x[1,1012],也就是找x2x^2x2减去一个[1,1012][1,10^{12}][1,1012]内的数仍是一个平方数,由于得到的平方数都≤x2\le x^2x2,所以我们不妨先看看(x−1)2(x-1)^2(x1)2,化开就是x2−(2x−1)x^2-(2x-1)x2(2x1),此时y=2x−1y=2x-1y=2x1,当xxx取遍若干值的时候,也就是数列1,3,5,...1,3,5,...1,3,5,...,就是找这个数列中≤n\le nn的数有多少个,这个是等差数列显然可以O(1)O(1)O(1)算。让后再看(x−2)2=x2−(4x−4)(x-2)^2=x^2-(4x-4)(x2)2=x2(4x4),此时y=4x−4y=4x-4y=4x4,数列就是4,8,12,...4,8,12,...4,8,12,...,依次找下去,可以发现就找以i2i^2i2开头,2i2i2i为公差的等比数列,有多少个≤n\le nn的数,由于首项是平方的形式,显然可以n\sqrt nn枚举来算。

还可以将初始的式子移项,也就是x2−z2=yx^2-z^2=yx2z2=y,由于y∈[1,n]y\in [1,n]y[1,n],所以x2−z2≤nx^2-z^2\le nx2z2n,换句话就是求[0,1,4,9,...,n2][0,1,4,9,...,n^2][0,1,4,9,...,n2]这个数列中,有多少对不同的数差≤n\le nn,将其差分之后得到[1,3,5,...][1,3,5,...][1,3,5,...],也就是差分后的数列中有多少段非空区间的和≤n\le nn,让后根据区间长度不同,可以分成[1,3,5,...],[4,8,12,...],[9,15,21,...][1,3,5,...],[4,8,12,...],[9,15,21,...][1,3,5,...],[4,8,12,...],[9,15,21,...]这些区间跟上面的分析一样。

复杂度O(n)O(\sqrt n)O(n)

	LL n; cin>>n;LL ans=0;for(LL i=1;;i++) {LL a=i*i;if(a>n) break;LL d=i*2;ans+=(n-a)/d+1;ans%=mod;}cout<<ans<<endl;

C−LIStoOriginalSequenceC-LIS to Original SequenceCLIStoOriginalSequence 贪心+构造贪心 + 构造+

考虑为什么这个东西一定有解,我们找个例子,比如n=5,k=2,a1=3,a2=5n=5,k=2,a_1=3,a_2=5n=5,k=2,a1=3,a2=5,我们可以构造3,2,1,5,43,2,1,5,43,2,1,5,4,也就是在ai,ai+1a_i,a_i+1ai,ai+1之间以递减的方式填上[ai+1,ai+1−1][a_i+1,a_{i+1}-1][ai+1,ai+11]这个区间中的数,显然这样一定可以构造出一个答案,下面考虑字典序最小。

我们上面实际上就是将其分成了kkk块,每块只能选一个,我们依旧是按照这个思想来,考虑a1a_1a1之后最小的数能填多少?如果a1a_1a1不是111的话,显然我们可以将111放在a1a_1a1的后面,这个是最优的,一旦放了别的数,显然是没有这个优。但是我们放了111之后,还能放别的吗?显然也是不能的,因为如果放了别的显然能将最长上升序列变长,所以我们就得到了这个题的做法,在每个数后面尝试放第一个小于它的并且没有被选择的数,最后的时候直接递减的输出没有选择的数即可。

int n,k;
int a[N],st[N];int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d%d",&n,&k);for(int i=1;i<=k;i++) scanf("%d",&a[i]);int j=1;for(int i=1;i<k;i++) {printf("%d ",a[i]);st[a[i]]=1;while(st[j]) j++;if(j<a[i]) {st[j]=1;printf("%d ",j++);}}for(int i=n;i>=1;i--) if(!st[i]) printf("%d ",i);return 0;
}

D−UniqueSubsequenceD-Unique SubsequenceDUniqueSubsequence 树状数组+dp树状数组+dp+dp

考虑dpdpdp,设f[i]f[i]f[i]表示前iii个能构成答案的子序列有多少,不难发现不合法的子序列是因为出现了相同的数,比如说2,1,12,1,12,1,12,12,12,1这个子序列就是不合法的。所以需要将每个数分开来看,假设当前到了iii,上一次出现aia_iai的位置是preprepre,那么我们显然可以从[pre,i−1][pre,i-1][pre,i1]这些位置转移过来,也就是在这些状态的子序列末尾加上aia_iai,这样是合法的。对于[1,pre−1][1,pre-1][1,pre1]这些位置的状态显然是不能转移过来的,因为f[pre]f[pre]f[pre]这个位置已经包含了[1,pre−1][1,pre-1][1,pre1]这些位置后面加aia_iai的方案数了,正如前面的例子2,1,12,1,12,1,1f[1]=1,f[2]=2f[1]=1,f[2]=2f[1]=1,f[2]=2,对于f[3]f[3]f[3]如果我们从f[2]f[2]f[2]转移会得到[2,1,1],[1,1][2,1,1],[1,1][2,1,1],[1,1]这两个序列,如果我们再从f[1]f[1]f[1]转移过来会得到[2,1][2,1][2,1]这个序列,这个显然不合法,应该舍去。

经过上面的讨论,我们需要实现区间求和以及单点修改的数据结构,显然树状数组即可胜任。

注意某个数字第一次出现的时候需要加一,因为可能只选他一个。

int n;
int a[N];
int pre[N],last[N];
LL tr[N];void add(int x,LL c) {c+=mod; c%=mod;for(int i=x;i<=n;i+=lowbit(i)) (tr[i]+=c)%=mod;
}LL sum(int x) {LL ans=0;for(int i=x;i;i-=lowbit(i)) (ans+=tr[i])%=mod;return ans;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);pre[i]=last[a[i]];last[a[i]]=i;}LL ans=0;for(int i=1;i<=n;i++) {LL now;if(pre[i]) {now=(sum(i)-sum(pre[i]-1))%mod; now+=mod; now%=mod;add(pre[i],-(sum(pre[i])-sum(pre[i]-1)));} else now=(sum(i)+1)%mod;add(i,now);}printf("%lld\n",sum(n));return 0;
}

E−SnackE-SnackESnack 网络流转最小割+贪心+推公式网络流转最小割 + 贪心 + 推公式++

考虑经典网络流建图:

我们规定SSS为源点,TTT为汇点,XXX为左部点,YYY为右部点。

(1)S−>X(1)S->X(1)S>X,容量为aia_iai

(2)X−>Y(2)X->Y(2)X>Y,对于左部的每个点与右部的每个点都连边,设右部的某个点为jjj,容量为bjb_jbj

(3)Y−>T(3)Y->T(3)Y>T,容量为cjc_jcj

建图是n2n^2n2的,而且也没有什么优化的地步,由于这个图的性质比较特殊,我们不妨转换成最小割来求,也就是割掉边权总和最少的边使其不连通。

先考虑第一类边,假设我们割掉xxx条,由于我们割那条边与我们右边割的代价是互相独立的,所以我们只需要关注切掉了多少条边,也就是可以贪心的切掉aia_iai最小的xxx条边。

对于第二类边和第三类边,他们剩下了n−xn-xnx条与YYY相连的第二类边以及mmm条与TTT相连的第三类边,想要不连通只能割掉第二类和第三类其中的一类边,也就是min((n−i)∗bi,ci)min((n-i)*b_i,c_i)min((ni)bi,ci)。我们按照cibi\frac{c_i}{b_i}bici排序,当n−in-ini增大的时候,一定是一部分取cic_ici,一部分取(n−i)∗bi(n-i)*b_i(ni)bi,用一个指针维护一下即可,或者可以偷懒写个二分。

int n,m;
LL a[N],prec[N],preb[N];struct Node {LL b,c;bool operator < (const Node &W) const {return c*W.b<W.c*b;}
}node[N];int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int i=1;i<=m;i++) scanf("%lld%",&node[i].b);for(int i=1;i<=m;i++) scanf("%lld%",&node[i].c);sort(node+1,node+1+m);sort(a+1,a+1+n); for(int i=1;i<=m;i++) {prec[i]=prec[i-1]+node[i].c;preb[i]=preb[i-1]+node[i].b;}LL ans=inf,pre=0,suma=0;for(int i=1;i<=n;i++) suma+=a[i];for(int i=0,j=0;i<=n;i++) {		pre+=a[i];int l=0,r=m,anss;while(l<=r) {int mid=(l+r)>>1;if(node[mid].c<=node[mid].b*(n-i)) anss=mid,l=mid+1;else r=mid-1;}LL now=prec[anss]+(preb[m]-preb[anss])*(n-i)+pre;ans=min(ans,now);}cout<<ans<<endl;return 0;
}

F−TreeDegreeSubsetSumF-Tree Degree Subset SumFTreeDegreeSubsetSum 貌似是个性质题 待补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core on K8S深入学习(3)Deployment

上一篇《部署过程解析与安装Dashboard》中我们了解K8S的部署过程&#xff0c;这一篇我们来了解一下K8S为我们提供的几种应用运行方式&#xff1a;Deployment、DaemonSet与Job&#xff0c;它们是Kubernetes最重要的核心功能提供者。考虑到篇幅和更新速度&#xff0c;我将其分为两…

Codeforces Round #742 (Div. 2) F. One-Four Overload 构造 + 二分图染色

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个n∗mn*mn∗m的矩形&#xff0c;包含...和XXX&#xff0c;你有两种颜色&#xff0c;你需要给...染色使得每个XXX上下左右相邻的...其两种颜色个数相同&#xff0c;输出一种合法方案。 1≤n,m≤5001\l…

同余最短路(P3403 跳楼机)

同余最短路 前置 给定m个数&#xff0c;这m个数可以重复取&#xff0c;问最大的这m个数不能拼成的数&#xff0c;或者给定一定范围&#xff0c;范围里有多少个数是这m个数可以拼成的&#xff0c;对于这种问题我们可以考虑同余最短路的算法。 P3403 跳楼机 同余最短路介绍 …

8月语言排行:C#继续呈现增长态势

TIOBE 编程语言排行榜 8 月更新已公布&#xff0c;排名前十的分别是&#xff1a;Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, Objective-C 和 SQL。和上个月唯一的不同之处在于 Objective-C 和 SQL 的排名发生了交换。事实上&#xff0c;上周 Dice Insights …

Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个序列aaa&#xff0c;你需要实现两种操作&#xff1a; (1)(1)(1) 将[l,r][l,r][l,r]的aia_iai​都乘rrr。 (2)(2)(2) 求ϕ(∏ilrai)mod1e97\phi(\prod_{il}^ra_i)\bmod 1e97ϕ(∏ilr​ai​)mod1e97 1…

P2662 牛场围栏(同余最短路)

P2662 牛场围栏 思路 假设我们已经知道同余最短路是什么了&#xff0c;这里就不再过多赘述。 我们要尽可能地得到更多地课建成地边&#xff0c;那么我们必然要选一个basebasebase相对小的&#xff0c;因此我们可以对所有的棍子排个序&#xff0c;然后取a[1]−ma[1] - ma[1]−…

面试必谈的哈希,.Net 程序员温故而知新

引言&#xff1a;作为资深老鸟&#xff0c;有事没事&#xff0c;出去面试&#xff1b;找准差距、定位价值。面试必谈哈希&#xff0c;Q1&#xff1a;什么是哈希?Q2&#xff1a;哈希为什么快?Q3&#xff1a;你是怎么理解哈希算法利用空间换取时间的&#xff1f;Q4&#xff1a;…

P3804 【模板】后缀自动机 (SAM)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个字符串sss&#xff0c;让你求sss中出现次数不为111的子串出现次数乘上该字串长度最大值。 ∣s∣≤1e6|s|\le 1e6∣s∣≤1e6 思路&#xff1a; 没学明白&#xff0c;不多bbbbbb&#xff0c;把树建出…

Grpc Proto To Nuget Package 插件使用说明

Grpc Proto To Nuget Package 是一个 VS 插件&#xff08;支持 VS2019&#xff09;&#xff0c;目的是将基于 gRPC 的接口定义 .proto 文件一键转成 Nuget Package&#xff0c;然后发布到私有仓库上。下载最新 GrpcProtoToNugetPackageTemplate.zip ASP.NET 的项目模板&#xf…

HDU 6071 Lazy Running(同余最短路的应用)

Lazy Running 思路 还是利用同余的思想&#xff0c;假设存在一条长度为kkk的路&#xff0c;那么也一定存在一条kbasek basekbase的路base2∗min(d1,d2)base 2 * min(d1, d2)base2∗min(d1,d2)。 dis[i][j]xdis[i][j] xdis[i][j]x表示的是&#xff0c;从2−>i2 -> i2…

P2408 不同子串个数 SAM

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求sss中本质不同的字串个数。 1≤∣s∣≤1e51\le |s|\le 1e51≤∣s∣≤1e5 思路&#xff1a; 显然&#xff0c; 个数就是∑(len[i]−len[fa[i]])\sum (len[i]-len[fa[i]])∑(len[i]−len[fa[i]])。 //#pr…

.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新

.NET Core 3.0 Preview 7现已推出&#xff0c;它包含一系列ASP.NET Core和Blazor的新更新。以下是此预览中的新功能列表&#xff1a;最新的Visual Studio预览包括.NET Core 3.0作为默认运行时Visual Studio中的顶级ASP.NET核心模板简化的网页模板组件的属性splattingTypeConver…

数列分块入门 (1 ~ 7)

分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块&#xff0c;所以我们总共的块数就是n/mn / mn/m块&#xff0c;一般情况下我们取mnm \sqrt{n}mn​.对于区间加操作&#xff0c;我们可以先暴力左右两边&#xff0c;然后对于中间的整块的部分的加减&#xff0c;…

UVA719 Glass Beads 最小表示 / 后缀自动机

传送门 题意&#xff1a; 求sss的最小表示。 ∣s∣≤1e4|s|\le 1e4∣s∣≤1e4 思路&#xff1a; 可以选择直接套最小表示法的板子&#xff0c;但也可以将sss复制&#xff0c;即ssssssssssss&#xff0c;对ssssss建samsamsam&#xff0c;让后贪心的找一个长度为nnn的字典序最…

你必须知道的Docker数据卷

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff08;微信上暂无法访问&#xff0c;可以通过cnblogs博客园访问&#xff09;&#xff0c;可以点击查看更多容器化技术相关系列文章。本篇预计阅读时间为5分钟。01—Docker数据挂载到容器在Docker中&#xff0c;要想实…

牛客小白月赛11:Rinne Loves Data Structure

Rinne Loves Data Structure 思路 我们插入的位置大概分了四种&#xff1a; 第一种 显然我们找到比当前插入的值的pre&#xff0c;也就是比当前节点大的最小值。 第二种 我们只要找到当前节点的suc&#xff0c;也就是比当前节点小的&#xff0c;最大值。 第三种 我们只…

Harbour.Space Scholarship Contest 2021-2022 E. Permutation Shift 思维 + 剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个初始排列[1,2,3,...,n][1,2,3,...,n][1,2,3,...,n]&#xff0c;你可以选择一个kkk&#xff0c;将这个排列循环右移kkk次&#xff0c;让后最多交换mmm次任意的两个位置之间的数&#xff0c;将其变成给…

VS Code 1.37 发布!多达数十个图标迎来全新设计

今天&#xff08;北京时间 2019 年 8 月 9 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.37 版本。此版本主要更新的内容包括&#xff1a;Full product icon refresh - 多达数十个图标迎来全新的现代化设计Edit string arrays in the Settings UI - 在配置编辑器…

欧拉筛模板

欧拉筛模板 const int N 1e5 10;vector<int> prime; bool st[N];void init() {st[0] st[1] 1;for(int i 2; i < N; i) {for(int j 0; j < prime.size() && i * prime[j] < N; j) {st[i * prime[j]] 1;if(i % prime[j] 0) break;}} }

Serilog 自定义 Enricher 来增加记录的信息

Serilog 自定义 Enricher 来增加记录的信息IntroSerilog 是 .net 里面非常不错的记录日志的库&#xff0c;结构化日志记录&#xff0c;而且配置起来很方便&#xff0c;自定义扩展也很方便Serilog is a diagnostic logging library for .NET applications. It is easy to set up…