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


说一点东西:

昨天晚上$9:05$开始太不好了,我在学校学校$9:40$放学我呆到十点然后还要跑回家耽误时间....要不然$D$题就写完了

周末一些成绩好的同学单独在艺术楼上课然后晚上下第一节晚自习和他们在回廊里玩开灯之后再关上一片漆黑真好玩


A.Andryusha and Socks

日常煞笔提.....我竟然$WA$了一次忘了$n<<1$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,a,vis[N],now,ans;
int main(){
//freopen("in","r",stdin);
n=read()<<;
for(int i=;i<=n;i++){
a=read();
if(!vis[a]) now++,vis[a]=;
else now--;
ans=max(ans,now);
}
printf("%d",ans);
}



B.The Meeting Place Cannot Be Changed

题意:数轴上$n$个点告诉你每个点坐标和移动速度,找一个点使得所有点都到那个点时间最短,求最短时间

各种加权平均没搞过去,最后急了我这是信息学竞赛不是数学竞赛不是物理竞赛,二分答案水过去...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=6e4+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n;
double x[N],v[N];
bool check(double g){
double l=,r=1e9;
for(int i=;i<=n;i++) l=max(l,x[i]-g*v[i]),r=min(r,x[i]+g*v[i]);
return l<=r;
}
int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) x[i]=read();
for(int i=;i<=n;i++) v[i]=read();
double l=,r=1e9;
double eps=1e-;
while(r-l>eps){
double mid=(l+r)/;
if(check(mid)) r=mid;
else l=mid;
}
printf("%lf",l);
}



C.Andryusha and Colored Balloons

题意:一棵树,$a--b--c$这样的三个点不能是相同颜色,求染色最少用几种颜色,并输出一个方案

一眼看出与同一个点相连的颜色不同,最大度数$+1$就行了

然后被构造方案卡住了.....

想记录每个点的相邻点的颜色集合感觉会被菊花图卡(为什么别人都几百ms我77ms)

于是发现对于一个点除了父亲和自己颜色不是从小到大其他都可以从小到大分配,记录一下一个点分配到哪里遇到自己和父亲跳过就行了

MD想了好长时间

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,de[N],u,v;
struct edge{
int v,ne;
}e[N<<];
int h[N],cnt;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
int ans,col[N],fa[N],now[N];
void dfs(int u){
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(v==fa[u]) continue;
fa[v]=u;
now[u]++;
while(now[u]==col[u]||now[u]==col[fa[u]]) now[u]++;
col[v]=now[u];
dfs(v);
}
}
int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<n;i++) u=read(),v=read(),de[u]++,de[v]++,ins(u,v);
for(int i=;i<=n;i++) ans=max(ans,de[i]+);
printf("%d\n",ans);
fa[]=;col[]=;
dfs();
for(int i=;i<=n;i++) printf("%d ",col[i]);
}



D.Innokenty and a Football League

题意:

队伍$i$有两种候选名字$a_i\ b_i$,选了$b_i$的话不能有其他队伍$j$选了$a_j\:a_i==a_j$

每个队伍名字不能相同,求一个方案


发现有相同$a$的队伍只能选$b$,先处理这些

$a$唯一的队伍任意选,只要满足没有两只队伍选一样就行了,我建了个网络流.....

$s \rightarrow team \rightarrow name_a,name_b \rightarrow t$

容量都为$1$

(好像只有$Candy?$这个沙茶用了这么$zz$的做法)

然后比赛结束好没写完,后来又发现好多细节问题:

$1.$先把$a$唯一的队伍中那些已经被不唯一的选过的名字处理掉不要建到图里去

$2.$一个名字只能往$t$连一条边,所以判断一下$builded$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
typedef long long ll;
const int N=,M=1e5+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,a[N],b[N],m;
char str[];
int has[M],c[M]; int s,t;
struct edge{
int v,c,f,ne;
}e[M<<];
int cnt,h[N];
inline void ins(int u,int v,int c){
cnt++;
e[cnt].v=v;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].c=;e[cnt].f=;e[cnt].ne=h[v];h[v]=cnt;
}
int cur[N],d[N],vis[N];
int q[N],head,tail;
bool bfs(){
head=tail=;
memset(vis,,sizeof(vis));
d[s]=;vis[s]=;q[tail++]=s;
while(head!=tail){
int u=q[head++];
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]&&e[i].c>e[i].f){
vis[v]=;d[v]=d[u]+;
q[tail++]=v;
if(v==t) return true;
}
}
}
return false;
}
int dfs(int u,int a){
if(u==t||a==) return a;
int flow=,f;
for(int &i=cur[u];i;i=e[i].ne){
int v=e[i].v;
if(d[v]==d[u]+&&(f=dfs(v,min(e[i].c-e[i].f,a)))>){
flow+=f;
e[i].f+=f;
e[((i-)^)+].f-=f;
a-=f;
if(a==) break;
}
}
if(a) d[u]=-;
return flow;
}
int dinic(){
int flow=;
while(bfs()){
for(int i=s;i<=t;i++) cur[i]=h[i];
flow+=dfs(s,INF);
}
return flow;
} int id[M],tot;
string ss[M];
int choose[N];
int builded[N];
int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++){
scanf("%s",str);
int x=str[]-'A'+,y=str[]-'A'+,z=str[]-'A'+;
a[i]=x**+y*+z;
has[a[i]]++;
ss[a[i]]=string(str,); scanf("%s",str);
z=str[]-'A'+;
b[i]=x**+y*+z;
ss[b[i]]=ss[a[i]];ss[b[i]][]=str[]; m=max(m,max(a[i],b[i]));
//printf("hi %d %d ",a[i],b[i]);cout<<ss[a[i]]<<" "<<ss[b[i]]<<endl;
}
for(int i=;i<=n;i++) if(has[a[i]]>){
c[b[i]]++,choose[i]=b[i];
if(c[b[i]]>) {puts("NO");return ;}
} tot=n;
for(int i=;i<=n;i++) if(has[a[i]]==){
if(!id[a[i]]&&c[a[i]]==) id[a[i]]=++tot;
if(!id[b[i]]&&c[b[i]]==) id[b[i]]=++tot;
}
s=;t=tot+;
int sum=;
for(int i=;i<=n;i++) if(has[a[i]]==){
sum++;
ins(s,i,);
if(id[a[i]]){
int x=id[a[i]];
ins(i,x,);
if(!builded[x]) ins(x,t,),builded[x]=;
}
if(id[b[i]]){
int x=id[b[i]];
ins(i,x,);
if(!builded[x]) ins(x,t,),builded[x]=;
}
}
int flow=dinic();
if(flow!=sum){puts("NO");return ;} puts("YES"); for(int u=;u<=n;u++) if(has[a[u]]==){
for(int i=h[u];i;i=e[i].ne) if(e[i].f==){
if(e[i].v==id[a[u]]) choose[u]=a[u];
if(e[i].v==id[b[u]]) choose[u]=b[u];
}
} //for(int i=1;i<=n;i++) printf("choose %d %d %d\n",i,choose[i],1);
for(int i=;i<=n;i++) cout<<ss[choose[i]]<<'\n';
}

