IOIOI卡片占卜

2021-07-11 06:46:03 字數 1108 閱讀 8316

神奇的差分!

把原序列相鄰兩項進行異或得到新序列。

那麼新序列只有4個1,目標是經過一系列操作讓1的個數變為0。

一次操作[l,r]在新序列上相當於把l-1與r取反。

把操作[l,r]視為l-1向r連無向邊,權值為操作的耗時。

如果只有兩個1,答案是最短路。

因為最短路不會出現環,所以除了起點和終點都被經過2次,自身不變。而起點與終點只被經過1次,會由0變成1。

四個1的話暴力兩兩匹配做最短路,取最小值即可。

dij我超時了,打了spfa發現有奇效。

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using namespace std;

typedef long long ll;

const int maxn=500000+10;

int h[maxn],go[maxn*2],dis[maxn*2],next[maxn*2],id[maxn];

int dl[maxn];

bool bz[maxn];

int a[5];

int i,j,k,l,r,n,m,tot,top;

ll t,ans,inf,f[maxn];

void add(int

x,int

y,int z)

if (!bz[y])

go[++tot]=y;

dis[tot]=z;

next[tot]=h[x];

h[x]=tot;

}ll spfa(int

x,int

y) }

t=next[t];

}bz[now]=0;

}return f[y];

}int main()

fo(i,1,4)

}ans=inf+1;

fo(i,1,3)

fo(j,i+1,4)

if (ans==inf+1) printf("-1\n");else

printf("%lld\n",ans);

}

ssoj2458IOIOI卡片占卜(最短路)

題意 給乙個由五部分組成的序列 a個i b個o c個i d個o e個i 又給出n個操作x,y,每次費用為y x 1,問最少花費多少可以將序列變成全i。無解輸出 1。思路 yp,轉化成最短路問題,從i o的交界跑到另乙個交界,最短路將o變成i的花費,有三種跑法,取最小。include include ...

NOIP2015模擬11 3 IOIOI卡片占卜

把原序列變成相鄰的兩個的異或值,初始序列就只有4個1,那麼每次操作只會更改l,r兩個值,問題就轉換成了求這個序列全部為0時的最小代價 顯然使原序列全為1的方案是沒有的 我們把每次的l,r連一條邊,邊權就是 r l 1 一次合法的操作只能把兩個點變成0,代價就是兩個點的最短距離,答案就是把4個1暴力分...

JOISC 2015 Day 1 卡片占卜

點此看題 可以把原來的陣列表示成差分陣列,那麼只有a 1 a b 1.a 1,a b 1.a 1,a b 1.這四個位置有值,我們要把所有值給消去。把操作理解為建邊,那麼找出兩個關鍵點的最短路就是消去這兩個關鍵點,那麼我們消去兩對關鍵點就可以了,有乙個特殊情況就是乙個點和n 1 n 1n 1相連,那...