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翻车记的更多相关文章

  1. Codeforces Round#500 Div.2 翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  2. Codeforces Round#509 Div.2翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  3. Educational Codeforces Round 56 Div. 2 翻车记

    A:签到. B:仅当只有一种字符时无法构成非回文串. #include<iostream> #include<cstdio> #include<cmath> #in ...

  4. Educational Codeforces Round 55 Div. 2 翻车记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  5. Codeforces Round#514 Div.2 翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  6. Codeforces Round #524 Div. 2 翻车记

    A:签到.room里有一个用for写的,hack了一发1e8 1,结果用了大概600+ms跑过去了.惨绝人寰. #include<iostream> #include<cstdio& ...

  7. Codeforces Round#516 Div.1 翻车记

    A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...

  8. Educational Codeforces Round 53 Div. 2翻车记

    A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...

  9. 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++ ...

随机推荐

  1. VS2005源代码视图出现了小蓝点,怎么弄掉?

    VS2005源代码视图出现了小蓝点,怎么弄掉? 编辑->高级->查看空白行 就OK啦~ 这个查看空格的.. 或者Ctrl+E,S

  2. CLR via c#读书笔记八:泛型

    1.定义泛型类型或方法时,为类型指定的任何变量(比如T)都称为类型参数.使用泛型类型或方法时指定的具体数据类型称为类型实参. 2.System.Collections.Concurrent命名空间提供 ...

  3. Android 模拟器下载、编译及调试

    Android 模拟器源码下载 Android 模拟器源码的下载与 Android AOSP 源码库的下载过程类似,可以参考 Google 官方提供的 Android 源码下载文档 来了解这个过程. ...

  4. 在VMware虚拟机下安装Linux CentOS7

    1.首先下载并安装VMware虚拟机,下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluatio ...

  5. Unity Android设备的输入

    Unity Android设备的输入 1依据屏幕位置输入 有的时候也许是为了整个有些风格的干净,减少屏幕上的UI图标,以至于摒弃了虚拟按键这种常用的输入方式.为了替代虚拟按键的输入方式而选择了依据点击 ...

  6. 【text】 文本组件说明

    text文本组件:在小程序里除了文本节点以外的其他节点都无法长按选中. 原型: <text selectable="[Boolean]" space="[ensp ...

  7. Java学习笔记-10.io流

    1.输入流,只能从中读取数据,而不能向其写出数据.输出流,只能想起写入字节数据,而不能从中读取. 2.InputStream的类型有: ByteArrayInputStream 包含一个内存缓冲区,字 ...

  8. ubuntu ssh配置

    Secure Shell (SSH) is a cryptographic network protocol for operating network services securely over ...

  9. halcon基础应用和方法经验分享

    halcon基础应用和方法经验分享 一.Halcon软件 的安装 安装一直点下一步就好了,这个过程很简单,就不讲了 二.Halcon软件license安装 Halcon是商业视觉软件,是需要收费的,但 ...

  10. Python3 Tkinter-Spinbox

    1.创建 from tkinter import * root=Tk() Spinbox(root).pack() root.mainloop() 2.参数 from_    最小值 to    最大 ...