noip模拟赛 黑骑士
题目描述
江爷爷给你出了一道题:
给你一个图,保证每个点最多属于一个简单环,每个点度数最多为3,求这个图有多少“眼镜图形个数”
保证图联通哦~
其中“眼镜图形个数”,定义为三元组(x,y,S),其中x和y表示图上的两个点,S表示一条x到y的简单路径,而且必
须满足:
1.x和y分别在两个不同的简单环上
2.x所在的简单环与路径S的所有交点仅有x,y所在的简单环与路径S的所有交点仅有y。
(x,y,S)与(y,x,S)算同一个眼镜
如果你无法理解,可以参考样例。
保证图是联通的
输入输出格式
输入格式:
第一行两个数n和m
之后m行,每行两个数x,y表示x和y之间有一条边。
输出格式:
输出一个数,表示眼镜的个数对19260817取膜的结果
输入输出样例
输入样例#1:
说明
样例#3,#4,#5,#6见下发的文件
非常抱歉,出了点小锅,sample5.out好像是空文件,应该是6734568
【子任务】
11 12
1 2
2 3
3 4
4 5
5 1
4 6
6 7
7 8
8 9
9 10
10 11
11 7
输出样例#1:
1
输入样例#2:
14 16
1 2
2 3
3 4
4 1
3 5
5 6
6 7
7 8
8 9
9 6
9 13
13 14
13 10
10 11
11 12
12 10
输出样例#2:
4
子任务会给出部分测试数据的特点。
如果你在解决题目中遇到了困难, 可以尝试只解决一部分测试数据。
测试点编号 n的范围 m的范围 特殊性质
测试点1 n <= 10 m <= 20
测试点2 n <= 20 m <= 40
测试点3 n <= 20 m <= 40
测试点4 n <= 2000 m <= 4000
测试点5 n <= 2000 m <= 4000
测试点6 n <= 1000000 m <= 2000000 简单环个数 <= 2000
测试点7 n <= 1000000 m <= 2000000 简单环个数 <= 2000
测试点8 n <= 1000000 m <= 2000000
测试点9 n <= 1000000 m <= 2000000
测试点10 n <= 1000000 m <= 2000000
分析:有环在是不好处理的,先把所有环给缩成一个点.观察样例可以发现,如果环与环中间还有x个环,那么实际上这两个点可以构成2^x个眼镜,因为中间的每个环既可以走上面也可以走下面.于是dfs缩点似乎可以拿70分.
其实一个眼镜中间的圆点可以看做根节点,两个镜框可以看做是树,那么我们可以以1号点为根节点来建一棵树来进行树形dp.记录的状态不能是以i为根的子树的眼镜数,因为这样不好转移,应该将状态定义为半眼镜数.对于环和圆点要分别讨论,每个环可以看做是两条路径,所以在统计答案或者更新f的时候都要*2,因为每个子树是独立的,最后要把它们合并到一起,这里利用乘法原理来解决.可以得到f[x] = Σf[son[x]],if x为环 then f[x] = f[x] * 2 + 1,因为子树的可以走两个方向,自己也可以当做一个半眼镜的端点,合并子树的时候ans += f[x] * f[son[x]],if x是环 then ans += f[x] * f[son[x]].因为f[x]随着子节点的处理越来越大,所以答案不会遗漏.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = , maxm = , mod = ; int n, m, head[maxn], nextt[maxm], to[maxm], tot = , cnt, fa[maxn], scc[maxn], limit;
int head2[maxn], to2[maxm], nextt2[maxm], tot2 = ;
bool vis[maxn];
long long ans, f[maxn]; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void add2(int x, int y)
{
to2[tot2] = y;
nextt2[tot2] = head2[x];
head2[x] = tot2++;
} void find(int x, int y)
{
scc[x] = cnt;
if (x == y)
return;
find(fa[x], y);
} void dfs(int u)
{
vis[u] = ;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (v == fa[u] || scc[v])
continue;
if (vis[v])
{
cnt++;
find(u, v);
}
else
{
fa[v] = u;
dfs(v);
}
}
} void build(int u)
{
vis[u] = ;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (v == fa[u] || vis[v])
continue;
if (scc[u] != scc[v])
{
add2(scc[u], scc[v]);
add2(scc[v], scc[u]);
}
build(v);
}
} void solve(int u, int from)
{
f[u] = ;
for (int i = head2[u]; i; i = nextt2[i])
{
int v = to2[i];
if (v == from)
continue;
solve(v, u);
long long temp = f[u] * f[v] % mod;
if (u <= limit)
temp *= ;
ans = (ans + temp) % mod;
f[u] = (f[u] + f[v]) % mod;
}
if (u <= limit)
{
ans = (ans + f[u]) % mod;
f[u] = (f[u] * + ) % mod;
}
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
dfs();
limit = cnt;
for (int i = ; i <= n; i++)
if (!scc[i])
scc[i] = ++cnt;
memset(vis, , sizeof(vis));
build();
solve(, );
printf("%lld\n", ans); return ;
}
noip模拟赛 黑骑士的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- [BZOJ 2199] 奶牛议会
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2199 [算法] 2-SAT [代码] #include<bits/stdc++ ...
- js的45个技巧
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- [Apple开发者帐户帮助]九、参考(2)撤销特权
您可以撤消的证书取决于证书类型和您的角色.如果您是个人注册,则可以撤销所有类型的开发和分发证书,除非另有说明.组织团队的任何成员都可以撤销自己的开发证书,但只有帐户持有人或管理员可以撤销分发证书. 证 ...
- [Swift通天遁地]八、媒体与动画-(10)在项目中播放GIF动画
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- ThreadLocal原理及用法详解
背景 一直以来对ThreadLocal用法模棱两可,不知道怎么用今天好好研究了下给大家分享下. 1.讲解ThreadLocal之前先回顾下什么是取模.x^y.弱引用. 1. 取模运算实际上是计算两数相 ...
- oracle学习笔记(二十) 子程序——函数与触发器
子程序--函数 语法 之前select语句中使用的函数,都是SQL内置函数,我们可以通过自定义函数更满足我们的需要. 自定义函数的语法和存储过程差不多. create [or replace] $fu ...
- WP8开发常用解决方案收集
我其实不怎么做wp的东西.但是偶尔还是会用到, 但是wp8开发的资料确实难找.特开此贴,记录一些常见的解决方案 1.水平滑动动画(比如app首次使用说明就可以用这个做) http://www.cnbl ...
- JavaScript--String 字符串对象属性
访问字符串对象的属性length: stringObject.length; 返回该字符串的长度. var mystr="Hello World!"; var myl=mystr. ...
- 手势识别官方教程(7)识别缩放手势用ScaleGestureDetector和SimpleOnScaleGestureListener
1.Use Touch to Perform Scaling As discussed in Detecting Common Gestures, GestureDetector helps you ...
- 传值:web.xml传递参数 即在Servlet中获取web.xml里的值
传值:web.xml传递参数 在web.xml中的Servlet里配置多个init-param <servlet> ... <init-param> <param-nam ...