hdu 2254 奥运
思路: 矩阵乘法
分析:
1 题目给定一个有向图,要求t1-t2天内v1-v2的路径的个数
2 根据离散数学里面的可达矩阵的性质,我们知道一个有向图的邻接矩阵的前n次幂的和即为可达矩阵,那么要求[t1-t2]之内的路径的条数,假设邻接矩阵为A,那么要求的就是A^(t1-1)+A^(t1)+...+A^t2,为什么是从t1-1开始呢,因为邻接矩阵本身代表走一步的结果
3 还有点的范围很大,边数很少,所以我们应该要进行离散化
4 但是数据量很大,对于具体的一组我们应该要事先求出具体的每一个矩阵,然后直接使用即可
代码:
- /************************************************
- * By: chenguolin *
- * Date: 2013-08-25 *
- * Address: http://blog.csdn.net/chenguolinblog *
- ***********************************************/
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- typedef __int64 int64;
- const int MOD = 2008;
- const int MAXN = 10000;
- const int N = 30;
- int n , pos;
- int64 num[2*MAXN];
- struct Edge{
- int64 x;
- int64 y;
- };
- Edge e[MAXN];
- struct Matrix{
- int mat[N][N];
- Matrix operator*(const Matrix& m)const{
- Matrix tmp;
- for(int i = 0 ; i < pos ; i++){
- for(int j = 0 ; j < pos ; j++){
- tmp.mat[i][j] = 0;
- for(int k = 0 ; k < pos ; k++){
- tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
- tmp.mat[i][j] %= MOD;
- }
- }
- }
- return tmp;
- }
- };
- Matrix ma[MAXN];
- int search(int64 x){
- int left = 0;
- int right = pos-1;
- while(left <= right){
- int mid = (left+right)>>1;
- if(num[mid] == x)
- return mid;
- else if(num[mid] < x)
- left = mid+1;
- else
- right = mid-1;
- }
- return -1;
- }
- void init(Matrix &m){
- memset(m.mat , 0 , sizeof(m.mat));
- sort(num , num+pos);
- pos = unique(num , num+pos)-num;
- for(int i = 0 ; i < n ; i++){
- int x = search(e[i].x);
- int y = search(e[i].y);
- m.mat[x][y]++;
- }
- }
- void Pow(Matrix m){
- ma[0] = m;
- for(int i = 1 ; i < MAXN ; i++)
- ma[i] = ma[i-1]*m;
- }
- void solve(){
- Matrix m;
- init(m);
- Pow(m);
- int64 v1 , v2;
- int k , t1 , t2;
- scanf("%d" , &k);
- while(k--){
- scanf("%I64d%I64d%d%d" , &v1 , &v2 , &t1 , &t2);
- if(t1 > t2 || t2 == 0){
- puts("0");
- continue;
- }
- int x = search(v1);
- int y = search(v2);
- if(x == -1 || y == -1){
- puts("0");
- continue;
- }
- int sum = 0;
- for(int i = t1-1 ; i < t2 ; i++){
- sum += ma[i].mat[x][y]%MOD;
- sum %= MOD;
- }
- printf("%d\n" , sum);
- }
- }
- int main(){
- while(scanf("%d" , &n) != EOF){
- pos = 0;
- for(int i = 0 ; i < n ; i++){
- scanf("%I64d%I64d" , &e[i].x , &e[i].y);
- num[pos++] = e[i].x;
- num[pos++] = e[i].y;
- }
- solve();
- }
- return 0;
- }
hdu 2254 奥运的更多相关文章
- HDU 2254 奥运(矩阵高速幂+二分等比序列求和)
HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 依据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k ...
- hdu 2254 奥运(邻接矩阵应用)
Problem Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up! 比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强 ...
- HDU 2254 奥运(数论+矩阵)
题目中文的不解释啊. .. 须要注意的就是:离散数学中,有向图的邻接矩阵A表示全部点之间路径长度为1的路径数量,A^n则表示路径长度为n的路径数量.故须要求某两点在(A^t1)~(A^t2)的路径数量 ...
- HDU 2254 奥运(矩阵+二分等比求和)
奥运 [题目链接]奥运 [题目类型]矩阵+二分等比求和 &题解: 首先离散化城市,之后就是矩阵快速幂了,但让求的是A^(t1)+A^(t1+1)+...+A^(t2),我先想的是打表,但时间真 ...
- HDU - 2254 奥运 (求等比数列和)
Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up! 比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的 ...
- 【矩阵快速幂】之奥运 hdu 2254
1.城市的编号不是从0到n-1,而是随便的一个数字,需要离散化否则不能存相关信息 2.城市数不超过30,也就是说我的方法开矩阵不超过60,但是我残念的一开始以为最多可能有20000个不同城市 血 ...
- HDU 2254
http://acm.hdu.edu.cn/showproblem.php?pid=2254 矩阵乘法两个经典问题的综合题,还要离散化和处理边界,好题啊好题 题意容易理解错,每一天是独立的,所以根据加 ...
- hdu 2254(矩阵)
题意:指定v1,v2,要求计算出在t1,t2天内从v1->v2的走法 思路:可以知道由矩阵求,即将其建图A,求矩阵A^t1 + ...... + A^t2. A^n后,/*A.xmap[v1 ...
- hdu2254 奥运 矩阵的应用
hdu2254 奥运 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2254 题意:题目让我们求得是的可以得到的金牌数量,而和金牌数量=在t1到t2天( ...
随机推荐
- C++编程规范之17:避免使用“魔数”
摘要: 程序设计并非魔术,所以不要故弄玄虚,要避免在代码中使用诸如42和3.1415926这样的文字常量.它们本身没有提供任何说明,并且因为增加了难于检测的重复而使维护更加复杂.可以用符号名称和表达式 ...
- 高性能WEB开发(11) - flush让页面分块,逐步呈现
高性能WEB开发(11) - flush让页面分块,逐步呈现 在处理比較耗时的请求的时候,我们总希望先让用户先看到部分内容,让用户知道系统正在进行处理,而不是无响应.一般大家在处理这样的情况,都使用a ...
- firefox关于about:config的常用配置
about:config是火狐的设置页面,火狐提供了不少高级设置选项在这里以便让你可以更加详细地控制火狐的运行方式.(官方不推荐用户手工修改about:config的设置.所以,如果你对于你想修改的内 ...
- [Angular 2] @Input Custom public property naming
TodoList.ts: @Component({ selector: 'todo-list', directives: [TodoItemRenderer], template: ` <ul& ...
- C++ Win32控制台应用程序捕捉关闭事件
#include#includebool ctrlhandler( DWORD fdwctrltype ){ switch( fdwctrltype ) { // handle ...
- Java 之文件目录操作
1.判断文件是否存在 File file = new File("d:\\study\\temp\\test.java"); boolean bl = file.exists(); ...
- android上line-height的问题
关于line-height大家应该非常熟悉了吧,就是用来做垂直居中的,屡试不爽,基本上没有什么问题,但是最近一个项目,测试提了一个bug,看图吧. 从别处窃的图,这个问题只有安卓上才能复现,做了dem ...
- C#简单注册表操作实例
1.简介操作 //设置注册值 private void Button_Click(object sender, RoutedEventArgs e) { //路径及间隔符号要正确 //1.如果指定路径 ...
- 使用Uploadify 时,同时使用了jQuery.Validition 验证控件时,在IE11上出现JS缺少对象错误。
场景: 使用jQuery.1.8.2 使用 Uploadify 3.2上传控件 使用jQuery.Validition 1.9 验证 使用IE 11 时,当鼠标点击上传按钮时,会出现JS 缺少对象错误 ...
- django 模板视图,表单视图,各种视图
Generic editing views¶ The following views are described on this page and provide a foundation for e ...