9.8——模拟赛

T1 洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths

题目描述

Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has set up a series of tolls that the cows will pay when they traverse the cowpaths throughout the farm.

The cows move from any of the N (1 <= N <= 250) pastures conveniently numbered 1..N to any other pasture over a set of M (1 <= M <= 10,000) bidirectional cowpaths that connect pairs of different pastures A_j and B_j (1 <= A_j <= N; 1 <= B_j <= N). FJ has assigned a toll L_j (1 <= L_j <= 100,000) to the path connecting pastures A_j and B_j.

While there may be multiple cowpaths connecting the same pair of pastures, a cowpath will never connect a pasture to itself. Best of all, a cow can always move from any one pasture to any other pasture by following some sequence of cowpaths.

In an act that can only be described as greedy, FJ has also assigned a toll C_i (1 <= C_i <= 100,000) to every pasture. The cost of moving from one pasture to some different pasture is the sum of the tolls for each of the cowpaths that were traversed plus a *single additional toll* that is the maximum of all the pasture tolls encountered along the way, including the initial and destination pastures.

The patient cows wish to investigate their options. They want you to write a program that accepts K (1 <= K <= 10,000) queries and outputs the minimum cost of trip specified by each query. Query i is a pair of numbers s_i and t_i (1 <= s_i <= N; 1 <= t_i <= N; s_i != t_i) specifying a starting and ending pasture.

Consider this example diagram with five pastures:

The ‘edge toll‘ for the path from pasture 1 to pasture 2 is 3. Pasture 2‘s ‘node toll‘ is 5.

To travel from pasture 1 to pasture 4, traverse pastures 1 to 3 to 5 to 4. This incurs an edge toll of 2+1+1=4 and a node toll of 4 (since pasture 5‘s toll is greatest), for a total cost of 4+4=8.

The best way to travel from pasture 2 to pasture 3 is to traverse pastures 2 to 5 to 3. This incurs an edge toll of 3+1=4 and a node toll of 5, for a total cost of 4+5=9.

跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道。为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费。 农场中由N(1 <= N <= 250)片草地(标号为1到N),并且有M(1 <= M <= 10000)条 双向道路连接草地A_j和B_j(1 <= A_j <= N; 1 <= B_j <= N)。

奶牛们从任意一片草 地出发可以抵达任意一片的草地。FJ已经在连接A_j和B_j的双向道路上设置一个过路费L_j (1 <= L_j <= 100,000)。 可能有多条道路连接相同的两片草地,但是不存在一条道路连接一片草地和这片草地本身。最 值得庆幸的是,奶牛从任意一篇草地出发,经过一系列的路径,总是可以抵达其它的任意一片 草地。 除了贪得无厌,叫兽都不知道该说什么好。

FJ竟然在每片草地上面也设置了一个过路费C_i (1 <= C_i <= 100000)。从一片草地到另外一片草地的费用,是经过的所有道路的过路 费之和,加上经过的所有的草地(包括起点和终点)的过路费的最大值。 任劳任怨的牛们希望去调查一下她们应该选择那一条路径。

她们要你写一个程序,接受K(1 <= K <= 10,000)个问题并且输出每个询问对应的最小花费。第i个问题包含两个数字s_i 和t_i(1 <= s_i <= N; 1 <= t_i <= N; s_i != t_i),表示起点和终点的草地。

输入输出格式

输入格式:

  • Line 1: Three space separated integers: N, M, and K
  • Lines 2..N+1: Line i+1 contains a single integer: C_i
  • Lines N+2..N+M+1: Line j+N+1 contains three space separated

integers: A_j, B_j, and L_j

  • Lines N+M+2..N+M+K+1: Line i+N+M+1 specifies query i using two space-separated integers: s_i and t_i

输出格式:

  • Lines 1..K: Line i contains a single integer which is the lowest cost of any route from s_i to t_i

输入输出样例

输入样例#1:

