Div1单场我从来就没上过分,这场又剧毒,半天才打出B,C挂了好几次最后还FST了,回紫了。

AC:AB Rank:340 Rating:2204-71->2133

Div2.B.The Meeting Place Cannot Be Changed

题目大意:n个人,第i个人位于xi,速度为vi,找到一个点使得所有人到这个点的耗时最小,输出耗时。(n<=60000)

思路:二分答案,知道耗时后可以求出每个人能到达的区间,如果所有区间有交则合法,复杂度O(nlog)。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 60000
int x[MN+],v[MN+];
int main()
{
fread(B,,<<,stdin);
int n=read(),i,p;double l=,r=0x3FFFFFFF,mid,mn,mx,ans;
for(i=;i<=n;++i)x[i]=read();
for(i=;i<=n;++i)v[i]=read();
for(p=;p<=;++p)
{
mid=(l+r)/;
for(mn=1e18,mx=-1e18,i=;i<=n;++i)
mn=min(mn,x[i]+mid*v[i]),mx=max(mx,x[i]-mid*v[i]);
if(mx-mn<1e-)ans=r=mid;
else l=mid;
}
printf("%.12lf",ans);
}

A.Andryusha and Colored Balloons

题目大意:给出一棵n个点的树,距离为2以内的点颜色不能相同,求最小染色方案。(n<=200,000)

思路:每个点对他的儿子染色,每个儿子颜色不与他和他父亲还有染过的儿子颜色相同即可,复杂度O(n)。

#include<cstdio>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 200000
struct edge{int nx,t;}e[MN*+];
int h[MN+],en,r[MN+],fa[MN+],c[MN+];
inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
void dfs(int x)
{
int i,j=;
for(i=h[x];i;i=e[i].nx)if(e[i].t!=fa[x])
{
while(c[x]==++j||c[fa[x]]==j);
c[e[i].t]=j;fa[e[i].t]=x;dfs(e[i].t);
}
}
int main()
{
fread(B,,<<,stdin);
int n=read(),i,x,y,rt=;
for(i=;i<n;++i)
{
if(++r[x=read()]>r[rt])rt=x;
if(++r[y=read()]>r[rt])rt=y;
ins(x,y);ins(y,x);
}
printf("%d\n",r[rt]+);
dfs(c[]=);
for(i=;i<=n;++i)printf("%d ",c[i]);
}

B.Innokenty and a Football League

题目大意:n支球队要取名,每支球队有两种选择,要求:1.所有球队名字不能相同;2.如果两支球队第一种选择相同,他们都只能选第二种。(n<=1000)

思路:转化成2-sat模板题就可以了。2-sat构造解我不是很熟练,打了很久。

