[题解]洛谷比赛『期末考后的休闲比赛2』

[前言]

  这场比赛已经结束了有几天,但我各种忙,虽然AK但还是没来得及写题解。(我才不会告诉你我跑去学数据结构了)


T1 区间方差

(就不贴题好了)

  首先可以推公式(我们可以知道,线段树然而并不能通过初中学过的方差公式在log(L)内求出方差):

(s2表示方差,L表示区间长度,xi表示区间的每一项,最后一个x上画了一根线表示这些数据的平均数)

用二项式定理完全平方公式可得:

再次展开:

另外,再代入以下这个

得到了:

然后继续吧。。

然后duang地一声合并同类项,于是我们得到了:

  然后可以高兴地发现,和 和 平方和都是线段树的拿手好戏,然而按照这么写估计只能过几个点。

很明显平方和肯定会超long long,难不成还要写一个高精度?

  仔细读读题,然后就发现可以模一个1e9+7。然后处处取模(笑),最后就能够水掉这道水题了。

  至于求逆元,可以用在线算法,扩展欧几里得、快速幂(好像是基于欧拉定理),也可以用线性推逆元预处理所有可能用到的逆元。

Code(线段树)

  1 /**
  2  * luogu.org
  3  * Problem#2005
  4  * Accepted
  5  * Time:965ms / 691ms
  6  * Memory:18601k / 18601k
  7  */
  8 #include<iostream>
  9 #include<fstream>
 10 #include<sstream>
 11 #include<cstdio>
 12 #include<cstdlib>
 13 #include<cstring>
 14 #include<ctime>
 15 #include<cctype>
 16 #include<cmath>
 17 #include<algorithm>
 18 #include<stack>
 19 #include<queue>
 20 #include<set>
 21 #include<map>
 22 #include<vector>
 23 using namespace std;
 24 typedef bool boolean;
 25 #define smin(a, b)    (a) = min((a), (b))
 26 #define smax(a, b)    (a) = max((a), (b))
 27 template<typename T>
 28 inline void readInteger(T& u){
 29     char x;
 30     int aFlag = 1;
 31     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
 32     if(x == -1)    return;
 33     if(x == ‘-‘){
 34         x = getchar();
 35         aFlag = -1;
 36     }
 37     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 3) + (u << 1) + x - ‘0‘);
 38     ungetc(x, stdin);
 39     u *= aFlag;
 40 }
 41
 42 const int moder = 1000000007;
 43
 44 template<typename T1, typename T2>
 45 class Pair{
 46     public:
 47         T1 x;
 48         T2 y;
 49         Pair(T1 x, T2 y):x(x), y(y){    }
 50         Pair operator +(Pair another){
 51             return Pair(x + another.x % moder, y + another.y % moder);
 52         }
 53 };
 54
 55 typedef class TreeNode{
 56     public:
 57         int sum;
 58         int sum2;
 59         int from, end;
 60         TreeNode* left, *right;
 61         TreeNode(long long sum, int from, int end):from(from), end(end), left(NULL), right(NULL), sum(sum){
 62             sum2 = sum * sum % moder;
 63         }
 64         void pushUp(){
 65             this->sum = this->left->sum + this->right->sum;
 66             this->sum %= moder;
 67             this->sum2 = this->left->sum2 + this->right->sum2;
 68             this->sum2 %= moder;
 69         }
 70 }TreeNode;
 71
 72 typedef class SegTree{
 73     public:
 74         TreeNode* root;
 75
 76         SegTree():root(NULL){    }
 77         SegTree(int size, int* val){
 78             build(root, 1, size, val);
 79         }
 80
 81         void build(TreeNode*& node, int from, int end, int* val){
 82             node = new TreeNode(0, from, end);
 83             if(from == end){
 84                 node->sum = val[from];
 85                 node->sum2 = (int)(val[from] * 1LL * val[from] % moder);
 86                 return;
 87             }
 88             int mid = (from + end) >> 1;
 89             build(node->left, from, mid, val);
 90             build(node->right, mid + 1, end, val);
 91             node->pushUp();
 92         }
 93
 94         void update(TreeNode*& node, int index, int val){
 95             if(node->from == index && node->end == index){
 96                 node->sum = val;
 97                 node->sum2 = (int)(val * 1LL * val % moder);
 98                 return;
 99             }
100             int mid = (node->from + node->end) >> 1;
101             if(index <= mid)    update(node->left, index, val);
102             else update(node->right, index, val);
103             node->pushUp();
104         }
105
106         Pair<long long, long long> query(TreeNode*& node, int from, int end){
107             if(node->from == from && node->end == end){
108                 return Pair<long long, long long>(node->sum, node->sum2);
109             }
110             int mid = (node->from + node->end) >> 1;
111             if(end <= mid)    return query(node->left, from, end);
112             if(from > mid)    return query(node->right, from, end);
113             return query(node->left, from, mid) + query(node->right, mid + 1, end);
114         }
115
116 }SegTree;
117
118 /*
119 int pow_mod(int x, int pos){
120     if(pos == 1)    return x;
121     int temp = pow_mod(x, pos / 2);
122     if(pos & 1)    return (int)(temp * 1LL * temp % moder * x % moder);
123     return (int)(temp * 1LL * temp % moder);
124 }
125 */
126
127 void gcd(int a, int b, int& d, int& x, int& y){
128     if(b == 0){
129         d = a;x = 1;y= 0;
130     }else{    gcd(b, a % b, d, y, x); y -= x * (a / b);    }
131 }
132
133 int getInv(int a, int n){
134     int d, x, y;
135     gcd(a, n, d, x, y);
136     return (x + n) % n;
137 }
138
139 int n, m;
140 SegTree st;
141 int* initer;
142
143 inline void init(){
144     readInteger(n);
145     readInteger(m);
146     initer = new int[(const int)(n + 1)];
147     for(int i = 1; i <= n; i++)
148         readInteger(initer[i]);
149     st = SegTree(n, initer);
150 }
151
152 inline void solve(){
153     int op, a, b;
154     while(m--){
155         readInteger(op);
156         readInteger(a);
157         readInteger(b);
158         if(op == 1){
159             st.update(st.root, a, b);
160         }else if(op == 2){
161             Pair<long long, long long> p = st.query(st.root, a, b);
162             long long L = b - a + 1;
163 //            long long inv = pow_mod(L * L % moder, moder - 2);
164             int inv = getInv(L * L % moder, moder);
165             long long fm = (L * (p.y % moder) % moder - p.x * p.x % moder + moder) % moder;
166             long long ans = fm * inv % moder;
167             printf("%d\n", (int)ans);
168         }
169     }
170 }
171
172 int main(){
173     init();
174     solve();
175     return 0;
176 }

  不过这道题只有单点修改,那么,可以考虑用树状数组。树状数组的常数比线段树小这是家喻户晓的事情(两者理论时间复杂度一样)。

  另外鉴于洛谷鬼蓄的评测机,把某些只超一点点的取模符号改成三目运算符,就快了100多ms(吐血)。

  由于我比较懒,又赶去学Splay,所以没有来得急写。