5 7 2
2
5
3
3
4
1 2 3
1 3 2
2 5 3
5 3 1
5 4 1
2 4 3
3 4 4
1 4
2 3

输出样例#1:

8
9 

n的范围支持n^3的Floyd,然后、、

 1 #include <cstdio>
 2
 3 const int INF(0x3f3f3f3f);
 4 const int N(250+26);
 5 int n,m,p,point[N];
 6 int ans[N][N],maxp[N][N],dis[N][N];
 7
 8 inline void read(int &x)
 9 {
10     x=0; register char ch=getchar();
11     for(; ch>‘9‘||ch<‘0‘; ) ch=getchar();
12     for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘;
13 }
14
15 #define min(a,b) (a<b?a:b)
16 #define max(a,b) (a>b?a:b)
17
18 int AC()
19 {
20     freopen("fee.in","r",stdin);
21     freopen("fee.out","w",stdout);
22
23     read(n),read(m),read(p);
24     for(int i=1; i<=n; ++i)
25       for(int j=1; j<=n; ++j)
26         dis[i][j]=INF*(i!=j);
27     for(int i=1; i<=n ;++i)
28         read(point[i]);
29     for(int u,v,w; m--; )
30     {
31         read(u),read(v),read(w);
32         dis[u][v]=min(dis[u][v],w);
33         dis[v][u]=dis[u][v];
34     }
35     for(int k=1; k<=n; ++k)
36       for(int i=1; i<=n; ++i)
37           for(int j=1; j<=n; ++j)
38             if(dis[i][j]>dis[i][k]+dis[k][j])
39             {
40               dis[i][j]=dis[i][k]+dis[k][j];
41             maxp[i][j]=max(point[i],point[j]);
42               maxp[i][j]=max(maxp[i][k],maxp[k][j]);
43               maxp[i][j]=max(maxp[i][j],point[k]);
44           }
45         else if(dis[i][j]<dis[i][k]+dis[k][j])
46             maxp[i][j]=max(point[i],point[j]);
47     for(int s,t; p--; )
48     {
49         read(s),read(t);
50         if(s==t) printf("%d\n",point[s]);
51         else if(dis[s][t]+maxp[s][t]>=INF) puts("-1");
52         else printf("%d\n",dis[s][t]+maxp[s][t]);
53     }
54     return 0;
55 }
56
57 int Hope=AC();
58 int main(){;}

20分。

先给点权排序,使的在最短路更新时,i-->j 这条路径上,依次枚举点权从小到大的中转点k

每次由最短路更新出ans,保证ans的正确、

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 const int INF(0x3f3f3f3f);
 5 const int N(250+26);
 6 int n,m,p,point[N],s[N];
 7 int ans[N][N],dis[N][N];
 8
 9 inline void read(int &x)
10 {
11     x=0; register char ch=getchar();
12     for(; ch>‘9‘||ch<‘0‘; ) ch=getchar();
13     for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘;
14 }
15
16 #define min(a,b) (a<b?a:b)
17 #define max(a,b) (a>b?a:b)
18
19 bool cmp(int a,int b)
20 {
21     return point[a]<point[b];
22 }
23
24 int AC()
25 {
26 //    freopen("fee.in","r",stdin);
27 //    freopen("fee.out","w",stdout);
28
29     read(n),read(m),read(p);
30     for(int i=1; i<=n; ++i)
31       for(int j=1; j<=n; ++j)
32         ans[i][j]=dis[i][j]=INF*(i!=j);
33     for(int i=1; i<=n ;++i)
34         read(point[i]),s[i]=i,ans[i][i]=point[i];
35     std::sort(s+1,s+n+1,cmp);
36     for(int u,v,w; m--; )
37     {
38         read(u),read(v),read(w);
39         dis[u][v]=min(dis[u][v],w);
40         dis[v][u]=dis[u][v];
41     }
42     for(int k=1; k<=n; ++k)
43       for(int i=1; i<=n; ++i)
44           for(int j=1; j<=n; ++j)
45           {
46               dis[s[i]][s[j]]=min(dis[s[i]][s[j]],dis[s[i]][s[k]]+dis[s[k]][s[j]]);
47               ans[s[i]][s[j]]=min(ans[s[i]][s[j]],dis[s[i]][s[j]]+
48                               max(point[s[k]],max(point[s[i]],point[s[j]])));
49         }
50     for(int s,t; p--; )
51     {
52         read(s),read(t);
53         if(ans[s][t]>=INF) puts("-1");
54         else printf("%d\n",ans[s][t]);
55     }
56     return 0;
57 }
58
59 int Hope=AC();
60 int main(){;}

