Codeforces Round #517 Div. 1翻车记
A:真的懵逼了。冷静了半天之后决定二分一下答案,然后先a安排上尽量小的再贪心地一个个扩大。40min才过。这个做法非常怂的以代码复杂度和时间复杂度为代价换取了比较稳的正确性,事实上由于1~n可以组合出1~n*(n+1)/2的所有数,只要从大到小贪心地放就可以了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a,b,ans,ansa[],ansb[],cnta,cntb;
bool flag[];
bool check(int k)
{
int w=a;cnta=cntb=;
for (int i=;i<=k;i++)
if (w>=i) ansa[++cnta]=i,w-=i;
else break;
ansa[cnta+]=k+;
for (int i=cnta;i>=;i--)
{
if (!w) break;
while (w&&ansa[i]+<ansa[i+]) ansa[i]++,w--;
}
if (b>=1ll*k*(k+)/-(a-w)) return ;
else return ;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
a=read(),b=read();
n=sqrt((a+b)*2ll)+;
int l=,r=n;
while (l<=r)
{
int mid=l+r>>;
if (check(mid)) ans=mid,l=mid+;
else r=mid-;
}
int w=a;cnta=cntb=;
for (int i=;i<=ans;i++)
if (w>=i) ansa[++cnta]=i,w-=i;
else break;
ansa[cnta+]=ans+;
for (int i=cnta;i>=;i--)
{
if (!w) break;
while (w&&ansa[i]+<ansa[i+]) ansa[i]++,w--;
}
printf("%d\n",cnta);
for (int i=;i<=cnta;i++) printf("%d ",ansa[i]),flag[ansa[i]]=;
cout<<endl;
printf("%d\n",ans-cnta);
for (int i=;i<=ans;i++)
if (!flag[i]) printf("%d ",i);
return ;
}
B:首先对于修改字母显然要找到一个离左上角尽量远的可以将这段路径都改为a的点。这样可能是斜的一排点。然后考虑怎么使字典序最小,类似bfs的每次考虑斜的一排点,如果他可以由一个可能在答案中的点走来并成为最优解就给他标记上,最后由终点倒序输出即可。花了50min。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 2010
int n,m,a[N][N],f[N][N],ans[N*],cnt=;
bool flag[N][N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
char c=getchar();
while (c<'a'||c>'z') c=getchar();
a[i][j]=c-'a'+;
}
for (int i=;i<=n;i++) f[][i]=f[i][]=n*n;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (i==&&j==) f[i][j]=a[i][j]!=;
else f[i][j]=min(f[i-][j],f[i][j-])+(a[i][j]!=);
int step=-;
for (int k=*n-;k>=;k--)
{
for (int i=;i<=n;i++)
{
int j=k-i+;
if (<=j&&j<=n&&f[i][j]<=m) {step=k;flag[i][j]=;}
}
if (step!=-) break;
}
for (int i=;i<=step+;i++) putchar('a');
flag[][]=;
for (int k=step+;k<=*n-;k++)
{
int c=;
for (int i=;i<=n;i++)
{
int j=k-i+;
if (<=j&&j<=n&&(flag[i-][j]||flag[i][j-])) c=min(c,a[i][j]);
}
for (int i=;i<=n;i++)
{
int j=k-i+;
if (<=j&&j<=n&&(flag[i-][j]||flag[i][j-])&&a[i][j]==c) flag[i][j]=;
}
}
/*for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
cout<<flag[i][j]<<' ';
cout<<endl;
}*/
int x=n,y=n;
while (x-+y->step)
{
ans[++cnt]=a[x][y];
if (flag[x-][y]) x--;
else y--;
}
for (int i=cnt;i>=;i--) putchar(ans[i]+'a'-);
return ;
}
然后就弃疗了。
result:rank 227 rating +6 稳定的没救了。
Codeforces Round #517 Div. 1翻车记的更多相关文章
- Codeforces Round#500 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round#509 Div.2翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Educational Codeforces Round 56 Div. 2 翻车记
A:签到. B:仅当只有一种字符时无法构成非回文串. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Educational Codeforces Round 55 Div. 2 翻车记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- Codeforces Round#514 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round #524 Div. 2 翻车记
A:签到.room里有一个用for写的,hack了一发1e8 1,结果用了大概600+ms跑过去了.惨绝人寰. #include<iostream> #include<cstdio& ...
- Codeforces Round#516 Div.1 翻车记
A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...
- Educational Codeforces Round 53 Div. 2翻车记
A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)
Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...
随机推荐
- 从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
原文:从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1 0x6Navigation [7.1updated] Navigation 在wpf中并没有变化 Basic Na ...
- LeetCode: 57. Insert Interval(Hard)
1. 原题链接 https://leetcode.com/problems/insert-interval/description/ 2. 题目要求 该题与上一题的区别在于,插入一个新的interva ...
- Spring Cloud 熔断机制 -- 断路器
Spring Cloud 入门教程(七): 熔断机制 -- 断路器 对断路器模式不太清楚的话,可以参看另一篇博文:断路器(Curcuit Breaker)模式,下面直接介绍Spring Cloud的断 ...
- andriod 学习三 使用android资源
3.1 android框架中有许多资源,包括布局,字符串,位图,图片....,使用资源之前需要在相应的资源文件中定义资源,然后编译程序时ADT将定义的资源转换成java类并给予唯一的id,而代码中需要 ...
- 强制删除无用old windows文件夹命令
磁盘上有旧系统留下的目录比如old.windows.program files.users(中文目录是用户,删除命令里还是要用user才有效),因为目录的特殊设置,导致无法直接删除,需要修改属性和权限 ...
- Linux命令应用大词典-第6章 文件处理
6.1 sort:对文件中的数据进行排序 6.2 uniq:将重复行从输出文件中删除 6.3 cut:从文件每行中输出选定的字节.字符或字段 6.4 comm:逐行比较两个已经排序的文件 6.5 di ...
- UnityShader - 模拟动态光照特效
模型贴片 + 特效Shader = 动态光照特效 效果是这样的: 做法简单粗暴,直接使用模型贴片: shader上使用了noise只是提供一种思路,也有更简单的方法代替
- 现实世界中的 Python
Python 有多稳定? 非常稳定. 自 1991 年起大约每隔 6 到 18 个月就会推出新的稳定发布版,这种状态看来还将持续下去. 目前主要发布版本的间隔通常为 18 个月左右. 开发者也会推出旧 ...
- 使用flask_limiter设定API配额
前言 闲来无事,突然想到了以前做过的关于后台API安全方面的事,关于接口访问配额的设置,flask有没有很好的库支持呢?一找还真有!主要是对照了库的官方文档自己写了下dome,以供参考. # -*- ...
- 【转】网游服务器中的GUID(唯一标识码)实现-基于snowflake算法
本文中的算法采用twitter的snowflake算法,具体请搜索介绍,原来是用Scala写的,因我项目需要,改写成C++语言,主要用于高效的生成唯一的ID, 核心算法就是毫秒级时间(41位)+机器I ...