T2 漂浮的鸭子

  一道强连同分量的裸题。常见的算法是Tarjan:

  1 /**
  2  * luogu.org
  3  * Problem#2049
  4  * Accepted
  5  * Time:150ms
  6  * Memory:18527k
  7  */
  8 #include<iostream>
  9 #include<fstream>
 10 #include<sstream>
 11 #include<cstdio>
 12 #include<cstdlib>
 13 #include<cstring>
 14 #include<ctime>
 15 #include<cctype>
 16 #include<cmath>
 17 #include<algorithm>
 18 #include<stack>
 19 #include<queue>
 20 #include<set>
 21 #include<map>
 22 #include<vector>
 23 using namespace std;
 24 typedef bool boolean;
 25 #define smin(a, b)    (a) = min((a), (b))
 26 #define smax(a, b)    (a) = max((a), (b))
 27 template<typename T>
 28 inline void readInteger(T& u){
 29     char x;
 30     int aFlag = 1;
 31     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
 32     if(x == -1)    return;
 33     if(x == ‘-‘){
 34         x = getchar();
 35         aFlag = -1;
 36     }
 37     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 3) + (u << 1) + x - ‘0‘);
 38     ungetc(x, stdin);
 39     u *= aFlag;
 40 }
 41
 42 int cv = 0, cc = 0;
 43 stack<int> s;
 44 int* visitID;
 45 int* exitID;
 46 boolean* instack;
 47 boolean* visited;
 48 int* belong;
 49 int* next;
 50
 51 void getSonMap(int end){
 52     int d;
 53     cc++;
 54     do{
 55         d = s.top();
 56         s.pop();
 57         belong[d] = cc;
 58         instack[d] = false;
 59     }while(d != end);
 60 }
 61
 62 void Tarjan(int node){
 63     visitID[node] = exitID[node] = ++cv;
 64     visited[node] = true;
 65     s.push(node);
 66     instack[node] = true;
 67     if(!visited[next[node]]){
 68         Tarjan(next[node]);
 69         smin(exitID[node], exitID[next[node]]);
 70     }else if(instack[next[node]]){
 71         smin(exitID[node], visitID[next[node]]);
 72     }
 73     if(exitID[node] == visitID[node])
 74         getSonMap(node);
 75 }
 76
 77 int n;
 78 int *len;
 79 int *clen;
 80
 81 inline void init(){
 82     readInteger(n);
 83     visitID = new int[(const int)(n + 1)];
 84     exitID = new int[(const int)(n + 1)];
 85     instack = new boolean[(const int)(n + 1)];
 86     visited = new boolean[(const int)(n + 1)];
 87     belong = new int[(const int)(n + 1)];
 88     next = new int[(const int)(n + 1)];
 89     len = new int[(const int)(n + 1)];
 90     memset(visited, false, sizeof(boolean) * (n + 1));
 91     memset(instack, false, sizeof(boolean) * (n + 1));
 92     for(int i = 1; i <= n; i++){
 93         readInteger(next[i]);
 94         readInteger(len[i]);
 95     }
 96 }
 97
 98 int result = 0;
 99 boolean* vis;
