当前位置: 首页 > news >正文

Codeforces 1049 Div2(ABCD)

前言

这c题太神秘了,一直在wa3绷不住了……

一、A. Shift Sort

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;void solve()
{int n;cin>>n;string s;cin>>s;int cnt=0;for(int i=0;i<n;i++){if(s[i]=='1'){cnt++;}}int ans=0;for(int i=n-cnt;i<n;i++){//cout<<i<<endl;if(s[i]=='0'){ans++;}}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

这个题因为选择的是任意的三个位置移动,那么可以考虑每次在左侧选择一个“1”,然后在右侧选择一个“0”。那么之后只要在这俩位置的中间随便选一个“0”,就可以用一次左移操作,把左侧的“1”移到右边。所以,假如一共有cnt个“1”,那么在排完序后最右侧cnt个位置上应该都是“1”。所以,只要在最后cnt个位置上的“0”都应该被换到前面去。所以可以想到,只需要每次把后面占了“1”位置的“0”换到前面去,把前面的“1”换过来即可。所以代码就可以是找遍历一遍求“1”的词频cnt,然后因为从n-cnt开始往后应该都是“1”,所以就是统计这个范围上的“0”的数量即可。

二、B. Another Divisibility Problem

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;void solve()
{ll x;cin>>x;cout<<2*x<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

这个伞兵构造题是真的有病……

直接说结论吧,注意到只要让y等于2x,那么一定可以有x和y拼起来是x+y的整数倍。

(这b结论真的逆天,我都佩服我自己赛时居然能注意到这个结论……)

三、C. Ultimate Value

现在这是怎么了……思路都能出来,一落实到代码上就老是写不对,不是想着贪心就是想着构造,连最基础的遍历求最大都想不到了……

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;void solve()
{ll n;cin>>n;vector<ll>a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}ll init=0;for(int i=1;i<=n;i++){if(i%2==1){init+=a[i];}else{init-=a[i];}}ll ans=init;if(n%2==1){ans+=n-1;}else{ans+=n-2;}ll even=1e18;ll odd=1e18;for(int i=1;i<=n;i++){if(i%2==1){ans=max(ans,init+i-a[i]-a[i]-even);odd=min(odd,i+a[i]+a[i]);}else{ans=max(ans,init+i+a[i]+a[i]-odd);even=min(even,i-a[i]-a[i]);}}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

首先可以考虑什么情况游戏会停止,因为cost是会累积的,所以在Alice第一次操作完之后,假如Bob进行了操作,那么在下一轮轮到Alice时,Alice可以直接模仿上一轮Bob的操作把数组改回来。这样操作之后,此时数组和Alice第一次操作完后一样,但由于进行了两次操作,所以cost是会增加的。所以只要Bob不终止游戏,那么Alice永远可以通过模仿Bob的操作无脑把cost刷上去。所以对于Bob来说,最优的选择就是在第一次轮到自己时直接终止游戏,此时f(a)的值就是最小的。

所以,之后就要考虑Alice如何在第一次操作时把f(a)更新得最大。那么这里可以分情况讨论,首先就是奇数位的两数互换和偶数位的两数互换,此时由于两数同号,所以只会增加cost而不会改变数组的结果。那么为了让答案最大,肯定选最后一个数和第一个数交换。那么若n是奇数,选的肯定是1位置和n位置的数交换,cost增加n-1。否则选的就是2位置和n位置的数,cost增加n-2。之后,就需要考虑位置奇偶性不同的两数交换,从而既增加cost又增加数组的结果。假如初始时数组的结果为init,那么对于每个奇数位置i,如果和前面某个位置j交换,那么增加的部分就是i-j-a[i]-a[i]+a[j]+a[j],通过加减两次将结果修正对。之后考虑将i和j分开算,就有i-a[i]-a[i]-j+a[j]+a[j],也就是i-a[i]-a[i]-(j-a[j]-a[j])。所以为了让增加的部分最大,就需要将后面j-a[j]-a[j]最小。类似地,对于每个偶数位置i,就有i-j+a[i]+a[i]-a[j]-a[j],那么就是让j+a[j]+a[j]最小。所以考虑设置odd和even两变量分别存前缀里奇数和偶数位置上的最小值,那么每次若来到奇数位置,就去看i-a[i]-a[i]-even能否把ans更新得更大,偶数位置类似,再更新odd或even即可。

四、D. A Cruel Segment's Thesis

这题的思路也挺逆天的……

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;void solve()
{int n;cin>>n;vector<pll>a(n+1);for(int i=1;i<=n;i++){cin>>a[i].first>>a[i].second;}//b[i].first:l+r//b[i].second:a[i]vector<pair<ll,pll>>b(n+1);for(int i=1;i<=n;i++){b[i].second=a[i];b[i].first=a[i].first+a[i].second;}sort(b.begin()+1,b.end(),[&](pair<ll,pll>x,pair<ll,pll>y){return x.first<y.first;});//先统计一遍原始线段长度和ll ans=0;for(int i=1;i<=n;i++){ans+=a[i].second-a[i].first;}//偶数if(n%2==0){//加一遍rfor(int i=1;i<=n;i++){ans+=a[i].second;}//减一半最小的l+rfor(int i=1;i<=n/2;i++){ans-=b[i].first;}cout<<ans<<endl;}//奇数else{//1,2,……,n/2,n/2+1,……,n-1,nll k=0;ll w=0;//加一遍rfor(int i=1;i<=n;i++){w+=a[i].second;}//减一半向上取整个最小的l+rfor(int i=1;i<=n/2+1;i++){w-=b[i].first;}//统计前一半里去掉哪个l的结果最大//如果留下的线段来自前n/2+1个线段时的增益for(int i=1;i<=n/2+1;i++){k=max(k,w+b[i].second.first);}//把最中间的l+r加回来//此时w为减去前n/2个线段的l+rw+=b[n/2+1].first;//统计后一半里去掉哪个r的结果最大for(int i=n/2+1;i<=n;i++){k=max(k,w-b[i].second.second);}cout<<ans+k<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

首先不难发现,不管怎么标记,答案里总有所有线段的长度和。之后可以发现,当n为偶数时,那么此时所有线段都会被选中一次,从而产生额外的贡献。那么就有一半的线段会被选中使用其左边界,一半使用其右边界。那么额外的贡献就是最大一半的右边界减去最小一半的左边界。那么转化一下,这个额外的贡献的最大值,可以先计算所有线段的右边界的累加和,然后将每条线段的左右边界之和l+r从小到大排序,再减去最小的一半,答案就是最大的额外贡献。

n为偶数的好想,但若n为奇数,那么就必然有一个线段被留到最后,那么就需要讨论是哪条被留到了最后。假如n/2向下取整是down,向上取整是up,那么由于减的时候是减去最小的down个l+r,所以首先可以去看看这条线段是否是在这最小的down个里面。所以方法可以是,先设置w为加一遍右边界的累加和,再减去最小的up个l+r的结果。因为正确的结果应该是最大的down个r减去最小的down个l,所以这样操作就会导致有一个l被多减了一次。所以就去讨论前up个l+r里,把哪个l加回来会使结果更大,这个l就是要留到最后的那条线段。统计完以后,要让w加上第up个l+r,那么此时就会导致有个r被多加了一次。所以之后去后半部分讨论把哪个r减去可以使结果更大,那么这个r就是留到最后的那条线段。所以最后的结果k就是最大的额外贡献。

总结

思维还是要活跃一点,不能固化了……

END


文章转载自:

http://wnVSL25Y.qmqgx.cn
http://aiQ78Yce.qmqgx.cn
http://6mxgiLUh.qmqgx.cn
http://ZfG4FvMX.qmqgx.cn
http://J0zMkJBP.qmqgx.cn
http://byzbXF8L.qmqgx.cn
http://y3hWVyqP.qmqgx.cn
http://jeQ709AD.qmqgx.cn
http://8Y4NM58n.qmqgx.cn
http://J4H2Wxly.qmqgx.cn
http://8EXhiDNo.qmqgx.cn
http://Y0B4M9PK.qmqgx.cn
http://J0hUPrXG.qmqgx.cn
http://zPSLef59.qmqgx.cn
http://BNGK7UAr.qmqgx.cn
http://S73M9aHn.qmqgx.cn
http://QIruPmZe.qmqgx.cn
http://9VJvkAOk.qmqgx.cn
http://iBddybLp.qmqgx.cn
http://LMCkwmlP.qmqgx.cn
http://yKAQt2ei.qmqgx.cn
http://HiNn5Lv5.qmqgx.cn
http://tqkiiF8T.qmqgx.cn
http://PIoywCWm.qmqgx.cn
http://KqcXPT7C.qmqgx.cn
http://Bgbouevr.qmqgx.cn
http://sqIs7zy6.qmqgx.cn
http://gyewVG9p.qmqgx.cn
http://3ArEVzCM.qmqgx.cn
http://FO7a8Ojm.qmqgx.cn
http://www.dtcms.com/a/383108.html

相关文章:

  • 【开题答辩全过程】以 “居逸”民宿预订微信小程序为例,包含答辩的问题和答案
  • AWS IAM 模块全面优化:实现完整生命周期管理与性能提升
  • RK3568 PWM驱动基础知识
  • 贪心算法应用:钢铁连铸优化问题详解
  • 9. LangChain4j + 整合 Spring Boot
  • 返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践
  • React Native架构革命:从Bridge到JSI性能飞跃
  • Qt---描述网络请求QNetworkRequest
  • XLua教程之Lua调用C#
  • 第七章:AI进阶之------条件语句(if-elif-else)(一)
  • 从希格斯玻色子到QPU:C++在高能物理与量子计算领域的跨界征程与深度融合
  • 二、vue3后台项目系列——安装相关依赖、项目常用辅助开发工具
  • Knockout.js 备忘录模块详解
  • VS2022下载+海康SDK环境配置实现实时预览
  • 前端基础 —— C / JavaScript基础语法
  • 手搓一个 DELL EMC Unity存储系统健康检查清单
  • 字节M3-Agent:如何实现一个支持多模态长期记忆与推理的Agent
  • TCL华星计划投建第8.6代印刷OLED产线
  • Qt学习:moc生成的元对象信息
  • Java—JDBC 和数据库连接池
  • 软件工程实践四:MyBatis-Plus 教程(连接、分页、查询)
  • 用 Go 快速上手 Protocol Buffers
  • Java Stream 流学习笔记
  • Linux线程id与简易封装线程实现
  • 公链分析报告 - Secret Network
  • JavaScript 简单链表题目试析
  • 【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
  • 电商AI导购系统的模型部署架构:TensorFlow Serving在实时推荐中的实践
  • 光射三缝实验
  • K8s部署 Redis 主从集群