然后从__stdcall(我发现这个名字有毒卡latex)和$zyf2000$哪里看到$2SAT$做法

1、第一种相同,那么必须都选第二种 2、第二种相同,不能同时选第二种 3、第一种和第二种相同,不能同时选第一种和第二种




E.Underground Lab

题意:

$n$点$m$边找$k$条路径每个点至少覆盖一次,每条路径长度$\le \lceil \frac{2n}{k}\rceil$


赛后补提...

直接搞一个既不是$dfs$序也不是欧拉序列的$dfs$序列,访问完一个孩子就把父亲加入序列,序列长度不会超过$2*n$因为一个点最多给父亲贡献一次

然后第$7$个点貌似整除了$WA$了几次....又改了一个输出方式才过

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=4e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,k;
struct edge{
int v,ne;
}e[N<<];
int h[N],cnt;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
int vis[N];
int a[N<<],p;
void dfs(int u){
vis[u]=;
a[++p]=u;
for(int i=h[u];i;i=e[i].ne)
if(!vis[e[i].v]) dfs(e[i].v),a[++p]=u;
}
int main(){
//freopen("in","r",stdin);
n=read();m=read();k=read();
for(int i=;i<=m;i++) ins(read(),read());
dfs();
int c=ceil((double)*n/k);
int x=p/c,y=p%c,now=;
for(int i=;i<=k;i++){
if(i<=x){
printf("%d ",c);
for(int j=i;j<=i+c-;j++) printf("%d ",a[++now]);
}else if(i==x+&&y!=){
printf("%d ",y);
for(int j=;j<=y;j++) printf("%d ",a[++now]);
}else printf("1 1");
puts("");
}
return ;
}

F.http://www.cnblogs.com/candy99/p/6511222.html

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

  1. 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 ...

  2. 树的性质和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步,且这个步数是向上取 ...

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

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

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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. Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...

  2. input[type=file]样式更改以及图片上传预览

    以前知道input[type=file]可以上传文件,但是没用过,今天初次用,总感觉默认样式怪怪的,想修改一下,于是折腾了半天,总算是小有收获. 以上是默认样式,这里我想小小的修改下: HTML代码如 ...

  3. 炫酷线条动画--svg

    我们经常可以在一些页面看到看起来很酷的线条动画,有些可以用css实现,有些css就无能为力了,今天来研究另一种实现方式,svg 如果对svg是什么还不了解的话,可以先去看看svg的基础教程: 一般对于 ...

  4. java通过smtp发送电子邮件

    package com.sm.modules.oa.web; import javax.mail.Session; import javax.mail.Transport; import javax. ...

  5. 一对多(多对一)关系中的inverse和cascade属性

    转载请标明出处 http://www.cnblogs.com/haozhengfei/p/6049276.html 首先说一下inverse: "inverse" 直译过来就是&q ...

  6. 一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例

    说到 C 语言版本的程序,首先要解决的问题就是兼容性. 作为 20 年开发有 10 多年是在服务端的程序员,我深刻地感受到服务端平台的两极分化之严重,linux 派对 windows 那是超级的不屑一 ...

  7. 邓_PHP面试2

    又开始搞php了,好多php知识忘记了,学习php的方法是看面试题 下面是我搜集的一份php的面试题目 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) echo da ...

  8. iptabes的用法

    iptables的用法 基本用法: iptables [-t table] [subcommand] chain [rulenum] [options...] [match] [target] ipt ...

  9. 为什么我不愿意用ECharts

    前言 ECharts是百度一个使用 JavaScript 实现的开源可视化库,提供了创建多种多样的图标方式,包括坐标系,图例,提示,工具箱等基础组件,并在此上构建出折线图.柱状图.散点图.K线图.饼图 ...

  10. 史上最全的判断android,ios还是ipad访问,附上多种语言的实现方式

    js判断: (function(a,b){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elain ...