2019牛客暑期多校第一场题解ABCEFHJ
A.Equivalent Prefixes
题意:给你两个数组,求从第一个元素开始到第p个元素 满足任意区间值最小的元素下标相同的 p的最大值。
题解:我们可以从左往右记录到i为止每个区间的最小值有哪些,因为每个值都是不一样的,对于当前的 i 如果1~i中每个区间最小值数量相同那么下标肯定也会相同,否则记录的值的数量就会不同,我们可以用单调栈记录目前为止每个区间的“最小值”的下标,栈里面元素数量不同时肯定不满足条件。
代码:
#include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 + 10; int a[N],b[N],u[N],v[N]; int main() { int n; while(~scanf("%d",&n)) { for (int i = 1; i <= n; i++) scanf("%d",&a[i]); for (int i = 1; i <= n; i++) scanf("%d",&b[i]); int i,cnt1=0,cnt2=0; for ( i = 1; i <= n; i++) { while (cnt1 && a[i] < a[u[cnt1]]) cnt1--; u[++cnt1] = i; while (cnt2 && b[i] < b[v[cnt2]]) cnt2--; v[++cnt2] = i; if (cnt1 != cnt2) break; } printf("%d ", i-1); } return 0; }
B.Integration
题意:已知求
输出
。
题解:
参考博客: https://blog.****.net/mmk27_word/article/details/96450520
https://www.cnblogs.com/yanlifneg/p/11211455.html#commentform
代码:
#include <cstdio> #include <cstring> #define ll long long using namespace std; const int N = 1000 + 10; const ll mod = 1e9 + 7; ll a[N],b[N]; ll qp(ll a,ll b) { ll ans = 1; a%=mod; while(b) { if (b&1) ans = ans * a % mod; a = a * a % mod; b >>= 1; } return ans; } int main() { int n; while(~scanf("%d",&n)) { for (int i = 0; i < n; i++) scanf("%lld",&a[i]); ll ans = 0; for (int i = 0; i < n; i++) { b[i] = 2 * a[i] % mod; for (int j = 0; j < n; j++) if (i != j) b[i] = b[i] * ((a[j]*a[j]-a[i]*a[i])%mod) %mod; b[i] = qp(b[i],mod-2); ans = ((ans + b[i]) % mod + mod) % mod; } printf("%lld ",ans); } return 0; }