AC

T2 走楼梯升级版

Description

在你成功地解决了上一道走楼梯后,xxy 不禁有些气恼,于是她又在楼梯上跳来跳去,想要你求出她跳的方案数。..

xxy 站在一个 tot 阶楼梯下面,他每次可以往上跳1—n步,往下跳1——m步(由于地心引力跳得比较远),而且在往下跳的时候只能踩在往上跳时踩过的格子。

现在 xxy 在楼梯上乱跳,想问她跳到楼梯顶上最后又跳回楼梯下面的方案数 mod 233333333。

注意:xxy 只能一直向上跳,跳到楼梯最上面,然后再往下跳,跳回楼梯最底下。

Input

一行3个整数 tot,n,m

Output

方案数 % 233333333

Example

Input

2

5 2 4

5 2 3

Output

52

42

Hint

10%的数据,1<=tot,n<=5,m=1

另外10%的数据, 1<=tot,n,m<=5

另外20%的数据, 1<=tot<=10000,1<=n,m<=5

另外20%的数据, 1<=tot<=10000,1<=n,m<=10

另外20%的数据, 1<=tot<=400000,1<=n,m<=5

对于100%的数据,1<=tot<=400000,1<=n,m<=10

考试想出正解做法,结果、、、没考虑long long ,还在预处理的时候打错变量了。。w(?Д?)w    zz啊。

  1 #include <cstring>
  2 #include <cstdio>
  3
  4 const int mod(233333333);
  5 const int N(400000+626);
  6 int n,m,tot,a[N],f[N];
  7
  8 inline void read(int &x)
  9 {
 10     x=0; register char ch=getchar();
 11     for(;ch>‘9‘||ch<‘0‘;) ch=getchar();
 12     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
 13 }
 14
 15 int ret;
 16 bool vis[N],vis_[N];
 17 void DFS_(int now)
 18 {
 19     if(now==0)
 20     {
 21         ret++;
 22         ret%=mod;
 23         return ;
 24     }
 25     for(int i=1; i<=m; ++i)
 26     {
 27         if(vis_[now-i]||(now-i<0)) continue;
 28         if(!vis[now-i]) continue;
 29         vis_[now-i]=1;
 30         DFS_(now-i);
 31         vis_[now-i]=0;
 32     }
 33 }
 34 void DFS(int now,int total)
 35 {
 36     if(now==total)
 37     {
 38         DFS_(now);
 39         return ;
 40     }
 41     for(int i=1; i<=n; ++i)
 42     {
 43         if(vis[now+i]||(now+i>tot)) continue;
 44         vis[now+i]=1;
 45         DFS(now+i,total);
 46         vis[now+i]=0;
 47     }
 48 }
 49 int work(int to)
 50 {
 51     ret=0;
 52     memset(vis,0,sizeof(vis));
 53     memset(vis_,0,sizeof(vis_));
 54     vis[0]=1; DFS(0,to);
 55     return ret;
 56 }
 57
 58 int ret2;
 59 bool vis2[N];
 60 void dfs(int now,int x)
 61 {
 62     if(now==x)
 63     {
 64         ret2++;
 65         ret2%=mod;
 66         return ;
 67     }
 68     for(int i=1; i<=n; ++i)
 69     {
 70         if(now+i<=x) dfs(now+i,x);
 71     }
 72 }
 73 int work2(int x)
 74 {
 75     ret2=0;
 76     memset(vis2,0,sizeof(vis2));
 77     dfs(0,x);
 78     return ret2;
 79 }
 80
 81 int AC()
 82 {
 83     freopen("stair.in","r",stdin);
 84     freopen("stair.out","w",stdout);
 85
 86     int t; read(t);
 87     for(; t--; )
 88     {
 89         read(tot),read(n),read(m);
 90         memset(f,0,sizeof(f));
 91         memset(a,0,sizeof(a));
 92         for(int i=0; i<m; ++i) f[i]=work(i);
 93         for(int i=1; i<=m ;++i) a[i]=work2(i);
 94         for(int i=m; i<=tot; ++i)
 95             for(int j=1; j<=m; ++j)
 96             f[i]=(f[i]+f[i-j]*a[j])%mod;
 97         printf("%d\n",f[tot]);
 98     }
 99     return 0;
100 }
101
102 int Hope=AC();
103 int main(){;}