100
101 inline void solve(){
102     for(int i = 1; i <= n; i++)
103         if(!visited[i])
104             Tarjan(i);
105     delete[] visitID;
106     delete[] visited;
107     delete[] instack;
108     delete[] exitID;
109     clen = new int[(const int)(cc + 1)];
110     vis = new boolean[(const int)(cc + 1)];
111     memset(vis, false, sizeof(boolean) * (cc + 1));
112     for(int i = 1; i <= n; i++){
113         if(!vis[belong[i]]){
114             int j = i;
115             int l = 0;
116             while(belong[next[j]] == belong[i] && next[j] != i){
117                 l += len[j];
118                 j = next[j];
119             }
120             l += len[j];
121             vis[belong[i]] = true;
122             smax(result, l);
123         }
124     }
125     printf("%d", result);
126 }
127
128 int main(){
129     init();
130     solve();
131     return 0;
132 }

  仔细读题,每个点的出度为1,那么实际上dfs就好了,用不着Tarjan,还开辣么多数组。

 1 /**
 2  * luogu.org
 3  * Problem#2049
 4  * Accepted
 5  * Time:107ms
 6  * Memory:17941k
 7  */
 8 #include<iostream>
 9 #include<fstream>
10 #include<sstream>
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<ctime>
15 #include<cctype>
16 #include<cmath>
17 #include<algorithm>
18 #include<stack>
19 #include<queue>
20 #include<set>
21 #include<map>
22 #include<vector>
23 using namespace std;
24 typedef bool boolean;
25 #define smin(a, b)    (a) = min((a), (b))
26 #define smax(a, b)    (a) = max((a), (b))
27 template<typename T>
28 inline void readInteger(T& u){
29     char x;
30     int aFlag = 1;
31     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
32     if(x == -1)    return;
33     if(x == ‘-‘){
34         x = getchar();
35         aFlag = -1;
36     }
37     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 3) + (u << 1) + x - ‘0‘);
38     ungetc(x, stdin);
39     u *= aFlag;
40 }
41
42 int n;
43 int cc = 0;
44 int *belong;
45 int *next;
46 int *len;
47 int *dist;
48 int result = 0;
49
50 void dfs(int node, int be){
51     belong[node] = be;
52     if(belong[next[node]] == be){
53         int dis = dist[node] - dist[next[node]] + len[node];
54         smax(result, dis);
55     }
56     if(belong[next[node]] == 0){
57         dist[next[node]] = dist[node] + len[node];
58         dfs(next[node], be);
59     }
60 }
61
62 inline void init(){
63     readInteger(n);
64     belong = new int[(const int)(n + 1)];
65     next = new int[(const int)(n + 1)];
66     len = new int[(const int)(n + 1)];
67     dist = new int[(const int)(n + 1)];
68     memset(belong, 0, sizeof(int) * (n + 1));
69     for(int i = 1; i <= n; i++){
70         readInteger(next[i]);
71         readInteger(len[i]);
72     }
73 }
74
75
76 inline void solve(){
77     for(int i = 1; i <= n; i++)
78         if(belong[i] == 0){
79             dist[i] = 0;
80             dfs(i, ++cc);
81         }
82     printf("%d", result);
83 }
84
85 int main(){
86     init();
87     solve();
88     return 0;
89 }

