没有找到这场div3被改成div2的理由。

  A:签到。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int a[3],d;
signed main()
{
cin>>a[0]>>a[1]>>a[2]>>d;
sort(a,a+3);
cout<<max(0,d-(a[1]-a[0]))+max(0,d-(a[2]-a[1]));
return 0;
//NOTICE LONG LONG!!!!!
}

  B:随便做?

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 1000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T;
char a[N],b[N];
signed main()
{
T=read();
while (T--)
{
scanf("%s",a+1);int n=strlen(a+1);
scanf("%s",b+1);int m=strlen(b+1);
int cur=0;bool flag=1;
for (int i=1;i<=n;i++)
if (i==n)
{
if (cur==m) {flag=0;break;}
for (int j=cur+1;j<=m;j++)
if (a[i]!=b[j]) {flag=0;break;}
}
else if (a[i]==a[i+1])
{
if (cur==m||a[i]!=b[cur+1]) {flag=0;break;}
else cur++;
}
else
{
if (cur==m||b[cur+1]!=a[i]) {flag=0;break;}
cur++;int tmp=cur;
while (cur<m&&b[cur+1]==b[tmp]) cur++;
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
//NOTICE LONG LONG!!!!!
}

  C:显然应该先删权值大的。注意到值域只有100,于是记录每个权值出现次数从大到小删直到满足条件即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,a[N],cnt[N];
signed main()
{
n=read(),m=read();
for (int i=1;i<=n;i++) a[i]=read();
int s=0;
for (int i=1;i<=n;i++)
{
int u=m-a[i],c=0,w=s;
if (s>u)
for (int j=100;j>=1;j--)
if (w-cnt[j]*j>u) c+=cnt[j],w-=cnt[j]*j;
else {c+=(w-u-1)/j+1;break;}
cnt[a[i]]++;s+=a[i];
printf("%d ",c);
}
return 0;
//NOTICE LONG LONG!!!!!
}

  D:判一下删第一个数或删第二个数可不可行。不行的话公差就被固定下来,直接check。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2000000010
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n;
struct data
{
int x,i;
bool operator <(const data&a) const
{
return x<a.x;
}
}a[N];
int check(int l,int r)
{
int d=a[l+1].x-a[l].x;
for (int i=l+2;i<=r;i++) if (a[i].x-a[i-1].x!=d) return inf;
return d;
}
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i].x=read(),a[i].i=i;
sort(a+1,a+n+1);
if (n==2||n==3) {cout<<1;return 0;}
if (check(2,n)!=inf) {cout<<a[1].i;return 0;}
if (check(3,n)==a[3].x-a[1].x) {cout<<a[2].i;return 0;}
int d=a[2].x-a[1].x;
bool flag=0;int ans=0,last=a[2].x;
for (int i=3;i<=n;i++)
if (a[i].x-last!=d)
{
if (flag) {cout<<-1;return 0;}
else flag=1,ans=a[i].i;
}
else last=a[i].x;
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  E:找到每种字母最左上和最右下出现位置。然后依次覆盖并check。注意细节。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2000000010
#define N 2010
char getc(){char c=getchar();while ((c!='.')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T,n,m,c,first[30][2],last[30][2];
char a[N][N],b[N][N];
signed main()
{
T=read();
while (T--)
{
n=read(),m=read();c=0;
memset(first,0,sizeof(first));
memset(last,0,sizeof(last));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
a[i][j]=getc();
if (a[i][j]!='.')
{
c=max(c,a[i][j]-'a'+1);
if (!first[a[i][j]-'a'+1][0]) first[a[i][j]-'a'+1][0]=i,first[a[i][j]-'a'+1][1]=j;
last[a[i][j]-'a'+1][0]=i,last[a[i][j]-'a'+1][1]=j;
}
}
bool flag=1;
for (int i=1;i<=c;i++) if (first[i][0]!=last[i][0]&&first[i][1]!=last[i][1]) {flag=0;break;}
if (!flag) printf("NO\n");
else
{
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
b[i][j]='.';
for (int i=1;i<=c;i++)
if (first[i][0])
if (first[i][0]==last[i][0])
for (int j=first[i][1];j<=last[i][1];j++)
b[first[i][0]][j]='a'+i-1;
else
for (int j=first[i][0];j<=last[i][0];j++)
b[j][first[i][1]]='a'+i-1;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i][j]!=b[i][j]) {flag=0;break;}
if (!flag) printf("NO\n");
else
{
printf("YES\n");
printf("%d\n",c);
for (int i=1;i<=c;i++)
if (first[i][0])
{
printf("%d %d %d %d\n",first[i][0],first[i][1],last[i][0],last[i][1]);
}
else printf("%d %d %d %d\n",first[c][0],first[c][1],last[c][0],last[c][1]);
}
}
} return 0;
//NOTICE LONG LONG!!!!!
}

  F:将每个数字是否出现视为9位二进制数。暴力枚举选择哪两个二进制数。注意细节。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2000000010
