小 W 算树
【问题描述】
山有苞棣,隰有树檖。未见君子,忧心如醉~
小 W 养了一棵有 N 个点的无根树,由于小 M 最喜欢二叉树了,为了讨小 M 欢喜,小 W想知道有多少个点作为根后,这棵树是一棵二叉树。注:二叉树,即每个节点最多有两个孩子的有根树。
【输入格式】
第一行一个整数 N,代表点数。
接下来 N-1 行,每行两个整数 X、Y,表示 X、Y 之间有一条连边。
【输出格式】
第一行一个整数 M,代表有 M 个点符合条件。
第二行 M 个用空格隔开的整数,为符合要求的点的编号,升序排列。
【输入输出样例】
root.in
4
1 2
1 3
1 4

root.out
3
2 3 4

【数据规模】
对于 20%的数据:N<=3
对于 40%的数据:N<=4
对于 60%的数据:N<=100
对于 80%的数据:N<=1000
对于 100%的数据:N<=100000

题解

如果树中某个点的度数大于3,则不存在可行解。

否则,如果树中某个点的度数小于3,即为可行解。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; int n;
bool flag;
int ind[100005],ans[100005]; int main()
{
int i,j,x,y;
freopen("root.in","r",stdin);
freopen("root.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
ind[x]++;
ind[y]++;
if(!flag&&(ind[x]>3||ind[y]>3)) flag=true;
}
if(flag) goto hhh;
for(i=1;i<=n;i++)
if(ind[i]==1||ind[i]==2)
{
ans[0]++;
ans[ans[0]]=i;
}
hhh:;
printf("%d\n",ans[0]);
for(i=1;i<=ans[0];i++)
printf("%d ",ans[i]);
fclose(stdin);
fclose(stdout);
return 0;
}

小 W 算数
【问题描述】
投我以木桃,报之以琼瑶~
得到树的小 M 非常开心,回送小 W 一个名单,名单背后藏着甜蜜的秘密!名单里名字都很奇怪,并且很多捣乱的同学把自己等价名字写很多次。
现在小 M 告诉小 W 名字的等价方式:
1. 选择一个名字 S
2. 选择 S 的一个偶数长前缀 T
3. 把 T 反转,得到新的 S
例如:‘wrhmly’->‘rwhmly’->‘mhwrly’->‘hmwrly’
为了使秘密更容易浮现,等价可传递:A 和 B 等价,B 和 C 等价,那么 A 和 C 也等价。
小 W 需要每次取两个等价的名字,把它们去掉,求出最后剩下多少名字。
【输入格式】
第一行一个整数 N,代表名字个数。
第 2 到 N+1 行,每行一个字符串表示一个名字。
【输出格式】
一行一个整数,表示剩下名字个数。
【输入输出样例】
list.in
20
iprlzgukfggzg
bmhxvjbrtkbxy
khapjiabbny
nqlwgmcyvdikt
nxromtvtpug
leealcapovm
ushnxwjczczbmd
bwhykzupcux
xrlboyuwlnsp
bbjoketeheezfs
dxfztrldomjqkv
dkbktqdtgfujcut
zfybzyuxgpnt
ffmsldrdftode
vopuufksxd
pqhbsiujwda
yhwbkzupcux
hkbabnapjiy
zqsqefrrzehtxn
yovinyguyudmv

list.out
16

list.in
7
esprit
wrhmly
jitui
tujii
mhwrly
hmwrly
tirpse

list.out
1
【数据规模】
对于 20%的数据:N<=20,字符串长度<=8
对于 100%的数据:N<=50
字符串长度最多为 50

题解

易证,一个长度为偶数的字符串中,若每一对在另一个字符串中的都有出现过的话(顺序任意),这两个字符串依题意认定为相同。

哈希后暴力枚举判断,记得判重。

