咸鱼选手发现自己很久不做cf了,晚节不保。

A.Curriculum Vitae

枚举一下间断点的位置。

#include<bits/stdc++.h>
using namespace std;
const int N=;
int cnt,n,a[N],mx,cur;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++)a[i]=read();
int flag=;
for(int i=;i<=n;i++){
cur=;for(int j=;j<=i;j++)if(a[j]==)cur++;
for(int j=i;j<=n;j++)if(a[j]==)cur++;
mx=max(mx,cur);
}
printf("%d\n",mx);
}

B. Math Show

枚举完成了哪些套装,然后剩下的贪心算就好。

#include<bits/stdc++.h>
const int N=;
typedef long long ll;
using namespace std;
int n,m;
ll a[N],cur,tot,ans,qwq,k;
int vis[N];
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
} int main(){
n=read();k=read();m=read();
for(int i=;i<=k;i++)a[i]=read(),tot+=a[i];
sort(a+,a+k+);
if(m>=tot*n){
ans=1LL*n*(k+);cout<<ans<<endl;return ;
}
for(int i=;i<=n;i++){
ll res=m-1LL*i*tot;
if(res<)continue;
ll cur=;cur+=1LL*i*(k+);ll qwq=n-i;
if(res==){ans=max(ans,cur);continue;}
for(int j=;j<=k;j++){
if(qwq*a[j]<=res){res-=qwq*a[j];cur+=qwq;if(res<=)break;continue;}
if(res<=)break;
ll q=res/a[j];cur+=q;break;
}
ans=max(ans,cur);
}
cout<<ans<<endl;
}

老年选手晚节不保,一开始还以为尽量多做整套。

我是傻逼。

C. Four Segments

化简一下式子,然后就可以枚举了。

#include<bits/stdc++.h>
typedef long long ll;
const int N=;
using namespace std;
ll s[N],n,ans,x,y,z;
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++)s[i]=s[i-]+read();
for(int i=;i<=n;i++){
ll cur=s[i],now=i;
for(int j=i;j<=n;j++){
if(s[j]<cur)cur=s[j],now=j;
if(s[i]-s[now]+s[j]>ans)ans=s[i]-s[now]+s[j],x=i,y=now,z=j;
}
}
printf("%I64d %I64d %I64d\n",x,y,z);
}

D. Monitor

维护一个二维的前缀和。然后做k次拓展,这样每个点管的就是一个向上k的矩形。

剩下的就是横向的区间max,500的范围老年选手选择失去梦想的n^3暴力。

#include<bits/stdc++.h>
const int N=;
using namespace std;
int n,m,k,q,inf;
int a[N][N];
struct Point{int x,y,t;}p[];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
inline int querymax(int o,int l,int r){
int ans=;
for(int i=l;i<=r;i++)ans=max(a[o][i],ans);
return ans;
}
int ans=;
int main(){
n=read();m=read();k=read();q=read();
memset(a,,sizeof(a));inf=a[][];ans=inf;
for(int i=;i<=q;i++){
p[i].x=read();p[i].y=read();p[i].t=read();
a[p[i].x][p[i].y]=p[i].t;
}
for(int qwq=;qwq<k;qwq++)
for(int i=;i<n;i++)for(int j=;j<=m;j++)a[i][j]=max(a[i][j],a[i+][j]);
for(int i=;i+k-<=n;i++)for(int j=;j+k-<=m;j++)
ans=min(ans,querymax(i,j,j+k-));
if(ans==inf)puts("-1");else printf("%d\n",ans);
}

E. Chemistry in Berland

关系会形成一棵树,这很显然。

然后就是考虑节点之间的关系,这个关系其实就是树的拓扑序,一边对树拓扑排序一边dp一下,从下面开始先试图用父亲节点满足子节点

多余的上传到父亲节点即可。

#include<bits/stdc++.h>
const int N=;
typedef long long ll;
const ll inf=(1LL<<)-;
using namespace std;
ll a[N],b[N],dp[N];
int n,m,tot,head[N];
struct Edge{int u,v,next;ll w;}G[N<<];
inline void addedge(int u,int v,ll w){
G[++tot].u=u;G[tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].w=w;G[tot].next=head[v];head[v]=tot;
}
inline void dfs(int u,int f){
dp[u]=b[u]-a[u];
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;ll w=G[i].w;
if(v==f)continue;
dfs(v,u);
if(dp[v]<){
if(-dp[v]<inf/w)dp[u]+=dp[v]*w;
else dp[u]=-inf;
if(dp[u]<-inf)dp[u]=-inf;
}
else dp[u]+=dp[v];
}
}
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++)b[i]=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=n;i++){
int x=read();ll k=read();
addedge(i,x,k);
}
dfs(,);
puts(dp[]>=?"YES":"NO");
}

F. Random Query

这种题栋老师怕不是随便秒。

考虑一个数对区间的贡献,重复的数记录最后一次出现的位置,最后除所有可能即可。

