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...