BZOJ4893 項鏈分贓


第一次出題233

先給出結論,切的刀數一定小於等於顏色個數。

所以暴力判掉1和2,剩下輸出3就行了。

你肯定會問“為什么?!”

讓我嘗試證明一下這個東西。

--------------------------------以下開始證(瞎)明(扯)環節--------------------------------

假設地球是一個完美的球體,而且氣溫和氣壓的變化是連續的,那么地球上一定存在一對相對的點氣溫和氣壓都相等。

證明:

假設你和你的女朋友都繞赤道走了半圈,且時刻保持你們兩個所處的位置相對。

我們把赤道上氣溫氣壓的圖像畫出來,大概是這個樣子的:

你初始在A,你女朋友初始在B,最終你們兩個交換位置,那么你和你的女朋友一定存在某個時刻氣壓相等,我們把氣壓相等的那兩個點拿出來。

把所有這樣類似赤道的弧都這么做得到兩點,並把這兩點都畫出來,大概是這個樣子:

你初始在A,走的路線為綠線,你女朋友初始在B,走的路線為紅線,走的過程時刻保持氣壓相等,最終交換位置,那么中途肯定存在一個點(點C),使得你和你女朋友氣溫氣壓都相等。

用數學語言描述一下就是,存在一個點(x,y,z),使得f(x,y,z)=f(-x,-y,-z).

那么這個地球問題就證(扯)完了。

到現在你可能覺得我在扯淡,所以這跟這道題有什么關系呢。

我們先把這個項鏈從離散變為連續的,即如果以前是這樣:

那么我們把它變成這樣:

可以發現如果從中間切開,不會影響答案。

假如只有兩個顏色,設整個項鏈為1,你切兩刀分為了三段,長度分別為$x^2$,$y^2$,$z^2$,那么滿足$x^2+y^2+z^2=1$,它對應地球上的一個點(x,y,z),x,y,z的兩個根分別對應分給海盜1和2。

比如$x=\frac{\sqrt{2}}2$,$y=-\frac{\sqrt{3}}3$,$z=\frac{\sqrt{6}}6$,x,z是正數就意味着給海盜1,y是負數就意味着給海盜2.

那么又因為變化是連續的,所以必然存在f(x,y,z)=f(-x,-y,-z),這表明兩個海盜交換后沒有變,也就是每種顏色數目都相等。

當顏色數更多的時候,就相當於k維球做這些事情,方法基本相同。

如果你能看懂我丑陋的證明,應該會恍然大悟,拓撲學就是這么的美妙。

#include <cstdio>
#include <map>
using namespace std;
#define mk(a,b) make_pair(a,b)

int n,s[3],t[3],a[100005];
map<pair<int,pair<int,int> >,int> mp;

int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),s[a[i]]++;
    for(int i=1;i<=n;i++) {
        t[a[i]]++;
        if(s[0]==t[0]*2&&s[1]==t[1]*2&&s[2]==t[2]*2) return puts("1"),0;
    }
    t[0]=t[1]=t[2]=0;
    for(int i=1;i<=n;i++) {
        t[a[i]]++;
        if(mp[mk(t[0]-s[0]/2,mk(t[1]-s[1]/2,t[2]-s[2]/2))]) return puts("2"),0;
        mp[mk(t[0],mk(t[1],t[2]))]=1;
    }
    return puts("3"),0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM