牛客多校补题(第一场)
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; } } }