考试的20分,46行的total被zz的我写成tot啊啊啊,然后就TLE了。。没用LL,啊啊啊

http://www.cnblogs.com/Shy-key/p/7484966.html  类似于这里走楼梯的状态方程。

f[i]+=f[i-j]*a[j],f[i]表示第一次走到i,第二次也走到i的方案数,

      a[j]表示第二次走到j,第一次可以走的方案数。

需要先预处理f[i]的初始值,以及第二次走i步,第一次可以走的方案数。

  1 #include <cstring>
  2 #include <cstdio>
  3
  4 #define LL long long
  5
  6 const int mod(233333333);
  7 const int N(400000+626);
  8 int n,m,tot;
  9 LL a[N],f[N];
 10
 11 inline void read(int &x)
 12 {
 13     x=0; register char ch=getchar();
 14     for(;ch>‘9‘||ch<‘0‘;) ch=getchar();
 15     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
 16 }
 17
 18 int ret;
 19 bool vis[N],vis_[N];
 20 void DFS_(int now)
 21 {
 22     if(now==0)
 23     {
 24         ret++;
 25         ret%=mod;
 26         return ;
 27     }
 28     for(int i=1; i<=m; ++i)
 29     {
 30         if(vis_[now-i]||(now-i<0)) continue;
 31         if(!vis[now-i]) continue;
 32         vis_[now-i]=1;
 33         DFS_(now-i);
 34         vis_[now-i]=0;
 35     }
 36 }
 37 void DFS(int now,int total)
 38 {
 39     if(now==total)
 40     {
 41         DFS_(now);
 42         return ;
 43     }
 44     for(int i=1; i<=n; ++i)
 45     {
 46         if(vis[now+i]||(now+i>total)) continue;
 47         vis[now+i]=1;
 48         DFS(now+i,total);
 49         vis[now+i]=0;
 50     }
 51 }
 52 int work(int to)
 53 {
 54     ret=0;
 55     memset(vis,0,sizeof(vis));
 56     memset(vis_,0,sizeof(vis_));
 57     vis[0]=1; DFS(0,to);
 58     return ret;
 59 }
 60
 61 int ret2;
 62 bool vis2[N];
 63 void dfs(int now,int x)
 64 {
 65     if(now==x)
 66     {
 67         ret2++;
 68         ret2%=mod;
 69         return ;
 70     }
 71     for(int i=1; i<=n; ++i)
 72     {
 73         if(now+i<=x) dfs(now+i,x);
 74     }
 75 }
 76 int work2(int x)
 77 {
 78     ret2=0;
 79     memset(vis2,0,sizeof(vis2));
 80     dfs(0,x);
 81     return ret2;
 82 }
 83
 84 int AC()
 85 {
 86     freopen("stair.in","r",stdin);
 87     freopen("stair.out","w",stdout);
 88
 89     int t; read(t);
 90     for(; t--; )
 91     {
 92         read(tot),read(n),read(m);
 93         memset(f,0,sizeof(f));
 94         memset(a,0,sizeof(a));
 95         for(int i=0; i<m; ++i) f[i]=work(i);
 96         for(int i=1; i<=m ;++i) a[i]=work2(i);
 97         for(int i=m; i<=tot; ++i)
 98             for(int j=1; j<=m; ++j)
 99             f[i]=(f[i]+f[i-j]*a[j])%mod;
100         printf("%I64d\n",f[tot]);
101     }
102     return 0;
103 }
104
105 int Hope=AC();
106 int main(){;}

