这场cf时间特别好,周六下午,于是就打了打(谁叫我永远1800上不去div1)

比以前div2的题目更均衡了,没有太简单和太难的...好像B题难度高了很多,然后卡了很多人。

然后我最后做了四题,E题感觉不会太难就是切不下来,还好前面几题A的快居然混了个RANK6,然后+204,终于上到紫名了......

---------我是分割线君

A.Snacktower

有一个1到n的全排列,按顺序每一秒会到达一个数,你要把它们从n到1叠起来,如果能叠,你就马上叠。

比如n=3到达顺序312 ,那么你第一秒就叠3,第三秒叠21。

没什么好说的,直接模拟。n<=10^5

看到题目直接就写了个堆,根本没必要,好傻。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} priority_queue<int> q;
int n,nown; void check()
{
while(!q.empty()&&q.top()==nown)
{
printf("%d ",q.top());
q.pop();nown--;
}
} int main()
{
n=read();nown=n;
for(int i=;i<=n;i++)
{
int x=read();
if(x==nown)
printf("%d ",x),nown--;
else
q.push(x);
check();
printf("\n");
}
return ;
}

B.The Queue

有一个只从ts开到tt的地方,很多人来,每个人要呆t分钟做事情。一个人来的时候如果有人在做事情,他就排队。你是一个谦让的人,会让同时到的人排前面或者先做事情,问你从什么时候来等候时间最小。

这道题卡了很多人.....

很显然,直接枚举在那一个人的前一秒来,或者所有人之后来就可以了。

对于开门之前的时候,设你在第i个人之前1s到,等候时间为(i-1)*t+(ts-你到的时间);

对于开门之后的时候,维护队伍,以及从什么时候开始排队,设有tot个人排队,开始排队的时间为begin,等候时间为t*tot+begin-s[i]

这样就没了,考的就是细节。

还好写一次就过了,这题拉了挺多分......

复杂度On

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define ll long long
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} ll s[];
int n;
ll tf,tt,t;
ll beg,tot;
ll ans=200000000000000LL,times=; int main()
{
tf=read();tt=read();t=read();n=(int)read();tt-=t;
for(int i=;i<=n;i++) s[i]=read();
int i=;
s[]=-;
for(;s[i]<tf&&i<=n;i++)
{
if(s[i]==s[i-]) continue;
if(ans>tf-(s[i]-)+t*(i-))
{
ans=tf-(s[i]-)+t*(i-);times=s[i]-;
}
}
beg=tf;tot=i-;
for(;i<=n&&s[i]<=tt;i++)
{
if(s[i]!=s[i-])
{
if(beg+tot*t<=s[i]-)
{
printf("%I64d\n",s[i]-);
return ;
}
else
{
if(beg+tot*t-(s[i]-)<ans)
{
ans=beg+tot*t-(s[i]-);
times=s[i]-;
}
}
}
if(beg+tot*t<=s[i])
{
beg=s[i];tot=;
}
else
tot++;
}
if(beg+tot*t<=tt)
{
printf("%I64d\n",beg+tot*t);
}
else
printf("%I64d\n",times);
return ;
}

C.Garland

有一棵给定根的树,有点权,要求剪掉两条边使得三个联通块权值和相等。n<=1000000

很水的题目,直接dfs,用S[i]表示点i和它的子树的权值和,能分就分了。

最后判断一下即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int n,rt,cnt=;
struct edge{
int to,next;
}e[];
int head[];
int tot=,has=;
int s[]; int ans1=-,ans2=-; inline void ins(int f,int t)
{
e[++cnt].next=head[f];
head[f]=cnt;
e[cnt].to=t;
} inline void insw(int f,int t){ins(f,t);ins(t,f);} void findans(int x)
{
if(has>) return;
else has++;
if(ans1==-) ans1=x;
else if(ans2==-) ans2=x;
} void dfs(int x,int fa)
{
for(int i=head[x];i>;i=e[i].next)
{
int v=e[i].to;
if(v!=fa)
{
dfs(v,x);
if(s[v]==tot) findans(v);
else s[x]+=s[v];
}
}
} int main()
{
n=read();
for(int i=;i<=n;i++)
{
int u=read();s[i]=read();
if(u==) rt=i;
else insw(i,u);
tot+=s[i];
}
if(tot%!=) return *puts("-1");
else tot/=;
dfs(rt,);
if(has>=)
printf("%d %d\n",ans1,ans2);
else puts("-1");
return ;
}

