[loj3333]混合物
假设选择的调味瓶为k1<k2<...<ks,即判定是否存在正有理数解\{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 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束