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. Mysql字段名与保留字冲突导致的异常解决

    一:引言 用hibernate建表时经常遇到的一个异常:Error executing DDL via JDBC Statement 方法: 查看报错sql语句.问题就在这里. 我是表名(字段名)与保 ...

  2. A2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)

    这次实现了JS端的DES加密与解密,并且C#端也能正确解析DES的密文(反之也实现了) 使用的代码如下,非常方便: <script src="A2D.js" type=&qu ...

  3. .Net高级进阶,教你如何构建企业模型数据拦截层,动态控制字段验证

    现在,你有一个MVC架构的web项目,你要完成一个注册功能. 前台传了3个值到你的控制器,分别是账号.密码.邮箱. 如图:现在你要在控制器里面判断,账号名称.密码.邮箱不能为空,并且名称和密码不超过1 ...

  4. Web 应用 WEB框架 HTTP协议 初识Django

    ----------------------------财富存在于人的思想里,你没找到路,不等于没有路,你想知道将来要得到什么,你必须知道现在应该先做什么和先放弃什么! [web 应用] web应用 ...

  5. H5 id选择器

    09-id选择器 迟到毁一生 早退穷三代 按时上下班 必成高富帅 <!DOCTYPE html> <html lang="en"> <head> ...

  6. Randomized Online PCA Algorithms with Regret Bounds that are Logarithmic in the Dimension

    目录 Setup of Batch PCA and Online PCA Hedge Algorithm 改进算法 用于矩阵 \(rounding()\) 前俩次,都用到了\(rounding()\) ...

  7. Echarts x轴文本内容太长的几种解决方案

    Echarts 标签中文本内容太长的时候怎么办 ? - 1对文本进行倾斜 在xAxis.axisLabe中修改rotate的值 xAxis: { data: ["衬衫11111", ...

  8. [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。

    想在python代码中输出汉字.但是老是出现SyntaxError: Non-ASCII character '\xe4' in file test.py on line , but no encod ...

  9. 什么是车辆识别代码(VIN)

    车辆识别代码(VIN),VIN是英文Vehicle Identification Number(车辆识别码)的缩写.因为ASE标准规定:VIN码由17位字符组成,所以俗称十七位码.正确解读VIN码,对 ...

  10. html总结:固定表格中单元格宽度

    当然要提前设置好table的width值,然后再写这个,使得每列宽度都相等. <style> table { table-layout: fixed; } </style>