长度为奇数的话最后一位一定相同,特判即可。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; int n,ans;
int len[105],hash[105],f[105],fa[105];
bool flag,u[100005];
char str[105][105];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
bool work(int x,int y)
{
int i,j,k,l;
bool gg,b[105];
l=len[x];
for(i=1;i<=l;i++) b[i]=false;
if(l&1&&str[x][l]!=str[y][l]) return false;
if(l&1)l--; for(i=1;i<=l-1;i+=2)
{
gg=true;
for(j=1;j<=l-1;j+=2)
if(!b[j])
{
if((str[x][i]==str[y][j]&&str[x][i+1]==str[y][j+1])
||(str[x][i+1]==str[y][j]&&str[x][i]==str[y][j+1]))
{
gg=false;
b[j]=true;
break;
}
}
if(gg) return false;
}
return true;
} int main()
{
int i,j,fx,fy;
for(i=2;i<=1000;i++)
freopen("list.in","r",stdin);
freopen("list.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("\n%s",str[i]+1);
len[i]=strlen(str[i]+1);
for(j=1;j<=len[i];j++)
hash[i]+=str[i][j];
}
for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(len[i]!=len[j]||hash[i]!=hash[j]) continue;
fx=find(i);
fy=find(j);
if(fx!=fy)
{
flag=work(i,j);
if(flag)
{
f[fx]=fy;
break;
}
}
}
for(i=1;i<=n;i++) fa[find(i)]++;
for(i=1;i<=n;i++)
if(fa[i])
if(fa[i]&1) fa[i]=1;
else fa[i]=0;
for(i=1;i<=n;i++) ans+=fa[i];
printf("%d",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

小 W 算术
【问题描述】
匪报也,永以为好也~
小 W 解开名单,一张地图浮现出来。图上有 N 个城市,M 条双向道路,每条道路都有长度 C。小 W 在城市 S,小 M 在城市 T。
地图上有 Q 个询问,给出 u、v,询问直接连接 u、v 城市的道路不通后小 W 离小 M 的最近距离。
为了小 W 尽快找到小 M,地图上两个城市之间最多只有一条道路。
【输入格式】
第一行两个整数 N,M,表示城市个数和道路数。
之后 M 行,每行三个整数 x,y,c,表示 x 和 y 城市之间有一条长度为 c 的道路。
之后一行两个整数 S,T,表示小 W 和小 M 的位置。
之后一行一个整数 Q,表示询问个数。
之后 Q 行,每行两个整数 u,v。
【输出格式】
对于每个询问,用一行输出最短长度,如果删除道路后不通则输出“Infinity”。
【输入输出样例】
dream.in
6 7
1 2 1
2 3 1
3 4 2
4 5 1
5 6 1
1 3 3
4 6 3
1 6
4
1 2
1 3
4 3
6 5

dream.out
7
6
Infinity
7
【数据规模】
对于 20%的数据:1<=N,M,Q<=1000
对于 100%的数据:1<=N,M,Q<=200000,1<=c<=10^9

题解

方法一:dijkstra+线段树

详情请见:http://tonyfang.is-programmer.com/posts/205232.html

方法二:

首先我们分别做两次最短路计算出 以及 分别表示 的最短路长度和 的最短路长度。
如果 则向图 中添加边
由于所有边权都为正整数,所以很容易看出 是一个有向无环图。
然后考虑 里所有这样的边 即删除 之后 不再连通,我们不妨称它们为关键边。容易当发现删除的边不是关键边时,答案始终为 。所以我们只考虑删除关键边的询问。关键边即为割边。
我们求出关键边之后,可以发现这些关键边把整个图 分割成了若干个联通块,而且这些连通块可以排成一个序列。
然后我们从左到右处理所有的联通块,并用一个堆维护块与块之间的边。维护方式如下:
假设当前处理的联通块为 ,我们把所有起点在 里,终点在 之后的联通块里的边  
添加进堆里,权值为 当我们处理一个关键边询问的时候,直接输出堆里的最小元素就行了。
当联通块 处理完成后,我们把所有终点在 里的边从堆里删除。也可以去堆顶是判断该边的终点是否在所在关键边之前。
每条边只会入堆一次出堆一次,保证时间复杂度。

【2016常州一中夏令营Day6】的更多相关文章

  1. 【2016常州一中夏令营Day7】

    序列(sequence)[题目描述]蛤布斯有一个序列,初始为空.它依次将 1-n 插入序列,其中 i插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边).它希望你帮它求出最终序列.[输入数据 ...

  2. 【2016常州一中夏令营Day5】

    小 W 拼图[问题描述]小 W 和小 M 一起玩拼图游戏啦~小 M 给小 M 一张 N 个点的图,有 M 条可选无向边,每条边有一个甜蜜值,小 W 要选K 条边,使得任意两点间最多有一条路径,并且选择 ...

  3. 【2016常州一中夏令营Day4】

    小 W 走迷宫[问题描述]小 W 被小 M 困在了一个方格矩阵迷宫里,矩阵边界在无穷远处,我们做出如下的假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立即塌陷无 ...

  4. 【2016常州一中夏令营Day3】

    小 W 摆石子[问题描述]小 W 得到了一堆石子,要放在 N 条水平线与 M 条竖直线构成的网格的交点上.因为小 M 最喜欢矩形了,小 W 希望知道用 K 个石子最多能找到多少四边平行于坐标轴的长方形 ...

  5. 【2016常州一中夏令营Day2】

    小 W 学数学[问题描述]为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数.[输入格式]第一行一个整数 N,代表点数.接下来 N 行,每行两个非负整数 X.Y, ...

  6. 【2016常州一中夏令营Day1】

    Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...

  7. 【FJ省队训练&&NOIP夏令营】酱油&&滚粗记

    FJOI2016省队训练滚粗记 2016.07.03~2016.07.06(Day1~5) 在学校期末考.因为才省选二试too young too simple爆蛋了所以下半个学期只能滚回去读文化课, ...

  8. 夏令营提高班上午上机测试 Day 2 解题报告

    那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧……   是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...

  9. 百练6255-单词反转-2016正式B题

    百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问   B:单词翻转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个 ...

随机推荐

  1. More Effective C++: 04效率

    16:牢记80-20准则 80-20准则说的是大约20%的代码使用了80%的程序资源:大约20%的代码耗用了大约80%的运行时间:大约20%的代码使用了80%的内存:大约20%的代码执行80%的磁盘访 ...

  2. Handler, AsyncTask用法简单示例

    package com.jim.testapp; import android.app.Activity; import android.os.AsyncTask; import android.os ...

  3. springboot 数据访问【转】【补】

    六.SpringBoot与数据访问 1.JDBC pom.xml配置 <dependencies> <dependency> <groupId>org.spring ...

  4. QT_OPENGL-------- 2.shader

    用可编程管线绘制一个三角形 1.以上一节window为基准,进行绘制. 2.下载编译glew,并在.pro添加动态链接,并在头文件中引用. LIBS +=-L/usr/lib64 -lGLEW 可能根 ...

  5. 发布SaaS加速器:我们不做SaaS,我们只做SaaS生态的推进者和守护者

    摘要: 此次阿里云推出的SaaS加速器,涵盖商业中心.能力中心.技术中心三大板块,是阿里巴巴商业.能力和技术的一次合力输出:技术能力在这里沉淀为一个个模块,ISV和开发者只要通过简单的操作,写很少的代 ...

  6. 设置PHP最长运行时间

    通常来说,默认的PHP程序最大运行时间是30s,如果你的程序运行超过这个时间限制,那么会有类似Maximum execution time of 30 seconds exceeded的报错. 有几种 ...

  7. 原生js扫雷代码

    思路要点: 1. 随机地雷放到一个二维数组中: 2. 每一个格子要统计周围有几颗雷: 3. 每一个格子是否处于打开状态,用于判断是否赢得游戏: 4. 如果点击到周围没有雷的地方,把周围的打开: 具体的 ...

  8. Oracle使用——PLSQL查询表结构并导出EXCEL

    背景 有一次需要查询Oracle数据库中的所有表接口并且导出excel,方法记录如下 使用 使用PLSQL工具查询表结构,SQL语句如下 SELECT B.TABLE_NAME AS '表名', C. ...

  9. JSTL的时间格式化

    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 开头第一句必须上 ...

  10. WPF 线段Line过长渲染出现的问题

    原文:WPF 线段Line过长渲染出现的问题 在使用WPF的时候,可以做一个实验,在canvas里添加一条线段Line,StrokeThickness属性设置为1,然后通过放大canvas或者调整li ...