【AStar】初赛第一场

1. All X
1.1 基本思路
k和c的范围都不大,因此可以考虑迭代找循环节,然后求余数,判定是否相等。这题还是挺简单的。
1.2 代码

 1 /* 5690 */
 2 #include <iostream>
 3 #include <sstream>
 4 #include <string>
 5 #include <map>
 6 #include <queue>
 7 #include <set>
 8 #include <stack>
 9 #include <vector>
10 #include <deque>
11 #include <bitset>
12 #include <algorithm>
13 #include <cstdio>
14 #include <cmath>
15 #include <ctime>
16 #include <cstring>
17 #include <climits>
18 #include <cctype>
19 #include <cassert>
20 #include <functional>
21 #include <iterator>
22 #include <iomanip>
23 using namespace std;
24 //#pragma comment(linker,"/STACK:102400000,1024000")
25
26 #define sti                set<int>
27 #define stpii            set<pair<int, int> >
28 #define mpii            map<int,int>
29 #define vi                vector<int>
30 #define pii                pair<int,int>
31 #define vpii            vector<pair<int,int> >
32 #define rep(i, a, n)     for (int i=a;i<n;++i)
33 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
34 #define clr                clear
35 #define pb                 push_back
36 #define mp                 make_pair
37 #define fir                first
38 #define sec                second
39 #define all(x)             (x).begin(),(x).end()
40 #define SZ(x)             ((int)(x).size())
41 #define lson            l, mid, rt<<1
42 #define rson            mid+1, r, rt<<1|1
43
44 typedef long long LL;
45 const int maxn = 10005;
46 int x;
47 LL m;
48 int c, k;
49 int visit[maxn];
50
51 int main() {
52     ios::sync_with_stdio(false);
53     #ifndef ONLINE_JUDGE
54         freopen("data.in", "r", stdin);
55         freopen("data.out", "w", stdout);
56     #endif
57
58     int t;
59     int tmp, ntmp;
60     LL i, cycle;
61
62     scanf("%d", &t);
63     rep(tt, 1, t+1) {
64         scanf("%d%I64d%d%d", &x,&m,&k,&c);
65         printf("Case #%d:\n", tt);
66         memset(visit, -1, sizeof(visit));
67         ntmp = x % k;
68         cycle = -1;
69         for (i=1; i<=m; ++i) {
70             if (visit[tmp=ntmp] != -1) {
71                 cycle = i - visit[tmp];
72                 break;
73             }
74             visit[tmp] = i;
75             ntmp = (10*tmp + x) % k;
76         }
77
78         if (cycle == -1) {
79             puts(tmp==c ? "Yes":"No");
80         } else {
81             LL n = ((m - visit[tmp]) % cycle + cycle) % cycle;
82             for (i=0; i<n; ++i)
83                 tmp = (10*tmp + x) % k;
84             puts(tmp==c ? "Yes":"No");
85         }
86     }
87
88     #ifndef ONLINE_JUDGE
89         printf("time = %ldms.\n", clock());
90     #endif
91
92     return 0;
93 }