#include<iostream>
using namespace std;
#define MN 1000
#define MV 2000
#define ME 5000000
string s[MN+][],sa,sb;
struct edge{int nx,t;}e[ME*+];
int h[MV+],en,d[MV+],l[MV+],cnt,z[MV+],zn,inz[MV+],b[MV+],bn;
int rh[MV+],r[MV+],c[MV+],q[MV+],qn;
inline void ins(int*h,int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
void tj(int x)
{
d[x]=l[x]=++cnt;inz[z[zn++]=x]=;
for(int i=h[x];i;i=e[i].nx)
{
if(!d[e[i].t])tj(e[i].t);
if(inz[e[i].t]&&l[e[i].t]<l[x])l[x]=l[e[i].t];
}
if(d[x]==l[x])for(++bn;z[zn]!=x;inz[z[zn]]=)b[z[--zn]]=bn;
}
int main()
{
int n,i,j,k;
cin>>n;
for(i=;i<=n;++i)
{
cin>>sa>>sb;
s[i][]=s[i][]=s[i][]+sa[]+sa[];
s[i][]+=sa[];s[i][]+=sb[];
}
for(i=;i<=n;++i)for(j=;j<=n;++j)if(i!=j)
{
if(s[i][]==s[j][])ins(h,i,j+n),ins(h,i+n,j+n);
if(s[i][]==s[j][])ins(h,i,j);
if(s[i][]==s[j][])ins(h,i+n,j+n);
if(s[i][]==s[j][])ins(h,i+n,j);
}
for(i=;i<=n<<;++i)if(!d[i])tj(i);
for(i=;i<=n;++i)if(b[i]==b[i+n])return puts("NO"),;
puts("YES");
for(i=;i<=n<<;++i)for(j=h[i];j;j=e[j].nx)
if(b[i]!=b[e[j].t])ins(rh,b[e[j].t],b[i]),++r[b[i]];
for(i=;i<=bn;++i)if(!r[i])q[++qn]=i;
for(i=;i<=qn;++i)
{
if(!c[q[i]])
{
for(j=;j<=n;++j)if(b[j]==q[i])c[b[j+n]]=;
for(;j<=n<<;++j)if(b[j]==q[i])c[b[j-n]]=;
}
for(j=rh[q[i]];j;j=e[j].nx)if(!--r[e[j].t])q[++qn]=e[j].t;
}
for(i=;i<=n;++i)cout<<(c[b[i]]?s[i][]:s[i][])<<endl;
}

C.Underground Lab

题目大意:给出n个点m条边的无向联通图,构造k条长度不超过2n/k(向上取整)的路径覆盖所有点。(n,m<=200,000,k<=n)

思路:考虑该图的一颗生成树,dfs一遍,进入节点和从子节点回来时都把当前点加入路径里,就得到一个长度为2n-1的路径覆盖,分成k段输出即可,复杂度O(n)。我输出写的巨丑挂了,非常难受。

AC代码

#include<cstdio>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 200000
struct edge{int nx,t;}e[MN*+];
int f[MN+],h[MN+],en,ans[MN*+],cnt;
int gf(int k){return f[k]?f[k]=gf(f[k]):k;}
inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
void dfs(int x,int fa)
{
ans[++cnt]=x;
for(int i=h[x];i;i=e[i].nx)if(e[i].t!=fa)
{
dfs(e[i].t,x);
ans[++cnt]=x;
}
}
int main()
{
fread(B,,<<,stdin);
int n,m,k,x,y,i,j;
n=read();m=read();k=read();
while(m--)
{
x=read();y=read();
if(gf(x)!=gf(y))f[gf(x)]=gf(y),ins(x,y),ins(y,x);
}
dfs(,);--cnt;
for(x=;x*k<cnt;++x);
for(i=;i<=k;++i)
{
printf("%d ",x);
for(j=;j<=x;++j)printf("%d ",cnt?ans[((i-)*x+j-)%cnt+]:);
puts("");
}
}

D.Axel and Marston in Bitland

题目大意:给出一张n个点m条边的图,边权为0或1,按以下方式构造一个01序列:一开始为0,每次将当前串取反加到原串后面(0,01,0110,01101001……),问从点1出发,按这个01序列走对应边权的边,最多能走多少步,如果超过10^18输出-1。(n<=500,m<=2*n^2)

思路:令s[i][0/1]表示长度为2^i的原串/取反串,则有s[i+1][0]=s[i][0]+s[i][1],s[i+1][1]=s[i][1]+s[i][0],我们把原图按这个方式bitset加速倍增一下,然后DP就可以了,复杂度O(n^3/32*log10^18),时限5s而且cf机子快,非常科学。

#include<cstdio>
#include<cstring>
#include<bitset>
#include<algorithm>
#include<iostream>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 500
#define MK 60
#define INF 1000000000000000000LL
bitset<MN+> g[MK+][][MN+];
long long f[MK+][MN+][],ans;
int main()
{
int n,m,i,j,k,x,y;
n=read();m=read();
while(m--)
{
x=read();y=read();
g[][read()][x][y]=;
}
for(k=;k<MK;++k)for(i=;i<=n;++i)for(j=;j<=n;++j)
{
if(g[k][][i][j])g[k+][][i]|=g[k][][j];
if(g[k][][i][j])g[k+][][i]|=g[k][][j];
}
memset(f,,sizeof(f));f[k+][][]=;
for(k=MK;k>=;--k)
{
for(i=;i<=n;++i)f[k][i][]=f[k+][i][],f[k][i][]=f[k+][i][];
for(i=;i<=n;++i)for(j=;j<=n;++j)
{
if(g[k][][i][j])f[k][j][]=max(f[k][j][],f[k+][i][]+(1LL<<k));
if(g[k][][i][j])f[k][j][]=max(f[k][j][],f[k+][i][]+(1LL<<k));
}
}
for(i=;i<=n;++i)ans=max(ans,max(f[][i][],f[][i][]));
cout<<(ans>INF?-:ans);
}

Codeforces Round #403 (Div. 1, based on Technocup 2017 Finals)的更多相关文章

  1. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)

    Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) 说一点东西: 昨天晚上$9:05$开始太不好了,我在学校学校$9:40$放 ...

  2. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) D. Innokenty and a Football League

    地址:http://codeforces.com/contest/782/problem/D 题目: D. Innokenty and a Football League time limit per ...

  3. 树的性质和dfs的性质 Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) E

    http://codeforces.com/contest/782/problem/E 题目大意: 有n个节点,m条边,k个人,k个人中每个人都可以从任意起点开始走(2*n)/k步,且这个步数是向上取 ...

  4. 2-sat Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) D

    http://codeforces.com/contest/782/problem/D 题意: 每个队有两种队名,问有没有满足以下两个条件的命名方法: ①任意两个队的名字不相同. ②若某个队 A 选用 ...

  5. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) E Underground Lab

    地址:http://codeforces.com/contest/782/problem/E 题目: E. Underground Lab time limit per test 1 second m ...

  6. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) C Andryusha and Colored Balloons

    地址:http://codeforces.com/contest/782/problem/C 题目: C. Andryusha and Colored Balloons time limit per ...

  7. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) B. The Meeting Place Cannot Be Changed

    地址:http://codeforces.com/contest/782/problem/B 题目: B. The Meeting Place Cannot Be Changed time limit ...

  8. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) A. Andryusha and Socks

    地址:http://codeforces.com/contest/782/problem/A 题目: A. Andryusha and Socks time limit per test 2 seco ...

  9. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)A模拟 B三分 C dfs D map

    A. Andryusha and Socks time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals )D. Innokenty and a Football League(2-sat)

    D. Innokenty and a Football League time limit per test 2 seconds memory limit per test 256 megabytes ...

