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. python字符串格式化符号及转移字符含义

    博文出自鱼C论坛文章 http://bbs.fishc.com/thread-39140-1-1.html

  2. mysql using filesort Using temporary

    using filesort 一般人的回答是: “当行数据太大,导致内存无法容下这些数据产生的临时表时,他们就会被放入磁盘中排序.”  很不幸,这个答案是错的 ,临时表在太大的时候确实会到磁盘离去,但 ...

  3. hdu1907John(反nim博弈)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  4. 【WXS全局对象】Global

    Global对象的方法调用时,无需使用 Global.parseInt(...),而是直接使用 parseInt(...) 方法: 名称 说明 parseInt(string, radix) 解析一个 ...

  5. POJ - 3259

    要判断是否有负的权值 #include<iostream> #include<stdio.h> #include<algorithm> #include<st ...

  6. C++ ifndef /define/ endif 作用和用法

    ifndef/define/endif”主要目的是防止头文件的重复包含和编译 比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题 ...

  7. 剑指offer-二叉搜索树的后序遍历序列23

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution: def Verif ...

  8. 讯飞云 API 语音听写 python3 调用例程

    #!/usr/bin/python3 # -*- coding: UTF-8 -*- import requests import time import gzip import urllib imp ...

  9. HDU 3260/POJ 3827 Facer is learning to swim(DP+搜索)(2009 Asia Ningbo Regional)

    Description Facer is addicted to a game called "Tidy is learning to swim". But he finds it ...

  10. http-bio-8080"-exec-6"(转)

    现象如下: Tomcat7启动后,后台抛出如下异常,前台一直无法登陆Exception in thread ""http-bio-8080"-exec-6" j ...