题意:
有口井,往里扔盘子,最多扔多少个
n<=5e5, 1s
思路:
如果比较高的地方井口比较小,那么下面的再大也没有用,只需要维护一个单调减的数组然后O(n+m)模拟即可
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque> #include<set> #include<vector> #include<map> #include<functional> #define fst first #define sc second #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lc root<<1 #define rc root<<1|1 #define lowbit(x) ((x)&(-x)) using namespace std; typedef double db; typedef long double ldb; typedef long long ll; typedef long long LL; typedef unsigned long long ull; typedef pair<int,int> PI; typedef pair<ll,ll> PLL; const db eps = 1e-6; const int mod = 1e9+7; const int maxn = 2e6+100; const int maxm = 2e6+100; const int inf = 0x3f3f3f3f; const db pi = acos(-1.0); int a[maxn]; int b[maxn]; int n,m; int main(){ int tmp = inf; scanf("%d %d", &n,&m); for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); tmp = min(tmp, a[i]); a[i] = min(tmp, a[i]); } int ans = 0; int p = n; for(int i = 1; i <= m; i++){ int x; scanf("%d", &x); while(p>=1&&a[p]<x){ p--; } if(p){p--;ans++;} } printf("%d",ans); return 0; }
原文:https://www.cnblogs.com/wrjlinkkkkkk/p/10544000.html