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& ...
随机推荐
- 在Liunx Mint下无法切换到root用户
提示 su: Authentication failure 以ubuntu的mint root用户默认是也是禁止的 需要手动打开才行 a)root启用 执行下面的操作:1.先解除root锁定,为roo ...
- libpng的使用
zlib 适用于数据压缩的函式库,由Jean-loup Gailly (负责compression)和 Mark Adler (负责decompression)开发. zlib被设计成一个免费的.通用 ...
- Awakening Your Senses【唤醒你的感觉官能】
Awakening Your Senses Give youself a test. Which way is the wind blowing? How many kinds of wildflow ...
- [Codeforces888E]Maximum Subsequence(暴力+meet-in-the-middle)
题意:给定n.m.有n个数,选出若干数加起来对m取模,求最大值 n<=35 如果直接暴力就是235,会T, 这里用到一个思想叫meet-in-the-middle, 就是把数列分成两半分别搜索, ...
- BZOJ2693: jzptab(莫比乌斯反演)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2068 Solved: 834[Submit][Status][Discuss] Descripti ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
- Spring AOP(一)——基础概念
前文的一些内容更多是针对Spring容器内部的一些特性的描述,接下来一个专题将描述Spring AOP的一些信息,配置细节等等. 介绍 面向切面编程(AOP)是一种新的针对程序结构的思路,它补足了面向 ...
- 剁了xp,醉了win7
装完win7,安装各种软件完毕,重启,然并卵. cpu,内存飙升!! svchost.exe这个进程内存发疯了一样往上飙升 从 几十兆 到占用1个多G, 纳尼, 总共物理内存才2G. ╮(╯▽╰) ...
- Java Web前后端分离的思考与实践
第一节 Java Web开发方式的变化 Web开发虽然是我们常说的B/S模式,其实本质上也是一种特殊的C/S模式,只不过C和S的选择余地相对要窄了不少,而且更标准化.不论是采用什么浏览器和后端框架,W ...
- CentOS环境配置Hadoop(一)
配置Linux开发环境(hadoop-2.6.4) 一.准备工具 VMware-workstation-10.0.1注册机 CentOS-6.5-x86_64-bin-DVD1 jdk-7u79-li ...