【CF】142 Div.1 B. Planes

SPFA.注意状态转移条件,ans的求解需要在bfs中间求解。因为只要到了地点n,则无需等待其他tourist。
还是蛮简单的,注意细节。

  1 /* 229B */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41
 42 const int maxn = 1e5+5;
 43 const int INF = 0x3f3f3f3f;
 44 vpii E[maxn];
 45 vpii T[maxn];
 46 int dis[maxn];
 47 bool visit[maxn];
 48 int a[maxn], b[maxn];
 49
 50 int main() {
 51     ios::sync_with_stdio(false);
 52     #ifndef ONLINE_JUDGE
 53         freopen("data.in", "r", stdin);
 54         freopen("data.out", "w", stdout);
 55     #endif
 56
 57     int n, m;
 58     int u, v, w;
 59
 60     scanf("%d %d", &n, &m);
 61     while (m--) {
 62         scanf("%d %d %d", &u, &v, &w);
 63         E[u].pb(mp(v, w));
 64         E[v].pb(mp(u, w));
 65     }
 66     rep(i, 1, n+1) {
 67         scanf("%d", &m);
 68         rep(j, 1, m+1)
 69             scanf("%d", &a[j]);
 70         b[m] = 1;
 71         per(j, 1, m) {
 72             if (a[j]+1 == a[j+1])
 73                 b[j] = b[j+1] + 1;
 74             else
 75                 b[j] = 1;
 76         }
 77         rep(j, 1, m+1)
 78             T[i].pb(mp(a[j], b[j]));
 79     }
 80
 81     int i, tmp;
 82     int ans = INF;
 83     pii p(0, 0);
 84     vpii::iterator iter;
 85     queue<int> Q;
 86     Q.push(1);
 87     memset(dis, 0x3f, sizeof(dis));
 88     // may be have 0 in T[1]
 89     iter = upper_bound(all(T[1]), p);
 90     if (iter!=T[1].end() && iter->fir==0) {
 91         dis[1] = iter->sec;
 92     } else {
 93         dis[1] = 0;
 94     }
 95     visit[1] = true;
 96
 97     while (!Q.empty()) {
 98         u = Q.front();
 99         Q.pop();
100         visit[u] = false;
101         for (i=0; i<SZ(E[u]); ++i) {
102             v = E[u][i].fir;
103             w = E[u][i].sec;
104             tmp = dis[u] + w;
105             if (v==n && tmp<ans)
106                 ans = tmp;
107             p.fir = tmp;
108             iter = upper_bound(all(T[v]), p);
109             if (iter!=T[v].end() && iter->fir==tmp) {
110                 tmp += iter->sec;
111             }
112             if (tmp < dis[v]) {
113                 dis[v] = tmp;
114                 if (!visit[v]) {
115                     visit[v] = true;
116                     Q.push(v);
117                 }
118             }
119         }
120     }
121
122     ans = ans==INF ? -1:ans;
123     printf("%d\n", ans);
124
125     #ifndef ONLINE_JUDGE
126         printf("time = %d.\n", (int)clock());
127     #endif
128
129     return 0;
130 }
时间: 2024-10-10 12:48:47

【CF】142 Div.1 B. Planes的相关文章

【CF】121 Div.1 C. Fools and Roads

题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对cnt[LCA(u, v)] -= 2.然后dfs求解各边的计数. 1 /* 191C */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #inc

【CF】310 Div.1 C. Case of Chocolate

线段树的简单题目,做一个离散化,O(lgn)可以找到id.RE了一晚上,额,后来找到了原因. 1 /* 555C */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <dequ

【CF】207 Div.1 B.Xenia and Hamming

这题目一看很牛逼,其实非常easy.求求最小公倍数,最大公约数,均摊复杂度其实就是O(n). 1 /* 356B */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <dequ

【CF】196 Div.2 Book of Evil

显然这个图是一课树,看着题目首先联想到LCA(肯定是可以解的).但是看了一下数据大小,应该会TLE.然后,忽然想到一个前面做过的题目,大概是在一定条件下树中某结点旋转成为根后查询最长路径.结果灵感就来了,主要思路是对于每个结点,第一次dfs得到两个变量到P结点的最大值以及次大值.然后,第二次dfs对于当前结点u,u到它的子树中P类结点的最大距离已知(nd[u].mx),那么除u的其他结点v到P类结点的最大距离加上v到u的距离和的最大值为pmx,可以通过每次深搜计算出来,只要d大于等于两者的最大值

【CF】110 Div.1 B. Suspects

这题目乍眼一看还以为是2-sat.其实很水的,O(n)就解了.枚举每个人,假设其作为凶手.观察是否满足条件.然后再对满足的数目分类讨论,进行求解. 1 /* 156B */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vec

【CF】174 Div.1 B Cow Program

思路是树形DP+状态压缩.其实仅有2个状态,奇数次来到x或者偶数次来到x.(因为对x的更新不同).同时开辟visit数组,解决环.注意,一旦遇到环结果就是-1.DP数组存放第奇数/偶数次来到x时,对y的改变两. 1 /* 283B */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include

【CF】259 Div.1 B Little Pony and Harmony Chest

还蛮有趣的一道状态DP的题目. 1 /* 435B */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm

【转载】用div+css模拟表格对角线

本文引用蓝色理想论坛. 首先声明: 这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点.如果对此深以为然的朋友,请一笑过之... 有时在插入文档时,要用到表格对角线,常见的作法是用图片的方式来处理,还有就是用vml来画对角线,能不能用html+css方式来实现呢?答案是肯定的,下面我们来摸拟一个表格对角线. 原理: 用边框线来摸拟斜线,我们知道,如果将一个DIV的边框线设置得足够宽并定义了不同的颜色时,其相邻的两条边框线交界处就是斜线.知道了

【CF】38E Let&#39;s Go Rolling! (dp)

前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以使弹珠在原地不动 (\(-10^9<=x_i,C_i<=10^9\)),游戏开始时,所有的弹珠向左滚动,直到碰到定在原地不动的弹珠,其花费是其滚动的距离.总花费=开始前的花费+弹珠滚动的花费,问最小的花费是多少 题解 首先划分出阶段,,我们可以先将弹珠排序,前 \(i\) 个弹珠,最后一个固定的弹