• [loj3333]混合物


    假设选择的调味瓶为$k_{1}<k_{2}<...<k_{s}$,即判定是否存在正有理数解${x_{1},x_{2},...,x_{s}}$,满足
    $$
    (sum_{i=1}^{s}x_{i}S_{k_{i}}):(sum_{i=1}^{s}x_{i}P_{k_{i}}):(sum_{i=1}^{s}x_{i}G_{k_{i}})=S_{f}:P_{f}:G_{f}
    $$
    将三者的和作为分母(避免为0),也即$egin{cases}frac{sum_{i=1}^{s}x_{i}S_{k_{i}}}{sum_{i=1}^{s}x_{i}(S_{k_{i}}+P_{k_{i}}+G_{k_{i}})}=frac{S_{f}}{S_{f}+P_{f}+G_{f}}\frac{sum_{i=1}^{s}x_{i}P_{k_{i}}}{sum_{i=1}^{s}x_{i}(S_{k_{i}}+P_{k_{i}}+G_{k_{i}})}=frac{P_{f}}{S_{f}+P_{f}+G_{f}}end{cases}$(此时另一项必然成立)

    事实上,这等价于存在正有理数解${y_{i}}$,满足$egin{cases}sum_{i=1}^{s}y_{i}(frac{S_{k_{i}}}{S_{k_{i}}+P_{k_{i}}+G_{k_{i}}}-frac{S_{f}}{S_{f}+P_{f}+G_{f}})=0\sum_{i=1}^{s}y_{i}(frac{P_{k_{i}}}{S_{k_{i}}+P_{k_{i}}+G_{k_{i}}}-frac{P_{f}}{S_{f}+P_{f}+G_{f}})=0end{cases}$

    关于等价性,证明如下——

    如果存在解${x_{i}}$,令$y_{i}=frac{x_{i}(S_{k_{i}}+P_{k_{i}}+G_{k_{i}})}{sum_{j=1}^{s}x_{j}(S_{k_{j}}+P_{k_{j}}+G_{k_{j}})}$代入显然成立,即存在

    如果存在解${y_{i}}$,令$x_{i}=frac{y_{i}}{S_{k_{i}}+P_{k_{i}}+G_{k_{i}}}$代入显然成立,即存在

    记点$P_{i}(frac{S_{{i}}}{S_{{i}}+P_{{i}}+G_{{i}}}-frac{S_{f}}{S_{f}+P_{f}+G_{f}},frac{P_{{i}}}{S_{{i}}+P_{{i}}+G_{{i}}}-frac{P_{f}}{S_{f}+P_{f}+G_{f}})$,存在解${y_{i}}$即等价于${P_{k_{i}}}$这些点的凸包包含$O$(包括边界)

    换言之,也即找到一个边数最少的凸多边形,其顶点在${P_{i}}$中且包含$O$

    设其有$s$条边,若$sge 4$,将其划分为$s-2$个三角形,其中总有一个三角形包含$O$,因此$sle 3$

    当$s=1$,即一个顶点,那么必然为$O$,也即判定是否存在$i$使得$P_{i}=O$

    统计$P_{i}=O$的个数即可,复杂度为$o(1)$

    当$s=2$,即是一条经过$O$的线段,也即判定是否存在$i$和$j$使得$angle P_{i}OP_{j}=pi$

    (这里认为$angle P_{i}OP_{j}$是有方向的,即从$OP_{i}$这条射线逆时针旋转至$OP_{j}$的角度)

    令$alpha_{i}$为$P_{i}$到圆心的极角(不考虑$P_{i}=O$的点),则$angle P_{i}OP_{j}=egin{cases}alpha_{j}-alpha_{i}&(alpha_{i}le alpha_{j})\alpha_{j}-alpha_{i}+2pi&(alpha_{i}>alpha_{j})end{cases}$

    由此,即判定是否存在$|alpha_{i}-alpha_{j}|=pi$,对$alpha_{i}$用map/set维护即可,复杂度为$o(log n)$

    当$s=3$,即是一个三角形,也即判定是否存在$i,j$和$k$使得$angle P_{i}OP_{j},angle P_{j}OP_{k},angle P_{k}OP_{i}le pi$

    将$P_{i}$按照$alpha_{i}$从小到大排序,即$alpha_{1}le alpha_{2}le...lealpha_{n}$,若存在$angle P_{i}OP_{i mod n+1}>pi$,考虑这个角总会在上述三个角某一个的内部,即该角度$>pi$,因此无解

    另一方面,若不存在$angle P_{i}OP_{i mod n+1}le pi$,那么取$i=1$、$j=max_{alpha_{x}-alpha_{i}le pi}x$和$k=max_{alpha_{x}-alpha_{j}le pi}x$,显然利用上述性质分析可得$i<j<k$

    进而,根据定义有$angle P_{i}OP_{j},angle P_{j}OP_{k}le pi$,同时$angle P_{k}OP_{i}=2pi-P_{i}OP_{k}<pi$(显然$P_{i}OP_{k}>pi$,否则$j$可以取$k$,与$j$最大性矛盾),满足条件

    由此,即判定是否存在$angle P_{i}OP_{i mod n+1}>pi$

    注意到这个角一定会"经过"(指旋转过程中)$x$轴的正半轴或负半轴,否则显然不可能$>pi$,同时其中"经过"$x$轴的正半轴或负半轴的角只有两个——即$P_{n}OP_{1}$和$P_{k}OP_{k+1}$(其中$alpha_{k}<pi<alpha_{k+1}$)

    用set维护即可,复杂度为$o(log n)$

    总时间复杂度为$o(nlog n)$,可以通过

    (精度误差比较严重,set中要手写比较函数)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 100005
     4 #define eps 1e-10
     5 #define PI acos((ld)-1.0)
     6 #define ll long long
     7 #define ld long double
     8 struct cmp{
     9     bool operator () (const ld &x,const ld &y)const{
    10         return x+eps<y;
    11     }
    12 };
    13 multiset<ld,cmp>S;
    14 multiset<ld,cmp>::iterator it;
    15 int n,m,x,ans1,ans2;
    16 ld A,B,C,AA,BB,CC,a[N],b[N],c[N];
    17 char s[11];
    18 ld get(ld k){
    19     if (k<PI)return k+PI;
    20     return k-PI;
    21 }
    22 int main(){
    23     scanf("%Lf%Lf%Lf%d",&A,&B,&C,&n);
    24     ld ss=A+B+C;
    25     A/=ss,B/=ss;
    26     for(int i=1;i<=n;i++){
    27         scanf("%s",s);
    28         if (s[0]=='A'){
    29             scanf("%Lf%Lf%Lf",&AA,&BB,&CC);
    30             a[++m]=AA/(AA+BB+CC)-A;
    31             b[m]=BB/(AA+BB+CC)-B;
    32             if ((!a[m])&&(!b[m]))ans1++;
    33             else{
    34                 c[m]=atan2(a[m],b[m]);
    35                 if (c[m]<0)c[m]+=2*PI;
    36                 if ((S.find(c[m])==S.end())&&(S.find(get(c[m]))!=S.end()))ans2++;
    37                 S.insert(c[m]);
    38             }
    39         }
    40         else{
    41             scanf("%d",&x);
    42             if ((!a[x])&&(!b[x]))ans1--;
    43             else{
    44                 S.erase(S.find(c[x]));
    45                 if ((S.find(c[x])==S.end())&&(S.find(get(c[x]))!=S.end()))ans2--;
    46             } 
    47         }
    48         if (ans1){
    49             printf("1
    ");
    50             continue;
    51         }
    52         if (ans2){
    53             printf("2
    ");
    54             continue;
    55         }
    56         if ((S.size()<2)||((*--S.end())-(*S.begin())<PI)){
    57             printf("0
    ");
    58             continue;
    59         }
    60         ld pre=(*--S.upper_bound(PI)),nex=(*S.lower_bound(PI));
    61         if (nex-pre>PI)printf("0
    ");
    62         else printf("3
    "); 
    63     }
    64 } 
    View Code
  • 相关阅读:
    Apache Spark源码走读之4 -- DStream实时流数据处理
    Apache Spark源码走读之3 -- Task运行期之函数调用关系分析
    Apache Spark源码走读之2 -- Job的提交与运行
    Apache Spark源码走读之1 -- Spark论文阅读笔记
    Spark
    (转)互联网广告综述之点击率特征工程
    Java排序算法之冒泡排序
    java枚举
    第二课、数据的艺术---------------------狄泰软件学院
    第一课、进阶高手的大门--------------------狄泰软件学院
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14928134.html
Copyright © 2020-2023  润新知