假设选择的调味瓶为$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),也即$\begin{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}\}$,满足$\begin{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}})=0\end{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$条边,若$s\ge 4$,将其划分为$s-2$个三角形,其中总有一个三角形包含$O$,因此$s\le 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}=\begin{cases}\alpha_{j}-\alpha_{i}&(\alpha_{i}\le \alpha_{j})\\\alpha_{j}-\alpha_{i}+2\pi&(\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...\le\alpha_{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}=2\pi-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(n\log 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\n");
50 continue;
51 }
52 if (ans2){
53 printf("2\n");
54 continue;
55 }
56 if ((S.size()<2)||((*--S.end())-(*S.begin())<PI)){
57 printf("0\n");
58 continue;
59 }
60 ld pre=(*--S.upper_bound(PI)),nex=(*S.lower_bound(PI));
61 if (nex-pre>PI)printf("0\n");
62 else printf("3\n");
63 }
64 }

[loj3333]混合物的更多相关文章

  1. 混合物App开发中,在移动设备上调试查看日志,重写window.console

    (function(){ var print={ lock:true, log:function(param){ if(this.lock){ var element=document.createE ...

  2. C#设计模式:单件(例)模式 -- 类也玩计划生育

    这里写的代码,相当于<Head First 设计模式>的读书笔记,原书是java的,自己在学习的过程中将其翻译为C#: (一)剖析经典的单件模式实现 单件模式 -- 确保一个类只有一个实例 ...

  3. float包裹性与破坏性及清除浮动几种方法

    1. “清除浮动” ??准确的描述应该是“清除浮动造成的影响”  学习视频录制推荐的教程<CSS深入理解之float浮动> 2.如何清除浮动造成的影响??? 栗子 块级div元素包含一个内 ...

  4. words

    conscious[英][ˈkɒnʃəs][美][ˈkɑnʃəs]consensus[英][kənˈsensəs][美][kənˈsɛnsəs] scious sensuswaterflood; de ...

  5. CFD计算

    47 求解器为flunet5/6在设置边界条件时,specify boundary types下的types中有三项关于interior,interface,internal设置,在什么情况下设置相应 ...

  6. Flash动画

    Flash (交互式矢量图和Web动画标准) Flash是由macromedia公司推出的交互式矢量图和 Web 动画的标准,由Adobe公 司收购.做Flash动画的人被称之为闪客.网页设计者使用 ...

  7. opencv 人脸识别

      背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  8. iOS之 C++与oc混编

    声明:本文只是随笔,自己做个笔记方便以后查阅如要转载,注明出处.谢谢! 2016年第一篇随笔!!! 由于最近要搞一个项目用到c++的一些api所以要混编,于是就记录下这个过程中的一些细节上的东西! O ...

  9. XML语言基础1

    这学期选修了XML技术这门课,没有发课本,于是参考了W3school教程,整理一下上课的内容. 1.XML简介 XML是一种标记语言,很类似HTML,它不是对HTML的替代,而是对HTML的补充.在大 ...

随机推荐

  1. Linux虚拟机配置静态ip地址

    使用VMware搭建的虚拟机ip地址经常变动,在这里记录一下虚拟机设置静态ip地址: 首先通过VMware菜单栏编辑->虚拟网络编辑器->NAT设置查看子网ip地址和网关ip: 例如我这里 ...

  2. 题解 [NOI2019]弹跳

    题目传送门 题目大意 给出 \(n\) 做城市,每座城市都有横纵坐标 \(x,y\).现在给出 \(m\) 个限制 \(p,t,l,r,d,u\),表示从 \(p\) 城市出发,可以花费 \(t\) ...

  3. LeetCode:堆专题

    堆专题 参考了力扣加加对与堆专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就忘光光了 力扣加加-堆专题(上) 力扣加加-堆专题(下) 总结 优先队列 // 1.java中有优先队 ...

  4. UltraSoft - Alpha - Scrum Meeting 5

    Date: Apr q9th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 统筹个人进度,协助推进进度 辅助前后端连接工作 刘zh 前端 完 ...

  5. [对对子队]会议记录4.18(Scrum Meeting9)

    今天已完成的工作 何瑞 ​ 工作内容:修复了一些关卡1的bug ​ 相关issue:搭建关卡1 ​ 相关签入:4.18签入1 4.18签入2 梁河览 ​ 工作内容:实现了音量控制,添加了BGM ​ 相 ...

  6. JAVA实现表达式求导运算的分析总结

    1第一次作业 1.1题目描述 对形如4*x+x^2+x的多项式求导. 1.2类图 1.3度量分析 在完成第一次作业时,我的写法没有特别的"面向对象".唯一封装起来的是Node,代表 ...

  7. 搬运2:早期写的探究printf

    目录: 1. 关于printf格式化输出 2. printf的一般形式 3. 转换说明 4. 格式化输出的意义 5. 转换说明修饰符 6. 修饰符中的标记 7. printf的返回值 ps:共3250 ...

  8. Linux C语言多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

  9. hdu 3863 No Gambling (不会证明,但是是对的,,)

    题意: N=4时 规则: 双方每次可以连接自己颜色的两个点(相邻,长度为1),线和线不能交叉重叠. 蓝方要连接左右,红方要连接上下. 蓝方先.问谁先连接? 思路: 经过观察....蓝方胜....... ...

  10. 六. Go并发编程--WaitGroup

    一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术. WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束.比如某个go ...