D.Cartons of milk

冰箱有n瓶牛奶,商店有m瓶牛奶。

每瓶牛奶一个保质期Ai,然后必须在保质期前喝完它,每天只能喝k瓶牛奶。求最多可以从商店买几瓶。n,m<=10^6,Ai<=10^7

Ai范围很小,从后往前,让每一瓶牛奶尽可能晚喝掉,看看能否喝完冰箱里的。

如果能喝完,就把商店的牛奶排序一下,从后往前对每一个还能喝的天,都尽可能的买,即可。复杂度(mlogm+Ai)

应该有更简单的做法,我这个做法是现场想的,能做就直接做了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int n,m,maxn,k;
int f[];
struct gg{
int num,x;
}s[];
int ans[];
int sum=; bool cmp(gg x,gg y)
{
return x.x<y.x;
} int main()
{
n=read();m=read();k=read();
for(int i=;i<=n;i++)
{
int x=read();++f[x];
maxn=max(maxn,x);
}
for(int i=;i<=m;i++)
{
s[i].x=read();s[i].num=i;
}
sort(s+,s+m+,cmp);
for(int i=maxn;i;i--)
{
if(f[i]>k)
{
f[i-]+=f[i]-k;f[i]=;
}
else
f[i]=k-f[i];
}
if(f[]>k) return *puts("-1");
else f[]=k-f[];
int j=m;
for(int i=maxn+;i<=;i++) f[i]=k;
for(int i=;i>=;--i)
{
while(j>=&&s[j].x>=i&&f[i]--)
{
ans[++sum]=s[j].num;j--;
}
}
printf("%d\n",sum);
for(;sum;--sum)printf("%d ",ans[sum]);
return ;
}

E. Change-Free

一个人无限的纸币(100快)和有限的硬币(1块),他要在n天内每天买不同价格的产品Si,每天服务员都有一个不满意因数Wi,每次交易服务员会有一个不满意度

为Wi*(找回的纸币的数量+找回的硬币的数量)。求一个付钱方案让总不满意度最小。n<=100000

很显然每天要考虑怎么付钱的部分只有 Si%100,并且要不然就全部硬币付,要不然就一张纸币甩出来。

其实这道题真的不难,但我就是没发现一个性质,就是每一天付硬币和不付硬币,硬币的差值是100......

知道了这个就很简单了。

我们从第一天到最后一天,每天都先购买它,然后把不购买会产生的不满意度存到堆里面。

如果发现钱不够了,就去堆里找一个最小值,并且在那一天用纸币付钱,换取100个硬币。最后输出就行了。复杂度nlogn

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int n,m;
int s[];
bool flag[];
int w[];
ll ans=; struct node{
ll f,num;
friend bool operator < (node x,node y)
{
return x.f>y.f;
}
}newx;
priority_queue<node> q; int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
s[i]=read();
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n;i++)
{
if(s[i]%==) continue;
m-=s[i]%;
ll x=(ll)(-(s[i]%))*w[i];
q.push((node){x,i});
while(m<)
{
newx=q.top();q.pop();
flag[newx.num]=;
m+=;
ans+=newx.f;
}
}
printf("%I64d\n",ans);
for(int i=;i<=n;i++)
{
if(s[i]%==) printf("%d 0\n",s[i]/);
else if(flag[i]) printf("%d 0\n",s[i]/+);
else printf("%d %d\n",s[i]/,s[i]%);
}
return ;
}

最后附上成绩图。

