把原序列變成相鄰的兩個的異或值,初始序列就只有4個1,那麼每次操作只會更改l,r兩個值,
問題就轉換成了求這個序列全部為0時的最小代價(顯然使原序列全為1的方案是沒有的),
我們把每次的l,r連一條邊,邊權就是(r-l+1),一次合法的操作只能把兩個點變成0,代價就是兩個點的最短距離,
答案就是把4個1暴力分成兩組的兩兩最短距離和,
重複的情況是有的,但答案一定不是最優的,
#include
#include
#include
#include
#include
#include
#define foi(i,a,b) for(i=a;i<=b;i++)
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fo1(i,a,b) for(int i=a;i>=b;i--)
//#define read(a) scanf("%d",&a)
using
namespace
std;
typedef
long
long ll;
const
int n=500500;
const ll inf=9223372036854775800;
int read(int &n)
int m,n;
int a[5];
int a[n],b0,b[2*n][3];
int d[3*n];
ll d1[n],ans;
bool z[n];
void join(int q,int w,int e,int e)
int spfa(int q)
}z[q]=0;
}}int main()
ans=inf;
spfa(a[0]),w=d1[a[1]],spfa(a[2]),w+=d1[a[3]];ans=min(ans,w);
spfa(a[0]),w=d1[a[2]],spfa(a[1]),w+=d1[a[3]];ans=min(ans,w);
spfa(a[0]),w=d1[a[3]],spfa(a[1]),w+=d1[a[2]];ans=min(ans,w);
if(ans>=inf/3)printf("-1\n");
else
printf("%lld\n",ans);
return
0;}
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...
NOIP2015模擬11 3 備用鑰匙
你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...
裝飾大樓 NOIP2015模擬11 3
其實和這東西只是扯上邊而已,完全沒有考演算法 切入正題 際資訊學奧林匹克競賽將要在日本召開了。為了歡迎全世界的選手們,委員會決定將從機場到宿舍沿路的大樓裝飾起來。根據某著名設計師的設計,做裝飾的大樓從機場到宿舍的方向必須高度嚴格遞增。也就是說,如果做裝飾的大樓從機場開始高度順次為hi,那麼必須滿足h...