(瞬间剪下33行!)


T3 最大差值

  找到在i前面最小的一个数,边读边更新最小值,边更新结果。(通常来说不是应该放在第一题吗)

 1 /**
 2  * luogu.org
 3  * Problem#2061
 4  * Accepted
 5  * Time:317ms
 6  * Memory:16406k
 7  */
 8 #include<iostream>
 9 #include<fstream>
10 #include<sstream>
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<ctime>
15 #include<cctype>
16 #include<cmath>
17 #include<algorithm>
18 #include<stack>
19 #include<queue>
20 #include<set>
21 #include<map>
22 #include<vector>
23 using namespace std;
24 typedef bool boolean;
25 #define smin(a, b)    (a) = min((a), (b))
26 #define smax(a, b)    (a) = max((a), (b))
27 template<typename T>
28 inline void readInteger(T& u){
29     char x;
30     int aFlag = 1;
31     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
32     if(x == -1)    return;
33     if(x == ‘-‘){
34         x = getchar();
35         aFlag = -1;
36     }
37     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 3) + (u << 1) + x - ‘0‘);
38     ungetc(x, stdin);
39     u *= aFlag;
40 }
41
42 int n;
43 int minv;
44 int res = 0xffffffff;
45
46 inline void solve(){
47     readInteger(n);
48     readInteger(minv);
49     for(int i = 1, a; i < n; i++){
50         readInteger(a);
51         smax(res, a - minv);
52         smin(minv, a);
53     }
54     printf("%d", res);
55 }
56
57 int main(){
58     solve();
59     return 0;
60 }

T4 随机数生成器 

  我先讲我会的内容:

  变形一下可得:

  最后化简得到:

  由于题目数据范围很大,那么只能过70%的数据,于是便有了分块打表:

 1 /**
 2  * luogu.org
 3  * Problem#2062
 4  */
 5 #include<iostream>
 6 #include<fstream>
 7 #include<sstream>
 8 #include<cstdio>
 9 #include<cstdlib>