#define N 100010
char getc(){char c=getchar();while ((c!='.')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,a[N],b[N],c[N],f[1<<9],g[1<<9],id[1<<9];
signed main()
{
n=read(),m=read();
for (int i=1;i<=n;i++)
{
int x=read();
for (int j=1;j<=x;j++) a[i]|=1<<read()-1;
}
for (int i=1;i<=m;i++)
{
c[i]=read();int x=read();
for (int j=1;j<=x;j++) b[i]|=1<<read()-1;
}
for (int i=1;i<=n;i++) g[a[i]]++;
for (int i=1;i<(1<<9);i++)
for (int j=i;j;j=j-1&i)
f[i]+=g[j];
memset(g,60,sizeof(g));
for (int i=1;i<=m;i++)
if (c[i]<g[b[i]])
{
g[b[i]]=c[i];
id[b[i]]=i;
}
int mx=0,mn=inf*2,ansx=0,ansy=0;
for (int i=1;i<(1<<9);i++)
for (int j=1;j<(1<<9);j++)
if (id[i]&&id[j]&&f[i|j]>=mx)
{
if (f[i|j]>mx||f[i|j]==mx&&g[i]+g[j]<mn) mx=f[i|j],ansx=id[i],ansy=id[j],mn=g[i]+g[j];
}
if (ansx!=ansy) cout<<ansx<<' '<<ansy;
else
{
if (ansx==0)
{
int mn=inf,mn2=inf,id1,id2;
for (int i=1;i<=m;i++)
if (c[i]<mn) mn2=mn,mn=c[i],id2=id1,id1=i;
else if (c[i]<mn2) mn2=c[i],id2=i;
cout<<id1<<' '<<id2<<endl;
}
else
{
int cost=inf,id;
for (int i=1;i<=m;i++)
if (i!=ansx&&c[i]<cost) cost=c[i],id=i;
cout<<ansx<<' '<<id;
}
}
return 0;
//NOTICE LONG LONG!!!!!
}

  G:G1随手状压dp。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2000000010
#define N 250
#define P 1000000007
char getc(){char c=getchar();while ((c!='.')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,T,f[1<<15][3],s[1<<15],lg2[1<<15];
struct data{int x,y;
}a[N];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
signed main()
{
n=read(),T=read();
for (int i=0;i<n;i++) a[i].x=read(),a[i].y=read()-1;
for (int i=0;i<n;i++) f[1<<i][a[i].y]=1;
for (int i=1;i<(1<<n);i++)
for (int j=0;j<3;j++)
for (int x=0;x<n;x++)
if (i&(1<<x)&&a[x].y==j)
{
for (int k=0;k<3;k++)
if (j!=k) inc(f[i][j],f[i^(1<<x)][k]);
}
for (int i=0;i<n;i++) lg2[1<<i]=i;
for (int i=1;i<(1<<n);i++) s[i]=s[i^(i&-i)]+a[lg2[i&-i]].x;
int ans=0;
for (int i=1;i<(1<<n);i++)
if (s[i]==T) inc(ans,f[i][0]),inc(ans,f[i][1]),inc(ans,f[i][2]);
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  G2首先容易想到只要求出f[x][y][z]为选择三类物品各x,y,z个且总重量和为T的方案数,将其排列的方案数可以随后计算。直接暴力背包复杂度O(Tn4),常数应该非常小空间搞搞应该也没问题大概就能过了,但看起来复杂度有点垃圾。而优化非常简单,可以把前两类物品先放一块做O(Tn3)的背包,然后再对第三类物品自身做背包,最后合并两个背包,由于总重量和T固定,复杂度即为O(Tn3)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2000000010
#define N 55
#define M 2550
#define P 1000000007
char getc(){char c=getchar();while ((c!='.')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,f[N][N][N][3],g[N][N][N],h[M][N][N],u[M][N],fac[N],ans;
struct data
{
int x,y;
bool operator <(const data&a) const
{
return y<a.y;
}
}a[N];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
signed main()
{
n=read(),m=read();
for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
sort(a+1,a+n+1);
f[1][0][0][0]=f[0][1][0][1]=f[0][0][1][2]=1;
for (int i=2;i<=n;i++)
for (int x=0;x<=i;x++)
for (int y=0;x+y<=i;y++)
{
int z=i-x-y;
if (x)
{
inc(f[x][y][z][0],f[x-1][y][z][1]);
inc(f[x][y][z][0],f[x-1][y][z][2]);
}
if (y)
{
inc(f[x][y][z][1],f[x][y-1][z][0]);
inc(f[x][y][z][1],f[x][y-1][z][2]);
}
if (z)
{
inc(f[x][y][z][2],f[x][y][z-1][0]);
inc(f[x][y][z][2],f[x][y][z-1][1]);
}
}
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++)
for (int k=0;k<=n;k++)
g[i][j][k]=((f[i][j][k][0]+f[i][j][k][1])%P+f[i][j][k][2])%P;
fac[0]=1;for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%P;
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++)
for (int k=0;k<=n;k++)
g[i][j][k]=1ll*g[i][j][k]*fac[i]%P*fac[j]%P*fac[k]%P;
int t=n;
for (int i=n;i>=1;i--) if (a[i].y!=3) {t=i;break;}
h[0][0][0]=1;
for (int i=1;i<=t;i++)
for (int j=i*50;j>=a[i].x;j--)
for (int x=0;x<=i;x++)
for (int y=0;y<=i;y++)
if (a[i].y==1)
{
if (x) inc(h[j][x][y],h[j-a[i].x][x-1][y]);
}
else
{
if (y) inc(h[j][x][y],h[j-a[i].x][x][y-1]);
}
u[0][0]=1;
for (int i=t+1;i<=n;i++)
for (int j=m;j>=a[i].x;j--)
for (int k=1;k<=n;k++)
inc(u[j][k],u[j-a[i].x][k-1]);
for (int i=0;i<=m;i++)
for (int x=0;x<=n;x++)
for (int y=0;y<=n;y++)
if (h[i][x][y])
for (int z=0;z<=n;z++)
inc(ans,1ll*h[i][x][y]*u[m-i][z]%P*g[x][y][z]%P);
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  小小小小小号小号5。结束时是official的rk3,st完变成rk1,可能因为cf有一些新的规定于是被ban成unofficial的了,感觉有点惨。

Codeforces Round #568 Div. 2的更多相关文章

  1. Codeforces Round #568 (Div. 2)B

    B. Email from Polycarp 题目链接:http://codeforces.com/contest/1185/problem/B 题目: Methodius received an e ...

  2. Codeforces Round #568 (Div. 2)A

    A. Ropewalkers 题目链接:http://codeforces.com/contest/1185/problem/A 题目: Polycarp decided to relax on hi ...

  3. codeforces Round #568(Div.2)A B C

    有点菜,只写出了三道.活不多说,上题开干. A. Ropewalkers Polycarp decided to relax on his weekend and visited to the per ...

  4. Codeforces Round #568 (Div. 2) D. Extra Element

    链接: https://codeforces.com/contest/1185/problem/D 题意: A sequence a1,a2,-,ak is called an arithmetic ...

  5. Codeforces Round #568 (Div. 2) C2. Exam in BerSU (hard version)

    链接: https://codeforces.com/contest/1185/problem/C2 题意: The only difference between easy and hard ver ...

  6. Codeforces Round #568 (Div. 2) B. Email from Polycarp

    链接: https://codeforces.com/contest/1185/problem/B 题意: Methodius received an email from his friend Po ...

  7. Codeforces Round #568 (Div. 2) A.Ropewalkers

    链接: https://codeforces.com/contest/1185/problem/A 题意: Polycarp decided to relax on his weekend and v ...

  8. Codeforces Round #568 (Div. 2) G1. Playlist for Polycarp (easy version) (状压dp)

    题目:http://codeforces.com/contest/1185/problem/G1 题意:给你n给选项,每个选项有个类型和价值,让你选择一个序列,价值和为m,要求连续的不能有两个相同的类 ...

  9. Codeforces Round #568 (Div. 2) G2. Playlist for Polycarp (hard version)

    因为不会打公式,随意就先将就一下? #include<cstdio> #include<algorithm> #include<iostream> #include ...

随机推荐

  1. CSP2019自闭记

    为什么我之前没有写呢,是因为我总是考的太lj,于是就不想写了. 这次不管考没考好都要强迫自己写,因为这是第一次参加提高组+第一次参加CSP. 当然什么初赛/复赛试题/答案什么的是不会出现的. Day ...

  2. [学习笔记] kd-tree

    本文参考这位dalao的题解 前置技能:二叉查找树 其实kd-tree很简单的啦 和BST都差不多的啦 就是在划分的时候把每一维都比较一下就行啦 (\(dalao\)的kd-tree教程) 然而本蒟蒻 ...

  3. es6学习2:变量的解构赋值

    一:数组的解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar ba ...

  4. Linux 文件压缩、打包

    文件压缩 计算机使用byte单位来计量.实际上,计算机最小的计量单位是bit.1byte = 8 bit.如果记录1这个数字,00000001,1会在最右边占一个1个bit 其他7个bit会被填上0. ...

  5. 2019_软工实践_Beta收官

    简介 组名:955 组长博客:点这里! 成员 031702329庄锡荣(组长) 031702309林晓锋 031702309侯雅倩 031702311陈珊珊 171709030吴珂雨 03170231 ...

  6. [转]ProxmoxVE 干掉 VMware

    很久没有写这种通俗易懂的文章了,不是我愤世嫉俗,而是因为确实太为那些花大价钱购买VMware的冤大头鸣不平. 确实VMware在虚拟化市场占有率非常高,技术也非常成熟,用户使用起来很方便,但是如果你是 ...

  7. Nginx配置简单基于域名的虚拟主机

    首先修改hosts文件,让浏览器在看到a.com或是www.a.com的网址时知道上哪里去找: # Copyright (c) 1993-2009 Microsoft Corp. # # This i ...

  8. 【vue】npm、node版本查看及npm常用命令

    1,版本查看 node -v npm -v 2,修改NPM的缓存目录和全局目录路径 D盘node目录下创建两个目录,分别是node_cache和node_global,这是用来放安装过程的缓存文件以及 ...

  9. CentOS 7 安装FTP服务器(vsftpd)

    FTP是安装各种环境前的预备环节,因为我们要把下载好的安装包上传上去.其次,在一个团队中,FTP服务器为多用户提供了一个文件储存场所,总之是一个非常实用的工具. 1.安装vsftpd # 首先要查看你 ...

  10. Oracle系列四 单行函数查询语句

    单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以转换数据类型 可以嵌套 参数可以是一列或一个值 包含:字符,数值,日期,转换,通用 字符函数 1.大小写控制函数: ...