Codeforces 884 简要题解
A题
传送门
题意简述:
一个人要完成一件事总共需要ttt秒,现在有nnn天,每天有aia_iai不能做事,问他可以在第几天做完。
思路:按照题意模拟。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
const int N=105;
int n,t,a[N];
int main(){
n=read(),t=read();
for(ri i=1;i<=n;++i){
t-=(86400-read());
if(t<=0)return cout<<i,0;
}
return 0;
}
B题
传送门
题意:给一个长度为xxx的010101串,有nnn段分开的连续的111,长度分别为a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an,现在问你是否只存在一种010101串构造方式满足条件。
思路:按照题意模拟。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
const int N=105;
int n,x,a[N];
int main(){
n=read(),x=read();
int sum=-1;
for(ri i=1;i<=n;++i)sum+=read()+1;
puts(sum==x?"YES":"NO");
return 0;
}
C题
传送门
题意:给你nnn个点组成的有向环森林,最多可以对两条边进行操作,使得(u,v)(u,v)(u,v)变成(u,v′)(u,v')(u,v′),操作之后需要保证还是有向环森林,每个环贡献是环上点个数的平方,问最后得到的贡献最大值。
思路:用并查集搞一下,然后把最大的两个环并起来即可。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef long long ll;
const int N=1e5+5;
int n,a[N],siz[N],anc[N];
inline int find(const int&x){return x^anc[x]?anc[x]=find(anc[x]):x;}
int main(){
n=read();
for(ri i=1;i<=n;++i)anc[i]=i,siz[i]=1;
for(ri i=1;i<=n;++i){
int fx=find(read()),fy=find(i);
if(fx^fy){
anc[fx]=fy,siz[fy]+=siz[fx];
}
}
vector<int>sum;
for(ri i=1;i<=n;++i){
if(i^anc[i])continue;
sum.push_back(siz[i]);
}
sort(sum.begin(),sum.end());
if(sum.size()==1)return cout<<(ll)sum[0]*sum[0],0;
ll ans=0;
for(ri i=sum.size()-3;~i;--i)ans+=(ll)sum[i]*sum[i];
ans+=(ll)(sum[sum.size()-1]+sum[sum.size()-2])*(sum[sum.size()-1]+sum[sum.size()-2]);
cout<<ans;
return 0;
}
D题
传送门
题意:有nnn种不同颜色的球和nnn个盒子,个数分别为a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an,现在这些球全部被放在第一个盒子里面。
你每次可以从一个盒子里面拿出所有的球,然后分到两个或者三个盒子里面,最后要求第iii种颜色的球全部装在第iii个盒子里面,每次拿球的代价为拿的个数,问总代价最小值。
思路:
考虑逆向思考,就变成了合并果子,显然如果能把3个合并就合并三个,只剩两个就只合并两个。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef long long ll;
const int N=2e5+5;
int n,cnt[N];
ll ans=0,sum[N];
priority_queue<ll,vector<ll>,greater<ll> >q;
int main(){
n=read();
for(ri i=1;i<=n;++i)q.push(read());
if(n==n/2*2)q.push(0);
while(q.size()>1){
ll a=q.top(),b=0,c=0,d;
q.pop();
if(!q.empty())b=q.top(),q.pop();
if(!q.empty())c=q.top(),q.pop();
d=a+b+c;
ans+=d;
q.push(d);
}
cout<<ans;
return 0;
}
E题
传送门
题意:给一个n∗mn*mn∗m的010101矩阵n≤212,m≤214n\le2^{12},m\le2^{14}n≤212,m≤214,问111的连通块数,空间限制16MB16MB16MB。
思路:显然不能开一个二维数组,需要一行一行的模拟,因此可以用并查集合并自己左方和上方的格子。
答案=1=1=1的个数−-−成功合并次数。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1<<14|5;
char s[N];
int n,m,ans=0,f[N<<1],g[N];
inline int trans(const char&x){return isdigit(x)?x^48:x-'A'+10;}
inline int getf(int x){
if(x<0||x>m-1)return 0;
return trans(s[x/4])>>(3-x%4)&1;
}
inline int find(const int&x){return x^f[x]?f[x]=find(f[x]):x;}
inline void merge(int x,int y){
int fx=find(x),fy=find(y);
fx^fy?f[fx]=fy,--ans:0;
}
int main(){
scanf("%d%d",&n,&m);
memset(f,-1,sizeof(f));
for(ri i=0;i<n;++i){
scanf("%s",s);
for(ri j=0;j<m;++j)g[j]=getf(j);
for(ri j=0;j<m;++j)g[j]?++ans,f[j+m]=j+m:f[j+m]=-1;
for(ri j=0;j<m;++j){
if(!g[j])continue;
if(~f[j])merge(j,j+m);
if(getf(j-1))merge(j+m-1,j+m);
}
for(ri j=0;j<m;++j)f[j]=g[j]?find(j+m)-m:-1;
}
cout<<ans;
return 0;
}
F题
传送门
题意:对于一个长度为偶数的字符串SSS,如果满足Si≠Sn−i+1S_i =\not S_{n-i+1}Si≠Sn−i+1那么称其为反回文串。
现在要将一个字符串SSS重新排列成一个反回文串TTT,每个位置对应一个权值aia_iai,TTT的价值等于∑Si==Tiai\sum\limits_{S_i==T_i}a_iSi==Ti∑ai,求得到的价值最大值。
思路:
考虑上费用流。
把所有的字母和位置拿出来建图匹配即可。
这篇博客写的很不错
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=50005,M=200005;
char s[N];
int n,m,ans=0,a[N],b[N],cnt[N];
namespace mcmf{
int d[N],flow[N],pos[N],pred[N],s,t,first[N],cnt,F=0;
bool in[N];
struct edge{int v,next,c,w;}e[M];
inline void init(){memset(first,-1,sizeof(first)),cnt=-1,s=0,t=n+26+n*13+1;}
inline void addedge(const int&u,const int&v,const int&c,const int&w){e[++cnt]=(edge){v,first[u],c,w},first[u]=cnt;}
inline void add(const int&u,const int&v,const int&c,const int&w){addedge(u,v,c,w),addedge(v,u,0,-w);}
inline bool bfs(){
static int q[N],hd,tl;
for(ri i=s;i<=t;++i)d[i]=-0x3f3f3f3f,flow[i]=0x3f3f3f3f;
d[q[hd=tl=1]=s]=0,in[s]=1;
while(hd<=tl){
int x=q[hd++];
in[x]=0;
for(ri i=first[x],v;~i;i=e[i].next){
if(e[i].c&&d[x]+e[i].w>d[v=e[i].v]){
d[v]=d[x]+e[i].w,pred[v]=x,pos[v]=i,flow[v]=min(flow[x],e[i].c);
if(!in[v])q[++tl]=v,in[v]=1;
}
}
}
if(d[t]==-0x3f3f3f3f)return 0;
int p=t;
F+=flow[t]*d[t];
while(p^s)e[pos[p]].c-=flow[t],e[pos[p]^1].c+=flow[t],p=pred[p];
return 1;
}
}
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline int idx(int a,int b){return n+26+a*n/2+b;}
int main(){
n=read(),scanf("%s",s+1);
mcmf::init();
for(ri i=1;i<=n;++i)++cnt[a[i]=s[i]-'a'],b[i]=read(),mcmf::add(i,mcmf::t,1,0);
for(ri i=0;i<26;++i)mcmf::add(mcmf::s,i+1+n,cnt[i],0);
for(ri i=0;i<26;++i){
for(ri j=1;j<=n/2;++j){
mcmf::add(i+1+n,idx(i,j),1,0);
mcmf::add(idx(i,j),j,1,a[j]==i?b[j]:0);
mcmf::add(idx(i,j),n-j+1,1,a[n-j+1]==i?b[n-j+1]:0);
}
}
while(mcmf::bfs());
cout<<mcmf::F;
return 0;
}
Codeforces 884 简要题解的更多相关文章
- Codeforces 863 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...
- Codeforces 381 简要题解
做的太糟糕了...第一题看成两人都取最优策略,写了个n^2的dp,还好pre-test良心(感觉TC和CF的pretest还是很靠谱的),让我反复过不去,仔细看题原来是取两边最大的啊!!!前30分钟就 ...
- Codeforces 1120 简要题解
文章目录 A题 B题 C题 D题 E题 F题 传送门 A题 传送门 题意简述:给你一个mmm个数的数列,现在规定把一个数列的1,2,...,k1,2,...,k1,2,...,k分成第一组,把k+1, ...
- Codeforces 1098 简要题解
文章目录 前言 A题 B题 C题 D题 E题 传送门 前言 没错因为蒟蒻太菜了这场的最后一道题也咕掉了,只有AAA至EEE的题解233 A题 传送门 题意简述:给出一棵带点权的树,根节点深度为111, ...
- Codeforces 1110 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 众所周知ldxoildxoildxoi这种菜鸡选手是不会写HHH题的,因此该篇博客只有AAA题至GGG题的题解,实在抱歉. A题 传送门 题 ...
- Codeforces 380 简要题解
ABC见上一篇. 感觉这场比赛很有数学气息. D: 显然必须要贴着之前的人坐下. 首先考虑没有限制的方案数.就是2n - 1(我们把1固定,其他的都只有两种方案,放完后长度为n) 我们发现对于一个限制 ...
- Codeforces 845 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意:2n2n2n个人下棋,分为两个阵营,每个阵营nnn个人,每个人有一个积分,积分高的能赢积分低的,问如果你可以随意选人,然 ...
- Codeforces 1065 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 GGG题略难,膜了一波zhouyuyang{\color{red} zhouyuyang}zhouyuyang巨佬的代码. 其余都挺清真的. ...
- Codeforces 888 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意简述:给一个数列,问有多少个峰值点(同时比两边都大/小的点) 思路:按照题意模拟. 代码: #include<bit ...
随机推荐
- 深入理解BERT Transformer ,不仅仅是注意力机制
来源商业新知网,原标题:深入理解BERT Transformer ,不仅仅是注意力机制 BERT是google最近提出的一个自然语言处理模型,它在许多任务 检测上表现非常好. 如:问答.自然语言推断和 ...
- springCloud面试题
1.SpringCloud和Dubbo SpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务解决方案Dubbo是阿里系的分布式 ...
- P61 实践作业
网络攻防实验环境搭建 根据链接下载的实验工具包,将其解压 打开VM虚拟机,点击图中红色框,扫描虚拟机 选择文件所在位置 点击下一步,完成.即可 在VM虚拟机设置中把网络适配器修改为桥接模式.如下图 在 ...
- for循环 && for-each
Effective Java 第46条for-each循环优先于传统for循环 问题: 使用for循环来遍历集合或者是数组可以借助迭代器和索引变量.但是,如果出现循环嵌套的时候很容易引起混乱. 例如: ...
- LocalDate的使用
LocalDate的一些使用方法 今天半天的时间都用在了LocalDate上,然后呢,也是自己的第一次写博客. 首先来看看会用上的方法吧. 两个构造器,用的是静态工厂方法 static Local ...
- Java框架spring Boot学习笔记(五):Spring Boot操作MySQL数据库增、删、改、查
在pom.xml添加一下代码,添加操作MySQL的依赖jar包. <dependency> <groupId>org.springframework.boot</grou ...
- UNIX网络编程(卷1)——学习过程中遇到的新词语
第2章 传输层:TCP.UDP.SCTP TCP Trasmission Control Protocol 传输控制协议 UDP User Datagram Protocol 用户数据报协议 SCTP ...
- 简单的页面互点Javascript代码
简单的页面互点Javascript代码,可以适用于前端$(function(){ $('.ip_b_con_item li,.pro_index_list li').mouseover(functio ...
- jq动画设置图片抽奖
(因为自己是前端刚入门的小白所以中间出现很多问题,不过这对于我来说就是一次经验的积累) 预想效果:点击"开始",图片循环旋转,不是同时的效果,而是有一定的时间差.点击"开 ...
- synchronized 同步函数的竞争关系验证
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码 ...