随机推荐

  1. 【Swift】 iOS开发容易产生Bug的地方

    1.隐藏navigationBar(尤其是多级隐藏) 2.共用collectionView或tableView 3.继承关系下,注意覆写父类时的super方法的调用 4.关于权限的问题(相机权限,相册 ...

  2. Linux基础常用命令

    Linux 下命令有很多,并且很多命令用法又有不同的选项,这里介绍一些常用的最基本的Linux命令的用法,希望给大家留下便利之处. 1.cd 切换目录.例如 cd /home 可切换到home目录,  ...

  3. 在bootstrap中让竖向排列的输入框水平排列

    在bootstrap中可以使用自带的样式标记来控制样式,但是同时可以利用最原始的css样式来解决达到需求 如下所示可以看出来两个inline-block就可以使得两个水平排列 block和inline ...

  4. LR之error(一)

    1 录制时频繁卡死的解决方案 添加数据保护 路径:计算机--高级系统设置(环境变量设置的上级窗口)--高级--设置--数据执行保护 更改LR录制设置,将run-time setting的brower改 ...

  5. ASP.NET 访问项目网站以外的目录文件

    简单的说,可以通过在 IIS 添加虚拟目录的方法做到,获取访问路径的时候就用 HttpContext.Current.Server.MapPath("~/xxx"); 的方式. 下 ...

  6. Python内置函数(43)——type

    英文文档: class type(object) class type(name, bases, dict) With one argument, return the type of an obje ...

  7. MySQL中使用sql语句获得表结构

    最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...

  8. Java 10 的 10 个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  9. javascript实现继承3种方式: 原型继承、借用构造函数继承、组合继承,模拟extends方法继承

    javascript中实现继承的三种方式:原型继承.借用构造函数继承.混合继承: /* js当中的继承 js中 构造函数 原型对象 实力对象的关系: 1 构造函数.prototype = 原型对象 2 ...

  10. 如何在命令行中让python2和python3同存

    初学python,你可能同时安装了python2和3.在我们安装好python之后,我们会面临这样一个问题,在命令行输入"python",可能会出错,或者只能调用其中一个版本,py ...