AC

无奈、

T3 勤劳的蜜蜂 UVa808

 1 #include <cstdio>
 2
 3 #define min(a,b) (a<b?a:b)
 4 int a,b,dis[1026][1026];
 5
 6 int AC()
 7 {
 8     freopen("beehive.in","r",stdin);
 9     freopen("beehive.out","w",stdout);
10
11     for(int i=1; i<=10; ++i)
12         for(int j=1; j<=10; ++j)
13         dis[i][j]=(i!=j)*0x3f3f3f3f;
14     for(int i=2; i<8; ++i) dis[1][i]=dis[i][1]=1;
15     for(int i=7; i<11; ++i) dis[2][i]=dis[i][2]=1;
16     dis[3][2]=dis[2][3]=dis[3][4]=dis[4][3]=dis[4][5]=dis[5][4]=1;
17     dis[5][6]=dis[6][5]=dis[6][7]=dis[7][6]=dis[7][8]=dis[8][7]=1;
18     dis[8][2]=dis[2][8]=dis[8][9]=dis[9][8]=1;
19     dis[9][2]=dis[9][10]=1;dis[3][10]=dis[10][3]=1;
20     for(int k=1; k<=10; ++k)
21       for(int i=1; i<=10; ++i)
22         for(int j=1; j<=10; ++j)
23           dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
24     for(; ~scanf("%d%d",&a,&b); )
25         printf("%d %d %d\n",a,b,dis[a][b]);
26     return 0;
27 }
28
29 int Hope=AC();
30 int main(){;}

打表10分。弃疗了

时间: 2024-11-13 08:10:21

9.8——模拟赛的相关文章

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y):

9.14 模拟赛

模拟赛第三弹~ T1 题意:给你一个数列,要求删掉任意一种整数,使得剩下的新数列中连续的相等的数最多 例如 2 7 3 7 7 3 3 7 7 5 7,删掉3以后剩的7有四个连续的,最多 思路:暴力枚举去掉哪个......这算是一道水题吧 代码丢了...... TAT T2 题意:有n本书,每本书有宽度和高度.现在你有无数个书架,每个书架的宽度为w,高度由最高的书决定 问在书本按顺序放的情况下,总的书架高度最小是多少 思路:dp,dp[i]表示做到第i本书时的最小高度和. 每次先找到能以编号j的

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

20161027模拟赛解题报告

20161027模拟赛解题报告 By shenben T1 数学题 模拟即可. 注意开long long T2 技巧题 图片为本题第一张图.(无奈,图传不上来) 首先第一问图中的“Y 字形”的数量,这么简单,在此不细讲. 详见代码 O(n)累加一下就好了 主要说说第二问怎么搞 预处理 每个点分别与其他那些点相连 权值为第1,2,3大(若没有2,3大,就忽略).记录一下权值与对应的点的标号.目的是方便下面的判断. 枚举入度>=3的点,即点B(有多个) 再枚举点B相连的D点(不是点A,C). Ste

[GRYZ]寒假模拟赛

写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优(le)美(se)的文字加工后,有故事有题目有人物有奸情的模拟赛正式呈上. 我是正文 题目名 GRYZ娱乐时刻 GRYZ追击时刻 GRYZ就餐时刻 源文件 hyxzc.cpp/c/pas clikar.cpp/c/pas eat.cpp/c/pas 输入文件 hyxzc.in clikar.in ea

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