hdu 2254 奥运 **

奥运

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1936    Accepted Submission(s): 491


Problem Description
北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up!
比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的感动了。反正我的钱也多的没地方放了,他对自己说,我自己也来举办一个奥运会,看谁的更火。不过他的奥运会很特别:
1 参加人员必须是中国人;
2 至少会加法运算(因为要计算本人获得的金牌数)
他知道中国有很多的名胜古迹,他知道自己在t1 到 t2天内不可能把所有的地方都玩遍,所以他决定指定两个地方v1,v2,如果参赛员能计算出在t1到t2天(包括t1,t2)内从v1到v2共有多少种走法(每条道路走需要花一天的时间,且不能在某个城市停留,且t1=0时的走法数为0),那么他就会获得相应数量的金牌,城市的总数<=30,两个城市间可以有多条道路
,每条都视为是不同的。
 

 

Input
本题多个case,每个case:
输入一个数字n表示有n条道路 0<n<10000
接下来n行每行读入两个数字 p1,p2 表示城市p1到p2 有道路,并不表示p2到p1有道路 (0<=p1,p2<2^32)
输入一个数字k表示有k个参赛人员
接下来k行,每行读入四个数据v1,v2,t1,t2 (0<=t1,t2<10000)
 

 

Output
对于每组数据中的每个参赛人员输出一个整数表示他获得的金牌数(mod 2008)
 

 

Sample Input
6 1 2 1 3 2 3 3 2 3 1 2 1 3 1 2 0 0 1 2 1 100 4 8 3 50
 

 

Sample Output
0 1506 0
 

 

Source
 

 

Recommend
lcy
 
1.离散
2.注意重边的情况时,M_hxl.mat[l][r]++;
  接下来n行每行读入两个数字 p1,p2 表示城市p1到p2 有道路,并不表示p2到p1有道路 (0<=p1,p2<2^32)
 
  1 #include<iostream>

  2 #include<cstdio>

  3 #include<cstdlib>

  4 #include<cstring>

  5 #include<algorithm>

  6 using namespace std;

  7 

  8 

  9 struct node

 10 {

 11     int mat[33][33];

 12 }M_hxl,qqq[10002];

 13 struct st

 14 {

 15     int l;

 16     int r;

 17 }f[10003];

 18 int hxl[20005],tom[20005],hlen,tlen;

 19 

 20 int EF(int l,int r,int num)//二分查找

 21 {

 22     int mid=(l+r)/2;

 23     while(l<r)

 24     {

 25         if(tom[mid]>num)

 26         r=mid-1;

 27         else if(tom[mid]<num)

 28         l=mid+1;

 29         else return mid;

 30         mid=(l+r)/2;

 31     }

 32     return mid;

 33 }

 34 

 35 struct node cheng(node cur,node now,int n)

 36 {

 37     node ww;

 38     memset(ww.mat,0,sizeof(ww.mat));

 39     int i,j,k;

 40     for(i=1;i<=n;i++)

 41     for(k=1;k<=n;k++)

 42     if(cur.mat[i][k])

 43     {

 44         for(j=1;j<=n;j++)

 45         if(now.mat[k][j])

 46         {

 47             ww.mat[i][j]=ww.mat[i][j]+(cur.mat[i][k]*now.mat[k][j])%2008;

 48             if(ww.mat[i][j]>=2008)

 49             ww.mat[i][j]%=2008;

 50         }

 51     }

 52     return ww;

 53 }

 54 

 55 void make_ini(int n,int m)

 56 {

 57     int x,y,start,end,i,l,r,j;

 58     int sum;

 59     for(i=1;i<=m;i++)

 60     {

 61         scanf("%d%d%d%d",&l,&r,&start,&end);

 62         if(start>end)

 63         swap(start,end);

 64         x=EF(1,tlen,l);

 65         y=EF(1,tlen,r);

 66         if(l!=tom[x] || r!=tom[y])//加了更严谨

 67         {

 68             printf("0\n");

 69             continue;

 70         }

 71         sum=0;

 72         for(j=start;j<=end;j++)

 73         {

 74             sum=sum+qqq[j].mat[x][y];

 75             if(sum>=2008)

 76             sum%=2008;

 77         }

 78         printf("%d\n",sum);

 79     }

 80 }

 81 

 82 int main()

 83 {

 84     int n,m,i,l,r;

 85     while(scanf("%d",&n)>0)

 86     {

 87         hlen=tlen=0;

 88         for(i=1;i<=n;i++)

 89         {

 90             scanf("%d%d",&f[i].l,&f[i].r);

 91             hxl[++hlen]=f[i].l;

 92             hxl[++hlen]=f[i].r;

 93         }

 94         sort(hxl+1,hxl+1+hlen);

 95         tom[1]=hxl[1];tlen=1;

 96         for(i=2;i<=hlen;i++)

 97         {

 98             if(hxl[i]!=hxl[i-1])

 99             tom[++tlen]=hxl[i];

100         }//离散化 finsh

101         memset(M_hxl.mat,0,sizeof(M_hxl.mat));

102         for(i=1;i<=n;i++)//构建矩阵

103         {

104             l=EF(1,tlen,f[i].l);

105             r=EF(1,tlen,f[i].r);

106             M_hxl.mat[l][r]++;//这个...!!题目什么意思么。

107         }

108         qqq[1]=M_hxl;

109         for(i=2;i<=10000;i++)

110         qqq[i]=cheng(qqq[i-1],M_hxl,n);

111         scanf("%d",&m);

112         make_ini(n,m);

113     }

114     return 0;

115 }

 

 

Statistic |  Submit |  Discuss | Note

你可能感兴趣的:(HDU)