#include<bits/stdc++.h>
const int N=;
typedef long long ll;
using namespace std;
int n,m,a[N],b[N];
ll ans=;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++)a[i]=read();
ll ans=,t=;
for(int i=;i<=n;i++){
t+=i-b[a[i]];ans+=t;b[a[i]]=i;
}
printf("%.6lf\n",(ans*-n)/(double)(1LL*n*n));
}

总结:

1.注意想清楚特判,在提交之前想清楚所有可能情况以及特殊、极端的情况,不要想当然,防止晚节不保

2.看清楚数据范围,做多次确认。

【Educational Codeforces Round28】的更多相关文章

  1. 【Educational Codeforces Round20】

    这场edu有点简单…… 所以题目可能也有点奇奇怪怪的. A.随意构造一下,可以发现只有当填满都不行时才可能无解. #include<bits/stdc++.h> using namespa ...

  2. 【Educational Codeforces Round 38 (Rated for Div. 2)】 Problem A-D 题解

    [比赛链接] 点击打开链接 [题解] Problem A Word Correction[字符串] 不用多说了吧,字符串的基本操作 Problem B  Run for your prize[贪心] ...

  3. 【 Educational Codeforces Round 51 (Rated for Div. 2) F】The Shortest Statement

    [链接] 我是链接,点我呀:) [题意] [题解] 先处理出来任意一棵树. 然后把不是树上的边处理出来 对于每一条非树边的点(最多21*2个点) 在原图上,做dijkstra 这样就能处理出来这些非树 ...

  4. 【Educational Codeforces Round 53 (Rated for Div. 2) C】Vasya and Robot

    [链接] 我是链接,点我呀:) [题意] [题解] 如果|x|+|y|>n 显然.从(0,0)根本就没法到(x,y) 但|x|+|y|<=n还不一定就能到达(x,y) 注意到,你每走一步路 ...

  5. 【Educational Codeforces Round 48 (Rated for Div. 2) C】 Vasya And The Mushrooms

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然在没有一直往右走然后走到头再往上走一格再往左走到头之前. 肯定是一直在蛇形走位.. 这个蛇形走位的答案贡献可以预处理出来.很容易 ...

  6. 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix

    [链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...

  7. 【Educational Codeforces Round 41 (Rated for Div. 2) D】Pair Of Lines

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果点的个数<=3 那么直接输出有解. 否则. 假设1,2最后会在一条直线上,则把这条直线上的点都删掉. 看看剩余的点是否在同 ...

  8. 【Educational Codeforces Round 37 F】SUM and REPLACE

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 那个D函数它的下降速度是很快的. 也就是说到最后他会很快的变成2或者1 而D(2)==2,D(1)=1 也就是说,几次操作过后很多数 ...

  9. 【Educational Codeforces Round 37 E】Connected Components?

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] bfs. 用一个链表来记录哪些点已经确定在某一个联通快里了. 一开始每个点都能用. 然后从第一个点开始进行bfs. 然后对于它的所有 ...

随机推荐

  1. The Dominator of Strings HDU - 6208(ac自动机板题)

    题意: 就是求是否有一个串 是其它所有串的母串 解析: 把所有的串都加入到trie数中  然后用最长的串去匹配就好了 emm..开始理解错题意了...看成了只要存在一个串是另一个的母串就好.. 然后输 ...

  2. c++11 模板的别名

    c++11 模板的别名 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  3. 【刷题】BZOJ 5415 [Noi2018]归程

    www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf Solution 考试的时候打的可持久化并查集,没调出来QAQ 后面知道了kruskal重构树这个东西 ...

  4. bzoj4385 & POJ2015 Wilcze doły

    Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...

  5. BZOJ3550 [ONTAK2010]Vacation 【单纯形】

    题目链接 BZOJ3550 题解 单纯形裸题 题意不清,每个位置最多选一次 #include<algorithm> #include<iostream> #include< ...

  6. loj2542 「PKUWC2018」随机游走 【树形dp + 状压dp + 数学】

    题目链接 loj2542 题解 设\(f[i][S]\)表示从\(i\)节点出发,走完\(S\)集合中的点的期望步数 记\(de[i]\)为\(i\)的度数,\(E\)为边集,我们很容易写出状态转移方 ...

  7. 【线段树分治】【P5227】 [AHOI2013]连通图

    Description 给定一个无向连通图和若干个小集合,每个小集合包含一些边,对于每个集合,你需要确定将集合中的边删掉后改图是否保持联通.集合间的询问相互独立 定义一个图为联通的当且仅当对于任意的两 ...

  8. UnityShader 序列帧动画效果

    实现原理:主要思想是设置显示uv纹理的大小,并逐帧修改图片的uv坐标. 实现步骤 1.我们首先用_Time.y和速度属性_Speed相乘得到模拟的时间. 2.然后我们用time除以_Horizonta ...

  9. ubuntu下访问其他盘出现挂在错误解决办法

    Error mounting /dev/sda5 at /media Linux下不能进入windows的NTFS分区之挂载错误问题 电 脑安装了win8,后在另一个分区(在win8下未分配空间)安装 ...

  10. GCC、GNU C、C99、ANSI C

    ANSI C ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准.ANSI C 标准同时规定了 C 标准库. ANSI C发展历史 C 的第一个标准是由ANS ...