10 #include<cstring>
11 #include<ctime>
12 #include<cctype>
13 #include<cmath>
14 #include<algorithm>
15 #include<stack>
16 #include<queue>
17 #include<set>
18 #include<map>
19 #include<vector>
20 using namespace std;
21 typedef bool boolean;
22 #define smin(a, b)    (a) = min((a), (b))
23 #define smax(a, b)    (a) = max((a), (b))
24 template<typename T>
25 inline void readInteger(T& u){
26     char x;
27     int aFlag = 1;
28     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
29     if(x == -1)    return;
30     if(x == ‘-‘){
31         x = getchar();
32         aFlag = -1;
33     }
34     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 3) + (u << 1) + x - ‘0‘);
35     ungetc(x, stdin);
36     u *= aFlag;
37 }
38
39 double E = 0;
40 double sum = 0;
41
42 int main(){
43     freopen("a.txt", "w", stdout);
44     unsigned int jg = ((1 << 31) - 1) / 400;
45     cout << "    if(a >= 1 && a < "<< jg <<")    E = 0, sum = 0, q = 2;" << endl;
46     for(int i = 2; i <= jg * 400; i++){
47         E = (sum + i) / (i - 1);
48         sum += E;
49         if(i % jg == 0){
50             printf("    else if(a / %d == %d) E = %0.5llf, sum = %0.5llf, q = %d;\n", jg, i / jg, E, sum, i);
51         }
52     }
53     return 0;
54 }

  由于题目的数据范围有问题,所以第9个点TLE了。那么,我还是把官方正解贴出来(这个是我同学推出来告诉我的,鉴于我语文不好,只好贴官方正解了)

 1 /**
 2  * luogu.org
 3  * Problem#2062
 4  * Accepted
 5  * Time:12ms
 6  * Memory:16410k
 7  */
 8 #include<iostream>
 9 #include<fstream>
10 #include<sstream>
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<ctime>
15 #include<cctype>
16 #include<cmath>
17 #include<algorithm>
18 #include<stack>
19 #include<queue>
20 #include<set>
21 #include<map>
22 #include<vector>
23 using namespace std;
24 typedef bool boolean;
25 #define smin(a, b)    (a) = min((a), (b))
26 #define smax(a, b)    (a) = max((a), (b))
27 template<typename T>
28 inline void readInteger(T& u){
29     char x;
30     int aFlag = 1;
31     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
32     if(x == -1)    return;
33     if(x == ‘-‘){
34         x = getchar();
35         aFlag = -1;
36     }
37     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 3) + (u << 1) + x - ‘0‘);
38     ungetc(x, stdin);
39     u *= aFlag;
40 }
41
42 int n;
43
44 inline void init(){
45     readInteger(n);
46 }
47
48 double sumer = 0;
49 double E = 0;
50
51 inline void solve(){
52     if(n >= 1000000){
53         printf("%0.5lf", 1.57721566490123286060651209 + log(n - 1));
54         return;
55     }
56     E = 0;
57     sumer = 0;
58     for(int i = 2; i <= n; i++){
59         E = (sumer + i) / (i - 1);
60         sumer += E;
61     }
62     printf("%0.5lf", E);
63 }
64
65 int main(){
66     init();
67     solve();
68     return 0;
69 }
时间: 2024-10-25 07:53:23

[题解]洛谷比赛『期末考后的休闲比赛2』的相关文章

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷 P1106 删数问题 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1106 题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和组成的新的正整数.(N不超过250位) 输入数据均不需判错. 输入输出格式 输入格式: n (高精度的正整数) k (需要删除的数字

洛谷 P1855 榨取kkksc03 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1855 题目描述 洛谷的运营组决定,如果一名oier向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有20个或以上的成员,上传10道以上的私有题目,布置过一次作业并成功举办过一次公开比赛),那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkksc03的时间和金钱是有限的,

【基础练习】【背包DP】洛谷1164 小A点菜题解

洛谷的题目又有那令人···的悲剧格式= = 洛谷1164 小A点菜 本题地址:http://www.luogu.org/problem/show?pid=1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种

[NOIP2015提高&amp;洛谷P2678]跳石头 题解(二分答案)

[NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长.由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石). 输入格式

洛谷 P1219 八皇后 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1219 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳

洛谷 P1311 选择客栈 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1311 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费. 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中.晚上,

洛谷 P1022 计算器的改良 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1022 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. 题目描述 为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例: 4+3x=8 6a-5+1=2-2a -5+12y=

洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用.m条单向通道连接相邻的两对情侣所在电影院.然后HXY有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可.并且每对情侣只需烧一遍,电影院可以重复去.然后她想花尽