神奇的差分!
把原序列相鄰兩項進行異或得到新序列。
那麼新序列只有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相連,那...