A:每次看是否有能走回去的房间,显然最多只会存在一个,如果有走过去即可,否则开辟新房间并记录访问时间。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#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,a[N],id[N],ans;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();
for (int i=1;i<=n;i++) a[i]=read();
int cur=ans=1;id[0]=1;
for (int i=1;i<=n;i++)
{
if (id[a[i]]) cur=id[a[i]],id[a[i]]=0;
else cur=++ans;
id[i]=cur;
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  B:注意到单个字母一定是出现次数最多的子串之一。所以如果给定字符串中有字符重复出现,一定无解。并且可以得到答案字符串中也一定没有字符重复出现,其长度<=26。于是怎么暴力都行了。考虑将所有串按长度从大到小排序,动态维护当前答案,答案由一个字符串数组构成。每次加入一个字符串时,先看是否被答案中某字符串包含,否则再看其是否能拼接两个字符串,若不能继续看能否和某个字符串拼接,都不行的话将其加入字符串数组。最后将数组排序即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
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,cnt[26];
string a[N],ans[100];
bool cmp(const string&a,const string&b)
{
return a.length()>b.length();
}
void check(string a)
{
memset(cnt,0,sizeof(cnt));
for (int j=0;j<a.length();j++)
{
if (cnt[a[j]-'a']) {cout<<"NO";exit(0);}
cnt[a[j]-'a']++;
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();
for (int i=1;i<=n;i++)
{
cin>>a[i];check(a[i]);
}
sort(a+1,a+n+1,cmp);ans[1]=a[1];
int u=1;
for (int i=2;i<=n;i++)
{
bool flag=0;
for (int x=1;x<=u;x++)
{
for (int y=1;y<=u;y++)
if (x!=y)
{
for (int k=1;k<a[i].size();k++)
if (ans[x].substr(ans[x].size()-k,k)+ans[y].substr(0,a[i].size()-k)==a[i])
{
flag=1;
ans[x]=ans[x].substr(0,ans[x].size()-k)+a[i]+ans[y].substr(a[i].size()-k,ans[y].size()-(a[i].size()-k));
ans[y].clear();
check(ans[x]);break;
}
if (flag) break;
}
if (flag) break;
}
if (flag)
{
for (int k=1;k<=u;k++)
if (ans[k].size()==0)
{
for (int p=k;p<u;p++) ans[p]=ans[p+1];
u--;break;
}
continue;
}
for (int k=1;k<=u;k++)
{
for (int j=0;j<ans[k].size()-a[i].size()+1;j++)
if (ans[k].substr(j,a[i].size())==a[i]) {flag=1;break;}
if (flag) {check(ans[k]);break;}
for (int j=ans[k].size()-a[i].size()+1;j<ans[k].size();j++)
if (ans[k].substr(j,ans[k].size()-j)==a[i].substr(0,ans[k].size()-j))
{
ans[k]=ans[k].substr(0,j)+a[i];flag=1;break;
}
if (flag) {check(ans[k]);break;}
for (int j=1;j<a[i].size();j++)
if (a[i].substr(j,a[i].size()-j)==ans[k].substr(0,a[i].size()-j))
{
ans[k]=a[i].substr(0,j)+ans[k];flag=1;break;
}
if (flag) {check(ans[k]);break;}
}
if (!flag)
{
ans[++u]=a[i];
for (int k=1;k<u;k++) check(ans[k]+a[i]);
}
}
sort(ans+1,ans+u+1);
for (int i=1;i<=u;i++) cout<<ans[i];
return 0;
//NOTICE LONG LONG!!!!!
}

  C:容易想到一个二维dp,即f[i][j]第i位为j且在前缀单调栈中的方案数。考虑改成一维,固定最后一位为最大值。然后考虑次大值所在位置,分为与最大值距离超过k和不超过k两种情况。若超过k,剩下的数可以任意摆放;若不超过k,变成了一个固定最后一位为次大值的相同子问题,而次大值与最大值之间的数同样可以任意摆放。前缀和优化即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1000010
#define P 1000000007
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,fac[N],inv[N],f[N],s[N],ans;
int A(int n,int m){if (m>n) return 0;return 1ll*fac[n]*inv[n-m]%P;}
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
n=read(),m=read();
fac[0]=1;for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%P;
inv[0]=inv[1]=1;for (int i=2;i<=n;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P;
for (int i=2;i<=n;i++) inv[i]=1ll*inv[i]*inv[i-1]%P;
for (int i=m+1;i<=n;i++)
{
f[i]=((i-m-1ll+s[i-1]-s[i-m-1])*fac[i-2]%P+P)%P;
s[i]=(s[i-1]+1ll*f[i]*inv[i-1])%P;
}
for (int i=1;i<=n;i++) inc(ans,1ll*f[i]*A(n-1,n-i)%P);
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  D:注意到所有点的质心在直线上的投影就是所有点在直线上的投影的质心。于是关于质心对称的两点始终不会对是否满足中心对称产生影响,将其删去。而对于剩下的点,考虑固定某个点,若其和剩下某个点要中心对称,只有一条直线能满足条件,即与两点质心和所有点质心的连线垂直的过原点的直线。枚举所有直线暴力判断即可。注意去掉相同的直线。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 2010
#define vector point
#define double long double
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;
}
const double eps=1E-11;
const double PI=3.1415926535897932;
int n,ans;
double b[N];
bool flag[N];
struct point{
double x,y;
vector operator +(const vector&a) const
{
return (vector){x+a.x,y+a.y};
}
vector operator -(const vector&a) const
{
return (vector){x-a.x,y-a.y};
}
vector operator *(const double&a) const
{
return (vector){a*x,a*y};
}
double operator *(const vector&a) const
{
return x*a.y-y*a.x;
}
double operator ^(const vector&a) const
{
return x*a.x+y*a.y;
}
double len(){return sqrt(x*x+y*y);}
bool iszero(){return len()<eps;}
vector rotate(double alpha){return (vector){x*cos(alpha)+y*sin(alpha),x*sin(alpha)-y*cos(alpha)};}
}a[N],c[N],P;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
#endif
n=read();
for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),P=P+a[i];
P=P*(1.0/n);int cnt=0,t=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
if ((a[i]+a[j]-P*2).iszero()) {flag[i]=flag[j]=1;break;}
for (int i=1;i<=n;i++) if (!flag[i]) a[++t]=a[i];
n=t;t=0;if (!n) {cout<<-1;return 0;}
for (int i=1;i<=n;i++)
{
vector Q=(a[i]+a[1])*0.5-P;
double w=Q.len();
if (fabs(w)<eps) {cnt++;continue;}
w=1.0/w;Q=Q*w;
for (int j=1;j<=n;j++) b[j]=a[j]*Q;
sort(b+1,b+n+1);
bool flag=0;double mid=P*Q;
for (int j=1;j<=n;j++) if (fabs(b[j]+b[n-j+1]-mid*2)>eps) {flag=1;break;}
if (!flag) c[++t]=Q;
}
memset(flag,0,sizeof(flag));
for (int i=1;i<=t;i++)
{
flag[i]=1;
for (int j=1;j<i;j++)
if (flag[j]&&fabs(c[i]*c[j])<eps) {flag[i]=0;break;}
if (flag[i]) ans++;
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  E看了一年题解都没懂。

Codeforces Round #445 Div. 1的更多相关文章

  1. Codeforces Round #445 Div. 1 C Maximum Element (dp + 组合数学)

    题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下 ...

  2. 【Codeforces Round #445 (Div. 2) D】Restoration of string

    [链接] 我是链接,点我呀:) [题意] 给你n个字符串. 让你构造一个字符串s. 使得这n个字符串. 每个字符串都是s的子串. 且都是出现次数最多的子串. 要求s的长度最短,且s的字典序最小. [题 ...

  3. 【Codeforces Round #445 (Div. 2) C】 Petya and Catacombs

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看时间戳为i的点有哪些. 每次优先用已经访问过的点. 如果不行就新创一个点. 注意新创点的时间戳也是i. [代码] #includ ...

  4. 【Codeforces Round #445 (Div. 2) B】Vlad and Cafes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 傻逼模拟 [代码] #include <bits/stdc++.h> using namespace std; cons ...

  5. 【Codeforces Round #445 (Div. 2) A】ACM ICPC

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 三重循环 [代码] #include <bits/stdc++.h> using namespace std; int ...

  6. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  7. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  8. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. 2小时学会Spring Boot(IDE:eclipse)

    一:安装STS插件 官网下载:点此下载STS 注意:STS版本必须与eclipse版本对应 安装教程:http://blog.csdn.net/cryhelyxx/article/details/53 ...

  2. 吉特日化MES-日化行业原料仓库所见问题汇总

    2018年工作主要面向的是日化行业,其中包括日化生产以及日化生产原料仓库,和以往接触到仓库有点不一样在于日化行业原料的特性问题,日化行业的原料基本以粉尘和液体为主. 1. 原料的形态上: 日化行业原料 ...

  3. Faster R-CNN:详解目标检测的实现过程

    本文详细解释了 Faster R-CNN 的网络架构和工作流,一步步带领读者理解目标检测的工作原理,作者本人也提供了 Luminoth 实现,供大家参考.   Luminoth 实现:https:// ...

  4. 三、临时弹出一个QQ对话窗口

    第一种:需要添加好友才可以访问 <a href="http://wpa.qq.com/msgrd?v=3&uin=317985559&site=qq&menu= ...

  5. vue echarts 动态数据

    安装echarts依赖 npm install echarts -S 或者使用国内的淘宝镜像: 安装 npm install -g cnpm --registry=https://registry.n ...

  6. apache benchmark 的简单安装与测试

    1. 下载apache benchmark Copy From https://blog.csdn.net/fyqaccpt96/article/details/43272001 yum instal ...

  7. Linux下面将windows写的脚本转换成 Linux 格式的文件

    1.接着上一篇blog 发现有一个问题 vim 打开文件 发现最下面有一行信息: 2. 里面有一些 不一样的地方. linux里面没法执行 ,如果想执行的话 可以输入命令 :set fileforma ...

  8. mac下virtualbox中centos6.5虚拟机实现全屏和调整分辨率

    在visualbox里安装好centos后,发现不能分辨率与原屏幕不一致,很多解决方法是:安装增强包.可是安装增强包后依然达不到效果. 究其原因,原来因为没有安装显卡驱动导致安装了增强包后无法实现分辨 ...

  9. npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别

    npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...

  10. AssemblyScript的测试

    详细文档介绍 export function f(x: i32): i32 { if (x === 1 || x === 2) { return 1; } return f(x - 1) + f(x ...