hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
题目1 : 彩色的树
描述
给定一棵n个节点的树,节点编号为1, 2, …, n。树中有n - 1条边,任意两个节点间恰好有一条路径。这是一棵彩色的树,每个节点恰好可以染一种颜色。初始时,所有节点的颜色都为0。现在需要实现两种操作:
1. 改变节点x的颜色为y;
2. 询问整棵树被划分成了多少棵颜色相同的子树。即每棵子树内的节点颜色都相同,而相邻子树的颜色不同。
输入
第一行一个整数T,表示数据组数,以下是T组数据。
每组数据第一行是n,表示树的节点个数。接下来n - 1行每行两个数i和j,表示节点i和j间有一条边。接下来是一个数q,表示操作数。之后q行,每行表示以下两种操作之一:
1. 若为"1",则询问划分的子树个数。
2. 若为"2 x y",则将节点x的颜色改为y。
输出
每组数据的第一行为"Case #X:",X为测试数据编号,从1开始。
接下来的每一行,对于每一个询问,输出一个整数,为划分成的子树个数。
数据范围
1 ≤ T ≤ 20
0 ≤ y ≤ 100000
小数据
1 ≤ n, q ≤ 5000
大数据
1 ≤ n, q ≤ 100000
- 样例输入
-
2
3
1 2
2 3
3
1
2 2 1
1
5
1 2
2 3
2 4
2 5
4
1
2 2 1
2 3 2
1 - 样例输出
-
Case #1:
1
3
Case #2:
1
5 分析:主要题意就是输出一棵树中连通分量的个数,但此题目里的连通分量和平时的连通分量不太一样,就是每个连通分量内的
节点的颜色必须是一样的,否则就要划分到不同的连通分量上。常规的思路,每次在修改完某些节点后,但我们想去计算这棵树
中有多少子树(即连通分量),完全可以用dfs搜索,但是这道题目中如果询问次数很多,必然超时!
所以需要修改思路。
假设我们当前修改节点x的颜色,将其颜色修改为y。
在我们修改后,其对应的颜色可能会发生改变,也可能不会。子树的数目可能增加,也可能减少,还有可能不变。
回到节点x,我们修改节点x的颜色后,我们访问所有与x节点有直接相邻关系的节点xx。
假设:原来x的颜色为ori, 修改后的颜色为cur,将会产生下面四种情况:( f[]数组保存所有节点的颜色信息 )
ans:表示x节点颜色修改前的子树的个数:接下来计算x节点颜色的修改对子树数目的影响
ori==f[xx] && cur==f[xx] ans不变
ori==f[xx] && cur!=f[xx] ans++;
ori!=f[xx] && cur==f[xx] ans--;
ori!=f[xx] && cur!=f[xx] ans不变 代码:(本以为此算法同样可以过大数据,但还是TLE了)#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <algorithm>
#define N 5010 using namespace std; int map[N][N];
int fa[N];
bool vis[N];
int n, q; int main()
{
int t;
scanf("%d", &t);
int i, j, k;
int cnt=1; while(t--)
{
scanf("%d", &n);
memset(fa, 0, sizeof(fa));
memset(map, 0, sizeof(map)); int u, v;
for(i=0; i<n-1; i++)
{
scanf("%d %d", &u, &v);
map[u][v]=1;
map[v][u]=1;
} scanf("%d", &q);
printf("Case #%d:\n", cnt++ );
int ans=1;
while(q--)
{
int dd;
int x, y;
scanf("%d", &dd);
if(dd==1)
{
printf("%d\n", ans );
}
else
{
scanf("%d %d", &x, &y);
int ori=fa[x];
fa[x]=y;
int cur=y;
for(i=1; i<=n; i++)
{
if(map[x][i]==1 && i!=x )
{
if(ori==fa[i] && cur!=fa[i] )
{
ans++;
}
else if(ori!=fa[i] && cur!=fa[i])
{
ans=ans+0;
}
else if(ori==fa[i] && cur==fa[i])
{
ans+=0;
}
else if(ori!=fa[i] && cur==fa[i])
{
ans--;
}
}
}
}
}
}
return 0;
}题目3 : 质数相关
时间限制:2000ms单点时限:1000ms内存限制:256MB描述
两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数。一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关。如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关。现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小。
输入
第一行为一个数T,为数据组数。之后每组数据包含两行。
第一行为N,为集合S的大小。第二行为N个整数,表示集合内的数。
输出
对于每组数据输出一行,形如"Case #X: Y"。X为数据编号,从1开始,Y为最大的子集的大小。
数据范围
1 ≤ T ≤ 20
集合S内的数两两不同且范围在1到500000之间。
小数据
1 ≤ N ≤ 15
大数据
1 ≤ N ≤ 1000
- 样例输入
-
3
5
2 4 8 16 32
5
2 3 4 6 9
3
1 2 3 - 样例输出
-
Case #1: 3
Case #2: 3
Case #3: 2
此题目:小数据的情况下,直接暴力就可以了,大数据的算法没想出来!
代码:#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <vector>
#include <algorithm>
#define N 100000+10 using namespace std;
int f[500002];
void sushu()
{
memset(f, 0, sizeof(f));
int i=2;
f[1]=1;
f[0]=1;
int dd=sqrt(500000+0.5);
while(i<=dd)
{
for(int j=i*2; j<=500000; j+=i)
{
f[j]=1;
}
i++;
while(f[i]==1)
i++;
}
} int a[1010];
int b[1010], e=0; int main()
{
int t;
scanf("%d", &t);
sushu();
int n;
int i, j, k; int dd=1;
while(t--)
{
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
int len=0;
bool flag;
int cnt;
for(i=0; i<n; i++)
{ memset(b, 0, sizeof(b));
e=0;
b[e++]=a[i];
for(j=i+1; j<n; j++)
{
flag=true;
for(k=0; k<e; k++)
{
if(a[j]%b[k]==0 && f[a[j]/b[k]]==0 )
{
flag=false;
break;
}
}
if(flag==true)
b[e++]=a[j];
}
if(e > len )
len = e;
}
printf("Case #%d: %d\n", dd++, len );
}
return 0;
}
hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)的更多相关文章
- hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)
题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...
- 编程之美2015初赛第一场 hihoCoder #1156 : 彩色的树(染色问题)
#1156 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, , …, n.树中有n - 1条边,任意两个节点间恰好有一条 ...
- hihocoder #1170 机器人 && 编程之美2015复赛
题意: 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小冰的N个机器人兄弟排成一列,每一个机器人有一个颜色. 如今小冰想让同一颜色的机器人聚在一起.即随意两个同颜色的 ...
- 编程之美2015 资格赛 hihocoder 题目2: 回文字符序列
思路:暴力搜,用BFS的方式,生成每一种可能,再对每一种可能进行判断是否回文,进行统计.严重超时!计算一个25个字符的,大概要20多秒! #include <iostream> #incl ...
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...
- 编程之美2013 初赛一 A - 竞价 学习大牛的思路
这题我做了N久也做不出....赛后看了大牛AC的思路.... Program: #include<iostream> #include<cmath> #include<s ...
- 2017“编程之美”终章:AI之战勇者为王
编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...
- 编程之美2014挑战赛 复赛 Codehunt平台试题答案
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- LeetCode:Climbing Stairs(编程之美2.9-斐波那契数列)
题目链接 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...
随机推荐
- ES聚合查询实例
查询特定渠道分享数量最大的30个文章的uuid: { , "query": { "bool": { "must": [ { "te ...
- GIS可视化——聚散图
一.简介 随着计算机的发展,浏览器的不断进步与完善,现今大部分浏览渲染效率有了很大的改善, 但是由于浏览器厂商的不同,浏览器种类繁多,性能不一,并且很多用户还使用着不少老的浏览, 那些如IE6.7等的 ...
- 2017.2.21 Java中正则表达式的学习及示例
学习网站:菜鸟教程 http://www.runoob.com/java/java-regular-expressions.html 1 正则表达式的基本使用 (1)类 正则表达式并不仅限于某一种语言 ...
- GraphMatrix::BFS广度优先搜索
查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...
- [Java开发之路](23)装箱与拆箱
1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...
- Cocostudio学习笔记(5) Text + TextAtlas + TextBMFont
下午一群大学生到我们公司參观学习,搞得我好紧张.于是滔滔不绝的给他们介绍了怎样开发一款游戏... 今晚研究的控件就是三个label:Text,TextAtlas,TextBMFont 我先在cocos ...
- python tkinter module的用法
tkinter windows下从python3.2版本之后是自动安装的. python3.3之后的引入方式: >>> import _tkinter>>> imp ...
- ASP.NET页面间传值的几种方式
ASP.NET页面间传值的几种方式 1.使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在 ...
- a标签javascript传参不正确的解决办法!
代码部分: <a href="javascript:void(0);" onClick="findList(${goodsClassify.id})"&g ...
- 【文献阅读】Stack What-Where Auto-encoders -ICLR-2016
一.Abstract 提出一种新的autoencoder -- SWWAE(stacked what-where auto-encoders),更准确的说是一种 convolutional autoe ...