Codeforces Round #519 by Botan Investments翻车记
A:枚举答案即可。注意答案最大可达201,因为这个wa了一发瞬间爆炸。
#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 110
int n,a[N],mx;
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();
int tot=;
for (int i=;i<=n;i++) mx=max(mx,a[i]=read()),tot+=a[i];
for (int i=mx;i<=;i++)
{
int cnt=;
for (int j=;j<=n;j++) cnt+=i-a[j];
if (cnt>tot) {cout<<i;return ;}
}
return ;
}
B:看了半天题。枚举即可。
#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 1010
int n,a[N],b[N],cnt=,c[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();
for (int i=;i<=n;i++) a[i]=read();
for (int k=;k<=n;k++)
{
bool flag=;
for (int i=;i<=k;i++) b[i]=a[i]-a[i-];
for (int i=k+;i<=n;i++) if (a[i]-a[i-]!=b[(i-)%k+]) {flag=;break;}
if (flag) c[++cnt]=k;
}
cout<<cnt<<endl;
for (int i=;i<=cnt;i++) cout<<c[i]<<' ';
return ;
}
C:看了半天题。想了半天。每次都在字符的分界处翻转,就可以得到最优解(即a都在前面b都在后面)。
#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 1010
int n,a[N];
bool flag[N];
char s[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
scanf("%s",s+);
n=strlen(s+);
for (int i=;i<=n;i++) a[i]=s[i]=='b';
for (int i=;i<=n;i++)
{
int t=i;
while (t<n&&a[t+]==a[i]) t++;
if (t<n||a[i]==) reverse(a+i+,a+t+),flag[t]=;
i=t;
}
for (int i=;i<=n;i++) cout<<flag[i]<<' ';
return ;
}
D:看了半天题。暴力匹配,如果失配这些数不可能再被计入答案。这样分成了很多段,将每段答案加起来即可。
#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 100010
#define M 12
int n,m,a[M][N],p[M][N],q[];
long long ans;
bool check()
{
for (int i=;i<=m;i++)
{
q[i]++;
if (q[i]>n) return ;
}
for (int i=;i<=m;i++)
if (a[i][q[i]]!=a[i-][q[i-]]) return ;
return ;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)
a[i][j]=read(),p[i][a[i][j]]=j;
for (int i=;i<=n;i++)
{
int x=i;
q[]=i;
for (int j=;j<=m;j++) q[j]=p[j][a[][i]];
while (x<n&&check()) x++;
ans+=1ll*(x-i+)*(x-i+)/;
i=x;
}
cout<<ans;
return ;
}
E:看了半天题。看题时间跟想+码的时间差不多了。首先给出的那些边显然可以直接排除。现在要求的是ansi=Σmin(xi+yj,xj+yi),可以将其变成ansi=Σmin(xi-yi-xj+yj,0)+xj+yi。这样min里面的东西只需要二分查一个前缀和。
#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 300010
int n,m,t=;
long long ans[N],b[N],pre[N],sum;
struct data{int x,y;
}a[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++) sum+=a[i].x=read(),a[i].y=read(),b[i]=a[i].y-a[i].x;
sort(b+,b+n+);
for (int i=;i<=n;i++) pre[i]=pre[i-]+b[i];
for (int i=;i<=m;i++)
{
int x=read(),y=read();
ans[x]-=min(a[x].x+a[y].y,a[x].y+a[y].x),ans[y]-=min(a[x].x+a[y].y,a[x].y+a[y].x);
}
/*for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j) ans[i]+=min(a[i].x-a[i].y+b[j],0)+a[i].y+a[j].x;*/
for (int i=;i<=n;i++)
{
ans[i]+=sum-a[i].x+1ll*a[i].y*(n-);
int l=,r=n,t=;
while (l<=r)
{
int mid=l+r>>;
if (b[mid]+a[i].x-a[i].y<) t=mid,l=mid+;
else r=mid-;
}
ans[i]+=pre[t]+1ll*t*(a[i].x-a[i].y);
}
for (int i=;i<=n;i++) printf("%I64d ",ans[i]);
return ;
}
close
F:做法似乎很多。比赛时只想到设f[i]为gcd=i时最少选多少元素,考虑通过与i的gcd数量是i的因子个数来优化,预处理可以向哪转移。这一部分看起来可以瞎优化到不错的效率,然而又wa又T最后弃疗了。
题解给的是状压dp,没有太懂(upd:好像也是算方案数)。似乎也有不少随机化做法。
感觉最妙的做法还是这样:强化这个题,求选k个数时的方案数。这显然可以莫比乌斯反演,预处理每个数在a中有多少个是其倍数即可,这可以利用调和级数做到log。显然最终答案若存在一定不超过7,于是复杂度O(n+vlogv)。这应该是保证正确性(取模后变成0什么的就算了吧)的最优做法了。把一个判定性问题转化为数数题居然能够简化问题非常有意思。
#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 300010
#define P 1000000007
int n,a[N],mobius[N],prime[N],tot[N],cnt;
int fac[N],inv[N];
bool flag[N];
int C(int n,int m)
{
if (m>n) return ;
return 1ll*fac[n]*inv[m]%P*inv[n-m]%P;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("f.in","r",stdin);
freopen("f.out","w",stdout);
#endif
n=read();
for (int i=;i<=n;i++) a[read()]++;
flag[]=;mobius[]=;
for (int i=;i<=N-;i++)
{
if (!flag[i]) prime[++cnt]=i,mobius[i]=-;
for (int j=;j<=cnt&&prime[j]*i<=N-;j++)
{
flag[prime[j]*i]=;
if (i%prime[j]==) break;
else mobius[prime[j]*i]=-mobius[i];
}
}
fac[]=;for (int i=;i<=N-;i++) fac[i]=1ll*fac[i-]*i%P;
inv[]=inv[]=;for (int i=;i<=N-;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P;
for (int i=;i<=N-;i++) inv[i]=1ll*inv[i-]*inv[i]%P;
for (int i=;i<=N-;i++)
for (int j=i;j<=N-;j+=i)
tot[i]+=a[j];
for (int k=;k<=;k++)
{
int ans=;
for (int i=;i<=N-;i++)
ans=((ans+mobius[i]*C(tot[i],k))%P+P)%P;
if (ans) {cout<<k;return ;}
}
cout<<-;
return ;
}
这场阅读量实在太大,读题感觉花了快有30min。A wa一发掉了至少30名非常惨了。
result:rank 417 rating -6
Codeforces Round #519 by Botan Investments翻车记的更多相关文章
- Codeforces Round #519 by Botan Investments
Codeforces Round #519 by Botan Investments #include<bits/stdc++.h> #include<iostream> #i ...
- Codeforces Round #519 by Botan Investments(前五题题解)
开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...
- Codeforces Round #519 by Botan Investments F. Make It One
https://codeforces.com/contest/1043/problem/F 题意 给你n个数,求一个最小集合,这个集合里面数的最大公因数等于1 1<=n<=3e5 1< ...
- 【Codeforces Round #519 by Botan Investments E】Train Hard, Win Easy
[链接] 我是链接,点我呀:) [题意] [题解] 设每个人做第一题.第二题的分数分别为x,y 我们先假设没有仇视关系. 即每两个人都能进行一次训练. 那么 对于第i个人. 考虑第j个人对它的贡献 如 ...
- 【Codeforces Round #519 by Botan Investments A】 Elections
[链接] 我是链接,点我呀:) [题意] [题解] 枚举k 那么另外一个人的得票就是nk-sum(ai) 找到最小的满足nk-sum(ai)>sum(ai)的k就ok了 [代码] #includ ...
- 【 Codeforces Round #519 by Botan Investments B】Lost Array
[链接] 我是链接,点我呀:) [题意] [题解] 枚举k 不难根据a得到x[0..k-1] 然后再根据a[k+1..n]来验证一下得到的x是否正确就好. [代码] #include <bits ...
- 【Codeforces Round #519 by Botan Investments C】 Smallest Word
[链接] 我是链接,点我呀:) [题意] [题解] 模拟了一两下.. 然后发现. 对于每一个前缀. 组成的新的最小字典序的字符串 要么是s[i]+reverse(前i-1个字符经过操作形成的最大字典序 ...
- 【Codeforces Round #519 by Botan Investments D】Mysterious Crime
[链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...
- Codeforces Round #518 Div. 1没翻车记
A:设f[i][j][0/1]为前i个数第i位为j且第i位未满足/已满足限制的方案数.大力dp前缀和优化即可. #include<iostream> #include<cstdio& ...
随机推荐
- react脚手架搭建1
23:01:17 react脚手架搭建 (个人用的是webstorm,所以分享下webstorm中的创建react脚手架项目的方法) 1.创建新项目(前提是下载nodejs环境) 2.下载好在webs ...
- Python核心框架tornado的异步协程的2种方式
什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...
- sqlite3 简单实用方法
打开数据库:sqlite3.exe test.db 显示所有表: .tables 退出 sqlite3:.quit 还有个问题,已经打开一个数据库文件了. 不知道如何在不退出命令行的情况下,更换另一个 ...
- Python学习:for 循环 与 range()函数
for 循环 For … in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(Iterates),即它会遍历序列中的每一个项目 注意: 1.else 部分是可选的.当循环中包含它时,它 ...
- ruby Dir类
类方法 1. Dir[pat] Dir::glob( pat) 返回一个数组,包含与指定的通配符模式 pat 匹配的文件名: * - 匹配包含 null 字符串的任意字符串 ** - 递归地匹配 ...
- 三角形xjoi 8.14
问题描述:离圣诞节只有一个月了,家里要你准备一个很大的星星,然后把它粘在圣诞树的顶端.你已经准备好了一个三角形的银色包装纸来做星星,可忽然有一天你发现在这张大纸上被弄了好多的小洞,原来是你的弟弟妹妹已 ...
- Linq To Excel使用简介二
目录: 1.常用方法介绍 2.查询符合条件的数据 3.手动添加映射 4.其他用法 1.常用方法介绍 里面有一些常见的方法,如下: Worksheet 获得工作表中的数据 Works ...
- jmeter操作JDBC
1. 依次添加计划.线程组.JDBC Connection Configuration.JDBC Request.HTTP请求.Debug Sampler.察看结果树 在计划中导入mysql的jdbc ...
- Android2.2以上的版本HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不相等
2.2以上的版本下载网络资源不完整无法更新.HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不等. 原因是:HttpURLConn ...
- 菜鸟级appium 必看
之所以写这个,因为太多新人,appium环境半天都搭建不好,版本问题,兼容问题等等. 自己的解决方案:1 官网下载nodejs,建议安装长期支持版 2 进入appium官网,点击下载,跳转到githu ...