Codeforces Round #398 (div.2)简要题解的更多相关文章

  1. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  2. Codeforces Round #545 (Div. 1) 简要题解

    这里没有翻译 Codeforces Round #545 (Div. 1) T1 对于每行每列分别离散化,求出大于这个位置的数字的个数即可. # include <bits/stdc++.h&g ...

  3. Codeforces Round #483 (Div. 1) 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 为了证明一下我又来更新了,写一篇简要的题解吧. 这场比赛好像有点神奇,E题莫名是道原题,导致有很多选手直接过掉了(Claris 表演24s过题 ...

  4. Codeforces Round #498 (Div. 3) 简要题解

    [比赛链接] https://codeforces.com/contest/1006 [题解] Problem A. Adjacent Replacements        [算法] 将序列中的所有 ...

  5. Codeforces Round #535(div 3) 简要题解

    Problem A. Two distinct points [题解] 显然 , 当l1不等于r2时 , (l1 , r2)是一组解 否则 , (l1 , l2)是一组合法的解 时间复杂度 : O(1 ...

  6. [题解][Codeforces]Codeforces Round #602 (Div. 1) 简要题解

    orz djq_cpp lgm A 题意 给定一个分别含有 \(\frac n2\) 个左括号和右括号的括号序列 每次可以将序列的一个区间翻转 求一个不超过 \(n\) 次的操作方案,使得操作完之后的 ...

  7. Codeforces Round #588 (Div. 1) 简要题解

    1. 1229A Marcin and Training Camp 大意: 给定$n$个对$(a_i,b_i)$, 要求选出一个集合, 使得不存在一个元素好于集合中其他所有元素. 若$a_i$的二进制 ...

  8. Codeforces Round #576 (Div. 1) 简要题解 (CDEF)

    1198 C Matching vs Independent Set 大意: 给定$3n$个点的无向图, 求构造$n$条边的匹配, 或$n$个点的独立集. 假设已经构造出$x$条边的匹配, 那么剩余$ ...

  9. Codeforces Round #398 (Div. 2)

    Codeforces Round #398 (Div. 2) A.Snacktower 模拟 我和官方题解的命名神相似...$has$ #include <iostream> #inclu ...

随机推荐

  1. 开始 Python 之旅

    开始 Python 之旅 课程来源 本课程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 The Python Standard Lib ...

  2. RxSwift 函数响应式编程

    Max 在 Boston 上学,在 San Francisco 工作,是一名软件工程师及创业者.当他还在高中的时候就在一家创业公司工作了,他非常喜欢使用 iOS.Android 以及 JavaScri ...

  3. Hibernate之深入持久化对象

    Hibernate是一个彻底的O/R Mapping 框架.之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面 ...

  4. LR录制脚本的时候打不开浏览器问题

    使用Chrome时,显示开始录制但是Action中无任何脚本,即脚本没成功生成. 使用Firefox(最新版),一直关闭程序,详细信息有StackHash_0a9e. 使用IE11时,也是显示开始录制 ...

  5. surging教学视频资源汇总

    surging是什么 surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询.压力最小优先作 ...

  6. C# 大数组赋值给小数组,小数组赋值给大数组

    ]; ]; " }; arraymax = arraystr;//变成和arraystr一样 arraymin = arraystr;//变成和arraystr一样

  7. thinkphp后台向前台传值没有传过去的小问题

    if($listyyarr){ $this->assign('listyyarr',$listyyarr); //$this->assign('nowDated',$endDated); ...

  8. 使用HTML5视频事件示例

    <!DOCTYPE html > <html > <head> <title>Video events example</title> &l ...

  9. restful架构风格设计准则(六)版本管理

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ...

  10. hadoop原理

    MapReduce工作原理图文详解 前言:   前段时间我们云计算团队一起学习了hadoop相关的知识,大家都积极地做了.学了很多东西,收获颇丰.可是开学后,大家都忙各自的事情,云计算方面的动静都不太 ...