好題隨緣題解2020Dec

2022-05-27 11:03:14 字數 2889 閱讀 3764

orz / 按照這個題單刷的

可樂 / 物流運輸 / 區間加區間sin和

停留相當於給自己點建乙個自環,然後走這條邊。

自爆相當於建乙個大點 \(n+1\) ,所有點向大點連向乙個有向邊,這樣就有去無回了!

(所以如果現在機械人panda在東京上野的動物園這個地方自爆,那麼我們就要對它說再見了)

大點的自環只是延續了狀態,並不代表連續自爆。

考慮矩陣乘法。設乙個矩陣 \(\large a_\) 代表從 \(i\) 剛好走一步到 \(j\) 的方案數。

則轉移類似 \(\texttt\) 的過程, \(b_=\sum\limits_^a_*a_\) 這就過於顯然的矩陣乘法了。

則 \(\large a^2_\) 代表從 \(i\) 剛好走兩步到 \(j\) 的方案數。

所以 \(\large a^t\) 就是最後我們需要的,答案就是 \(\sum\limits_^ a^t_\)

所以大點的自環也是有用的。

#include#define rep(i,x,y) for(int i=x;i<=y;i++)

using namespace std;

const int n7=33,mo=2017;

struct dinolead,ans;

int n,m,t,fin;

dino operator * (dino p,dino q)

return tot;

}int rd()

int main()

t=rd();

rep(i,1,n+1)ans.tix[i][i]=1;

while(t)

rep(i,1,n+1)fin=(fin+ans.tix[1][i])%mo;

printf("%d",fin);

return 0;

}

因為資料小,所以可以亂搞~

我們設 \(f_i\) 第 \(1\sim i\) 天的最小花費,\(g_\) 第 \(i\sim j\) 天都走一條路的最小花費。

那麼明顯有 \(f_i=\min\,\min\limits_^if_+g_+\rm\}\)

或是從第一天到第 \(i\) 天都走一條路,不花修改的費用;或是從某一天往後修改,花費修改的費用。

然後怎麼求出 \(g_\) ?

很簡單,把 \(i\sim j\) 的封閉的道路都封閉,然後跑一遍最短路就行啦。(肯定是最短路而不是其它的路徑,因為要求最優解)

#include#define rep(i,x,y) for(int i=x;i<=y;i++)

#define die(x,y) memset(x,y,sizeof x)

using namespace std;

const int n7=22,t7=123,inf=16843009;

struct dino;

bool operator < (dino p,dino q)

int t,n,m,rmb,f[t7],g[t7][t7],ez[t7][n7][n7],e[n7][n7],dis[n7];

bool vis[n7];

int rd()

void dij() );

while(!que.empty()) );

} }}int main()

} int tnp=rd();

rep(i,1,tnp)

rep(l,1,t)

} rep(r,1,t)

printf("%d",f[t]);

return 0;

}

換了個新的pushidown寫法(汗)

和角公式。線段樹維護sin和cos。

#include#define rep(i,x,y) for(int i=x;i<=y;++i)

#define lod long double

#define lon long long

#define ert 1,1,n

#define lsn o<<1,l,mid

#define rsn o<<1|1,mid+1,r

using namespace std;

const int n7=201234,t7=801234;

int n,t,a[n7];lod tre1[t7],tre2[t7];lon laz[t7];

int rd()

void plant(int o,int l,int r)

int mid=(l+r)>>1;

plant(lsn),plant(rsn);

tre1[o]=tre1[o<<1]+tre1[o<<1|1];

tre2[o]=tre2[o<<1]+tre2[o<<1|1];

}void modif(int o,lon x)

void updat(int o,int l,int r,int l,int r,int x)

modif(o<<1,laz[o]);

modif(o<<1|1,laz[o]);

laz[o]=0;

int mid=(l+r)>>1;

if(l<=mid) updat(lsn,l,r,x);

if(r>=mid+1)updat(rsn,l,r,x);

tre1[o]=tre1[o<<1]+tre1[o<<1|1];

tre2[o]=tre2[o<<1]+tre2[o<<1|1];

}lod query(int o,int l,int r,int l,int r)

int main()

if(sys==2)

} return 0;

}

絕 zhen 世 xiang 好題題解

我好菜啊 我是真的菜 撓了半天的頭,還是只想到了o n n 的演算法 不過騙了80分,頭 撓得 疼的實在受不了,搜了一下題解,看了之後看懂了,可覺得講的不是很詳細,秉承著不浪費每一道題的 素質 精神,我決定寫篇blog,希望這樣也能讓我記憶深刻。ps 黎老師連題目名都不改的嗎,我搜尋能力這麼差都搜到...

P4310 絕世好題 題解

第一次看這道題首先想到的就是時間複雜度為 n 的求最長上公升子串行 for int i 1 i n i 這樣寫會超時 所以我們考慮更優秀的演算法,突破口就是位運算 題目中的操作是按位與,所以我們可以把乙個數的每乙個二進位制位分別拆分進行計算 我們設 f i 為當前二進位制位為 i 時滿足要求的最長長...

PAT甲級2020春季真題題解

簽到題,可以使用stoi將字串轉換為數字,然後試除法判斷是否為素數。include include using namespace std bool check const string s intmain 取子串 使用unordered set來做,比set效率高,如果不要求集合有序的話。incl...