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;
        }
    }
}