[杂题 神证明] BZOJ 4893 项链分赃

来源:互联网 发布:ppt制作视频软件 编辑:程序博客网 时间:2024/05/29 17:21

这个题的证明有点妙啊
结论是 切得刀数不超过颜色数

先扯那个地球问题 二维的情况也就是在圆周上 因为两者互换位置 两条图线必定有交点 就证完了
三维 在球面上 我们固定一维转动 看做无数个圆周 都可以找出两点气压一样 又因为函数连续 那么这两点的移动也是连续的 这样就锁定了一维必定相等 也就把问题压低了一维 也就是跟上面同理

然后这有什么用呢 这其实是跟两种颜色对应的问题是等价的
首先在这个题里离散和连续没什么大问题

这里写图片描述

然后任一切法一一对应到了球面上任一点
找到两点气压气温相同 也就是红色的差和绿色的差相同 那么说明差就是0

这里写图片描述

至于三种颜色 在四维球面上做就好了 反正证明是归纳式的

BTW 【官方双语】用球面映射巧解分赃难题:拓扑学的另一妙用

#include<cstdio>#include<cstdlib>#include<algorithm>#include<set>using namespace std;#define mp(a,b) make_pair(a,b)const int N=100005;int n,a[N],b[3],c[3];set<pair<int,pair<int,int> > > Set;int main(){  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  scanf("%d",&n);  for (int i=1;i<=n;i++)    scanf("%d",a+i),b[a[i]]++;  b[0]>>=1; b[1]>>=1; b[2]>>=1;  for (int i=1;i<=n;i++){    c[a[i]]++;    if (b[0]==c[0] && b[1]==c[1] && b[2]==c[2]) return printf("1\n"),0;  }  c[0]=c[1]=c[2]=0;  for (int i=1;i<=n;i++){    c[a[i]]++;    if (Set.count(mp(c[0]-b[0],mp(c[1]-b[1],c[2]-b[2])))) return printf("2"),0;    Set.insert(mp(c[0],mp(c[1],c[2])));  }  return printf("3\n"),0;}
0 0
原创粉丝点击