牛客多校补题(第一场)
A Equivalent Prefixes
单调栈或笛卡尔树
题意:RMQ(u,l,r) 表示在数组u中的l到r的范围内最小值的下标,定义当RMQ(u,l,r)==RMQ(v,l,r) 时 数组u和v相等,让你求一个p使得RMQ(a,1,p)==RMQ(b,1,p).
思路:
(1) 单调栈
维护一个单调递减的单调栈,并用数组a,b存下当前位置被影响的最小值的下标。然后从左开始遍历一遍数组a和b。
第一次不同即为结果
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> solve(void)
{
vector<pair<int,int>> p;
vector<int> ans(n);
p.emplace_back(0,-1);
for(int i=0;i<n;i++)
{
int a;
cin>>a;
while(p.back().first>a)
p.pop_back();
ans[i]=p.back().second;
p.emplace_back(a,i);
}
return ans;
}
int main()
{
while(cin>>n){
vector<int> a=solve();
vector<int> b=solve();
int l=0;
while(l<n&&a[l]==b[l])
l++;
cout<<l<<endl;
}
return 0;
} F Random Point in Triangle
组里大佬的讲解:
首先
J Fraction Comparision
签到题
将原分数化作假分数,分别比较整数和小数部分就保证不会炸
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll x,y;long double a,b;
while(cin>>x>>a>>y>>b){
// cout<<x<<' '<<a<<' '<<y<<' '<<b<<endl;
long double A,B;
A=x%(ll)a;
A/=a;
B=y%(ll)b;
B/=b;
x/=a;
y/=b;
if(x>y)cout<<">"<<endl;
else if(x<y)cout<<"<"<<endl;
else{
if(A>B)cout<<">"<<endl;
else if(A<B)cout<<"<"<<endl;
else cout<<"="<<endl;
}
}
}
查看6道真题和解析