2. Sitting in Line
2.1 基本思路
N的范围很小,刚开始以为这是一个数学题,后来发现状态DP可解。
$dp[st][n]$st表示当前状态(即当前已经加入数字),n表示当前排列的最末端数字。显然有状态转移方程
\[
  dp[nst][k] = \max(dp[nst][k], dp[st|(1<<k)][j]+a_j \times a_k), \\
  \qquad \text{其中 } st\&(1<<k) == 0\text{ 并且 }pos_k==-1 || pos_k==getBits(st)
\]
2.2 代码

  1 /* 5691 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <cstdio>
 14 #include <cmath>
 15 #include <ctime>
 16 #include <cstring>
 17 #include <climits>
 18 #include <cctype>
 19 #include <cassert>
 20 #include <functional>
 21 #include <iterator>
 22 #include <iomanip>
 23 using namespace std;
 24 //#pragma comment(linker,"/STACK:102400000,1024000")
 25
 26 #define sti                set<int>
 27 #define stpii            set<pair<int, int> >
 28 #define mpii            map<int,int>
 29 #define vi                vector<int>
 30 #define pii                pair<int,int>
 31 #define vpii            vector<pair<int,int> >
 32 #define rep(i, a, n)     for (int i=a;i<n;++i)
 33 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 34 #define clr                clear
 35 #define pb                 push_back
 36 #define mp                 make_pair
 37 #define fir                first
 38 #define sec                second
 39 #define all(x)             (x).begin(),(x).end()
 40 #define SZ(x)             ((int)(x).size())
 41 #define lson            l, mid, rt<<1
 42 #define rson            mid+1, r, rt<<1|1
 43
 44 typedef long long LL;
 45 LL INF = 0x3f3f3f3f3f3f3f3f;
 46 LL NEG_INF = 0xc0c0c0c0c0c0c0c0;
 47 const int maxn = 16;
 48 LL dp[1<<maxn][maxn];
 49 int a[maxn], p[maxn];
 50 int Bits[1<<maxn];
 51 int n;
 52
 53 int getBits(int x) {
 54     int ret = 0;
 55
 56     while (x) {
 57         ret += x & 1;
 58         x >>= 1;
 59     }
 60
 61     return ret;
 62 }
 63
 64 void init() {
 65     const int mst = 1<<16;
 66     rep(i, 0, mst) Bits[i] = getBits(i);
 67 }
 68
 69 void solve() {
 70     memset(dp, 0xC0, sizeof(dp));
 71     rep(i, 0, n) {
 72         if (p[i]==-1 || p[i]==0)
 73             dp[1<<i][i] = 0;
 74     }
 75
 76     const int mst = 1<<n;
 77     #ifndef ONLINE_JUDGE
 78     printf("NEG_INF = %I64d\n", NEG_INF);
 79     #endif
 80     rep(i, 0, mst) {
 81         const int idx = Bits[i];
 82         rep(j, 0, n) {
 83             if (dp[i][j] == NEG_INF) continue;
 84             rep(k, 0, n) {
 85                 if (i & (1<<k)) continue;
 86                 if (p[k]==-1 || p[k]==idx) {
 87                     int nst = i | 1<<k;
 88                     dp[nst][k] = max(dp[nst][k], dp[i][j]+a[j]*a[k]);
 89                 }
 90             }
 91         }
 92     }
 93
 94     LL ans = NEG_INF;
 95     rep(j, 0, n)
 96         ans = max(ans, dp[mst-1][j]);
 97     printf("%I64d\n", ans);
 98 }
 99
100 int main() {
101     ios::sync_with_stdio(false);
102     #ifndef ONLINE_JUDGE
103         freopen("data.in", "r", stdin);
104         freopen("data.out", "w", stdout);
105     #endif
106
107     int t;
108
109     init();
110     scanf("%d", &t);
111     rep(tt, 1, t+1) {
112         scanf("%d", &n);
113         rep(i, 0, n)
114             scanf("%d%d", &a[i],&p[i]);
115         printf("Case #%d:\n", tt);
116         solve();
117     }
118
119     #ifndef ONLINE_JUDGE
120         printf("time = %ldms.\n", clock());
121     #endif
122
123     return 0;
124 }

3. Snacks
3.1 基本思路
这个题刚开始看以为是树链剖分,巨难无比,赛后发现就是个树形结构转线性结构,然后使用线段树维护最大值就好了,使用下lazy标记直接A了。
3.2 代码

  1 /* 5692 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <cstdio>
 14 #include <cmath>
 15 #include <ctime>
 16 #include <cstring>
 17 #include <climits>
 18 #include <cctype>
 19 #include <cassert>
 20 #include <functional>
 21 #include <iterator>
 22 #include <iomanip>
 23 using namespace std;
 24 #pragma comment(linker,"/STACK:102400000,1024000")
 25
 26 #define sti                set<int>
 27 #define stpii            set<pair<int, int> >
 28 #define mpii            map<int,int>
 29 #define vi                vector<int>
 30 #define pii                pair<int,int>
 31 #define vpii            vector<pair<int,int> >
 32 #define rep(i, a, n)     for (int i=a;i<n;++i)
 33 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 34 #define clr                clear
 35 #define pb                 push_back
 36 #define mp                 make_pair
 37 #define fir                first
 38 #define sec                second
 39 #define all(x)             (x).begin(),(x).end()
 40 #define SZ(x)             ((int)(x).size())
 41 #define lson            l, mid, rt<<1
 42 #define rson            mid+1, r, rt<<1|1
 43
 44 struct edge_t {
 45     int v, nxt;
 46 };
 47
 48 typedef long long LL;
 49 const int maxn = 1e5+5;
 50 const int maxv = maxn;
 51 const int maxe = maxn * 2;
 52 int head[maxv], l, cnt;
 53 edge_t E[maxe];
 54 LL mx[maxn<<2], delta[maxn<<2];
 55 int L[maxn], R[maxn], a[maxn];
 56 int LLL, RR, w;
 57 int n, m;
 58
 59 void init() {
 60     memset(head, -1, sizeof(head));
 61     l = cnt = 0;
 62     memset(mx, 0, sizeof(mx));
 63     memset(delta, 0, sizeof(delta));
 64 }
 65
 66 void addEdge(int u, int v) {
 67     E[l].v = v;
 68     E[l].nxt = head[u];
 69     head[u] = l++;
 70
 71     E[l].v = u;
 72     E[l].nxt = head[v];
 73     head[v] = l++;
 74 }
 75
 76 void dfs(int u, int fa) {
 77     L[u] = ++cnt;
 78     for (int k=head[u]; k!=-1; k=E[k].nxt) {
 79         const int& v = E[k].v;
 80         if (v == fa) continue;
 81         dfs(v, u);
 82     }
 83     R[u] = cnt;
 84 }
 85
 86 inline void PushDown(int rt) {
 87     if (delta[rt]) {
 88         int lb = rt<<1, rb = lb | 1;
 89         delta[lb] += delta[rt];
 90         delta[rb] += delta[rt];
 91         mx[lb] += delta[rt];
 92         mx[rb] += delta[rt];
 93         delta[rt] = 0;
 94     }
 95 }
 96
 97 inline void PushUp(int rt) {
 98     mx[rt] = max(mx[rt<<1], mx[rt<<1|1]);
 99 }
100
101 void Update(int l, int r, int rt) {
102     if (LLL<=l && RR>=r) {
103         mx[rt] += w;
104         delta[rt] += w;
105         return ;
106     }
107
108     PushDown(rt);
109     int mid = (l + r) >> 1;
110
111     if (RR <= mid) {
112         Update(lson);
113     } else if (LLL > mid) {
114         Update(rson);
115     } else {
116         Update(lson);
117         Update(rson);
118     }
119
120     PushUp(rt);
121 }
122
123 LL Query(int l, int r, int rt) {
124     if (LLL<=l && RR>=r) {
125         return mx[rt];
126     }
127
128     PushDown(rt);
129     int mid = (l + r) >> 1;
130
131     if (RR <= mid)
132         return Query(lson);
133     else if (LLL > mid)
134         return Query(rson);
135     else
136         return max(Query(lson), Query(rson));
137 }
138
139 void solve() {
140     dfs(0, -1);
141
142     rep(i, 0, n) {
143         scanf("%d", &a[i]);
144         LLL = L[i];
145         RR = R[i];
146         w = a[i];
147         Update(1, n, 1);
148     }
149
150     int op, x, y;
151     LL ans;
152
153     rep(i, 0, m) {
154         scanf("%d%d", &op, &x);
155         LLL = L[x];
156         RR = R[x];
157         if (op) {
158             ans = Query(1, n, 1);
159             printf("%I64d\n", ans);
160         } else {
161             scanf("%d", &y);
162             y -= a[x];
163             w = y;
164             Update(1, n, 1);
165             a[x] += y;
166         }
167     }
168 }
169
170 int main() {
171     ios::sync_with_stdio(false);
172     #ifndef ONLINE_JUDGE
173         freopen("data.in", "r", stdin);
174         freopen("data.out", "w", stdout);
175     #endif
176
177     int t;
178     int u, v;
179
180     scanf("%d", &t);
181     rep(tt, 1, t+1) {
182         scanf("%d%d", &n,&m);
183         init();
184         rep(i, 1, n) {
185             scanf("%d%d", &u,&v);
186             addEdge(u, v);
187         }
188         printf("Case #%d:\n", tt);
189         solve();
190     }
191
192     #ifndef ONLINE_JUDGE
193         printf("time = %ldms.\n", clock());
194     #endif
195
196     return 0;
197 }

4. D Game
4.1 基本思路
$n,m \in [1,300]$这数据范围很小,基本思路是DP.
不妨令$dp[i][j]$表示从第$i$个数字到第$j$个数字能否通过全部被删掉,$mx[i]$表示前$i$个数字中可以最多可以删掉的数字。显然有动态转移方程
\[
  mx[i] = \max(mx[i], mx[j-1]+i-j+1), \text{ if } dp[j][i]=True
\]
因此,紧急考虑$dp[j][i]$的情况即可:
(1) $dp[j][k] \& dp[k+1][i], k \in [j+1, i)$
(2) $dp[j+1][i-1], (a_i-a_j) \in D$
(3) $dp[j+1][k-1] \& dp[k+1][i-1], (a_i-a_j)/2 \in D, a_k*2 = a_i+a_j, k \in [j+1, i)$
4.2 代码

  1 /* 5693 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <cstdio>
 14 #include <cmath>
 15 #include <ctime>
 16 #include <cstring>
 17 #include <climits>
 18 #include <cctype>
 19 #include <cassert>
 20 #include <functional>
 21 #include <iterator>
 22 #include <iomanip>
 23 using namespace std;
 24 //#pragma comment(linker,"/STACK:102400000,1024000")
 25
 26 #define sti                set<int>
 27 #define stpii            set<pair<int, int> >
 28 #define mpii            map<int,int>
 29 #define vi                vector<int>
 30 #define pii                pair<int,int>
 31 #define vpii            vector<pair<int,int> >
 32 #define rep(i, a, n)     for (int i=a;i<n;++i)
 33 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 34 #define clr                clear
 35 #define pb                 push_back
 36 #define mp                 make_pair
 37 #define fir                first
 38 #define sec                second
 39 #define all(x)             (x).begin(),(x).end()
 40 #define SZ(x)             ((int)(x).size())
 41 #define lson            l, mid, rt<<1
 42 #define rson            mid+1, r, rt<<1|1
 43
 44 const int maxn = 305;
 45 bool dp[maxn][maxn];
 46 int mx[maxn];
 47 int a[maxn];
 48 int n, m;
 49 sti st;
 50
 51 void solve() {
 52     memset(dp, 0, sizeof(dp));
 53
 54     rep(i, 1, n+1) {
 55         dp[i][i] = false;
 56         dp[i][i-1] = true;
 57         per(j, 1, i) {
 58             rep(k, j+1, i)
 59                 dp[j][i] |= dp[j][k] & dp[k+1][i];
 60             if (st.count(a[i]-a[j])) {
 61                 dp[j][i] |= dp[j+1][i-1];
 62             }
 63             if ((a[i]-a[j])%2==0 && st.count((a[i]-a[j])>>1)) {
 64                 rep(k, j+1, i) {
 65                     if (a[k]+a[k] == a[j]+a[i]) {
 66                         dp[j][i] |= dp[j+1][k-1] & dp[k+1][i-1];
 67                     }
 68                 }
 69             }
 70         }
 71     }
 72
 73     mx[0] = 0;
 74     rep(i, 1, n+1) {
 75         mx[i] = mx[i-1];
 76         rep(j, 1, i) {
 77             if (dp[j][i])
 78                 mx[i] = max(mx[i], mx[j-1]+i-j+1);
 79         }
 80     }
 81
 82     printf("%d\n", mx[n]);
 83 }
 84
 85 int main() {
 86     ios::sync_with_stdio(false);
 87     #ifndef ONLINE_JUDGE
 88         freopen("data.in", "r", stdin);
 89         freopen("data.out", "w", stdout);
 90     #endif
 91
 92     int t;
 93     int x;
 94
 95     scanf("%d", &t);
 96     while (t--) {
 97         scanf("%d%d", &n,&m);
 98         rep(i, 1, n+1) scanf("%d", a+i);
 99         st.clr();
100         rep(i, 0, m) {
101             scanf("%d", &x);
102             st.insert(x);
103         }
104         solve();
105     }
106
107     #ifndef ONLINE_JUDGE
108         printf("time = %ldms.\n", clock());
109     #endif
110
111     return 0;
112 }

5. BD String
5.1 基本思路
不妨令$f(n)$表示$S(n)$字符串的长度,显然很容易得到$f(n) = 2^n-1$。因此,最终串的长度为$f(2^{1000}) = 2^{1001}-1$,而$L,R \in [1,10^{18}]$。
显然原问题等价于计算$S(60)$的$[L,R]$范围内的B的个数。
算法很简单,就是个递归。可以考虑$S(k)$的左半部分和右半部分,递归时,加上剪枝$R-L+1==f(dep)$即可,此时B的数量为$f(dep-1)$,D的数量为$f(dep-1)-1$。
5.2 代码

  1 /* 5694 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <cstdio>
 14 #include <cmath>
 15 #include <ctime>
 16 #include <cstring>
 17 #include <climits>
 18 #include <cctype>
 19 #include <cassert>
 20 #include <functional>
 21 #include <iterator>
 22 #include <iomanip>
 23 using namespace std;
 24 #pragma comment(linker,"/STACK:102400000,1024000")
 25
 26 #define sti                set<int>
 27 #define stpii            set<pair<int, int> >
 28 #define mpii            map<int,int>
 29 #define vi                vector<int>
 30 #define pii                pair<int,int>
 31 #define vpii            vector<pair<int,int> >
 32 #define rep(i, a, n)     for (int i=a;i<n;++i)
 33 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 34 #define clr                clear
 35 #define pb                 push_back
 36 #define mp                 make_pair
 37 #define fir                first
 38 #define sec                second
 39 #define all(x)             (x).begin(),(x).end()
 40 #define SZ(x)             ((int)(x).size())
 41 #define lson            l, mid, rt<<1
 42 #define rson            mid+1, r, rt<<1|1
 43
 44 typedef long long LL;
 45 LL Base[62];
 46 LL L, R;
 47
 48 void init() {
 49     rep(i, 0, 62)
 50         Base[i] = 1LL << i;
 51 }
 52
 53 LL dfsD(LL, LL, int);
 54 LL dfsB(LL, LL, int);
 55
 56 LL dfsD(LL L, LL R, int dep) {
 57     if (L > R)    return 0;
 58     if (dep == 0)    return 0;
 59     if (dep == 1)    return 0;
 60
 61     if (R-L+1 == Base[dep]-1) {
 62         return Base[dep-1]-1;
 63     }
 64     LL mid = Base[dep-1];
 65     if (R < mid) {
 66         return dfsD(L, R, dep-1);
 67     } else if (L > mid) {
 68         LL nxtL = mid - 1 - (R - mid) + 1;
 69         LL nxtR = mid - 1 - (L - mid) + 1;
 70         return dfsB(nxtL, nxtR, dep-1);
 71
 72     } else {
 73         LL lret = dfsD(L, mid-1, dep-1);
 74         LL rret = 0;
 75
 76         if (R > mid) {
 77             LL nxtL = mid-1 - (R-mid) + 1;
 78             LL nxtR = mid-1;
 79             rret = dfsB(nxtL, nxtR, dep-1);
 80         }
 81
 82         return lret + rret;
 83     }
 84 }
 85
 86 LL dfsB(LL L, LL R, int dep) {
 87     if (L > R)    return 0;
 88     if (dep == 0)    return 0;
 89     if (dep == 1)    return 1;
 90
 91     if (R-L+1 == Base[dep]-1) {
 92         return Base[dep-1];
 93     }
 94     LL mid = Base[dep-1];
 95     if (R < mid) {
 96         return dfsB(L, R, dep-1);
 97
 98     } else if (L > mid) {
 99         LL nxtL = mid - 1 - (R - mid) + 1;
100         LL nxtR = mid - 1 - (L - mid) + 1;
101         return dfsD(nxtL, nxtR, dep-1);
102
103     } else {
104         LL lret = dfsB(L, mid-1, dep-1);
105         LL rret = 0;
106
107         if (R > mid) {
108             LL nxtL = mid-1 - (R-mid) + 1;
109             LL nxtR = mid-1;
110             rret = dfsD(nxtL, nxtR, dep-1);
111         }
112
113         return lret + 1 + rret;
114     }
115 }
116
117 void solve() {
118     LL ans = dfsB(L, R, 60);
119
120     printf("%I64d\n", ans);
121 }
122
123 int main() {
124     ios::sync_with_stdio(false);
125     #ifndef ONLINE_JUDGE
126         freopen("data.in", "r", stdin);
127         freopen("data.out", "w", stdout);
128     #endif
129
130     int t;
131
132     init();
133     scanf("%d", &t);
134     while (t--) {
135         scanf("%I64d%I64d", &L, &R);
136         solve();
137     }
138
139     #ifndef ONLINE_JUDGE
140         printf("time = %ldms.\n", clock());
141     #endif
142
143     return 0;
144 }

6. Gym Class
6.1 基本思路
水题,根据依赖性建图,然后拓扑排序就好了。注意拓扑的时候使用优先队列可求最值。
6.2 代码

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

时间: 2024-10-24 09:52:43

【AStar】初赛第一场的相关文章

计蒜之道2015程序设计大赛初赛第一场——搜狗输入法的分词算法

(一)题面 计蒜之道2015程序设计大赛初赛第一场——搜狗输入法的分词算法 搜狗输入法最近的用户输入中出现了一种新的输入模式,形如 “0k1234567”,搜狗的工程师发现这一模式后了解到,这是一种新被提出的对于十五进制数字的标记模式,其中 “0k” 是标记进制为15的前缀标记,之后的部分 “1234567” 是实际的十五进制的数字串. 在发现这一标记模式后,搜狗的工程师开始尝试在已有的分词算法上进一步加入对于十五进制数字串的处理,把网页上的这种形式的 15 进制数正确地提取出来.我们知道,标记

HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)

http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. 接下来n行,每行两个整数a和b,其中a表示这种食物可以带给湫湫的幸福值(数值越大,越幸福),b表示湫湫吃这种食物会吸收的卡路里量. 最后是一个整数m,表示湫湫一天吸收的卡路里不能超过m. 思路: 完全背包. 一开始以为是01背包. 敲了01后样例2不对啊!!! 然后改成完全就过了..就改循环体就好了.. #includ

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务 1 /* QYP kuai wo dai ma*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<iomanip> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cstdio> 8 #include<queue> 9 #include<ctime

微软2014编程之美初赛第一场——题目2 : 树

[来源] 题目2 : 树 [分析] 依据输入情况建立起树的模型.树的表示是一个表明父亲节点的数组.核心算法有两个: 计算某一节点的深度.用循环实现,一直向上找父亲节点,直到找到根节点.计算循环的次数即为深度. 计算某一节点的全部子节点.用递归实现. 本题在实现上节点的命名从0至N-1,与题目描写叙述不同. [代码] #include <iostream> #include <vector> using namespace std; vector<int> childre

计蒜之道 初赛第一场B 阿里天池的新任务(简单)

阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 tt,判断它在另一个根据规则生成的 DNA 碱基序列 ss 中出现了多少次. 首先,定义一个序列 ww: \displaystyle w_{i} = \begin{cases}b, & i = 0\\(w_{i-1} + a) \mod n, & i > 0\end{cases}w?i??={?b,?(w?i−1??+a)modn,???i=0?i>0?? 接下来,定义长度为 nn 的 DNA 碱

2017 计蒜之道 初赛 第一场 A、B题

A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.我们可以用坐标系来描述棋盘: 如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三.现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的.请你帮小红计算他成三的线段数. 样例对应的棋盘如下: 输入格式 输入第一行两个整数 n,m(3 \le n, m \le

编程之美2015初赛第一场: 彩色的树

题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路径.这是一棵彩色的树,每个节点恰好可以染一种颜色.初始时,所有节点的颜色都为0.现在需要实现两种操作: 1. 改变节点x的颜色为y: 2. 询问整棵树被划分成了多少棵颜色相同的子树.即每棵子树内的节点颜色都相同,而相邻子树的颜色不同. 输入 第一行一个整数T,表示数据组数,以下是T组数据. 每组数据

编程之美初赛第一场 树

题目2 : 树 时间限制:4000ms 单点时限:2000ms 内存限制:256MB 描写叙述 有一个N个节点的树.当中点1是根.初始点权值都是0. 一个节点的深度定义为其父节点的深度+1,.特别的.根节点的深度定义为1. 如今须要支持一系列下面操作:给节点u的子树中,深度在l和r之间的节点的权值(这里的深度依旧从整个树的根节点開始计算).都加上一个数delta. 问完毕全部操作后,各节点的权值是多少. 为了降低巨大输出带来的开销.如果完毕全部操作后.各节点的权值是answer[1..N],请你

计蒜之道 初赛 第一场 题解

搜狗输入法的分词算法 搜狗输入法最近的用户输入中出现了一种新的输入模式,形如 "0k1234567",搜狗的工程师发现这一模式后了解到,这是一种新被提出的对于十五进制数字的标记模式,其中 "0k" 是标记进制为15的前缀标记,之后的部分 "1234567" 是实际的十五进制的数字串. 在发现这一标记模式后,搜狗的工程师开始尝试在已有的分词算法上进一步加入对于十五进制数字串的处理,把网页上的这种形式的 15 进制数正确地提取出来.我们知道,标记十五