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

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

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

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

这里写图片描述

然后任一切法一一对应到了球面上任一点
找到两点气压气温相同 也就是红色的差和绿色的差相同 那么说明差就是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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值