2019牛客暑期多校训练营 第一场

牛客多校还是挺难的。三个人各种白给。

题目链接:https://ac.nowcoder.com/acm/contest/881#question


A:

题意就是找到两个数组第一次出现极小值位置不一样的情况。拿样例来说:a={3,1,5,2,4}, b={5 2 4 3 1}。a数组在第四个位置出现了极小值,而b数组在第四个位置并没有出现极小值。

故用两个单调递增栈来维护极小值位置最方便。只要两个栈弹出数量不一样就说明出现了极小值位置不一的情况。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 #define mid (curl+curr>>1)
17 /* namespace */
18 using namespace std;
19 /* header end */
20 
21 const int maxn = 1e5 + 10;
22 int n, a[maxn], b[maxn];
23 stack<int>s1, s2;
24 
25 int main() {
26     a[0] = b[0] = 0;
27     while (~scanf("%d", &n)) {
28         rep1(i, 1, n) scanf("%d", &a[i]);
29         rep1(i, 1, n) scanf("%d", &b[i]);
30         while (!s1.empty()) s1.pop();
31         while (!s2.empty()) s2.pop();
32         s1.push(1); s2.push(1);
33         int p;
34         for (p = 2; p <= n; p++) {
35             int num = 0;
36             while (!s1.empty() && a[p] < a[s1.top()]) num++, s1.pop();
37             while (!s2.empty() && b[p] < b[s2.top()]) num--, s2.pop();
38             if (num) break;
39             s1.push(p); s2.push(p);
40         }
41         printf("%d\n", p - 1);
42     }
43     return 0;
44 }
View Code

D:

神仙题。

F:

样例给了三组毫无作用的数据,恶意满满。

最快的做法是设一个大的三角形(0,0),(10000,0),(0,10000),枚举三角形内所有的整点并维护最终答案。然后计算答案和三角形面积比例,算出来正好逼近11/2。

实际上11/2这个数很难看出来。计算答案和三角形面积的两倍(设为S。这个用叉乘就可以做到,不仅方便而且比海伦公式精度高,海伦公式会爆long long)的比例,得到21.×××××,再试一下输出10.5S和11S,答案正好就是11S。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 #define mid (curl+curr>>1)
17 /* namespace */
18 using namespace std;
19 /* header end */
20 
21 ll p1, q1, p2, q2, p3, q3;
22 
23 int main() {
24     while (~scanf("%lld%lld%lld%lld%lld%lld", &p1, &q1, &p2, &q2, &p3, &q3)) {
25         pair<ll, ll> x = mp(p2 - p1, q2 - q1), y = mp(p3 - p1, q3 - q1);
26         ll ans = x.first * y.second - y.first * x.second;
27         printf("%lld\n", (ll)abs(ans) * 11);
28     }
29     return 0;
30 }
View Code

G:

神仙题。

J:

比较两个分数的大小。Python题,Java题,__int128题。

 1 import sys
 2  
 3 for line in sys.stdin:
 4     (x, y, a, b) = line.split()
 5     x = int(x)
 6     y = int(y)
 7     a = int(a)
 8     b = int(b)
 9     if (x * b == a * y):
10         print("=")
11     elif (x * b < a * y):
12         print("<")
13     else:
14         print(">")
View Code

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/11209641.html