3 3考試總結

2022-05-02 02:00:16 字數 4166 閱讀 3033

題意:hdu 5696

給定序列\(a\),分別求長度為\(1\sim n\)的區間最大價值。區間價值定義為區間內最大值乘最小值

題解:分治

暴力將\([l,r]\)內的最小值找出來,擴充套件到兩邊更新答案,再根據這個位置分治

複雜度:\(o(n\log n)\)

#includeusing namespace std;

templateinline void read(t& x)

#define maxn 100005

#define ll long long

int a[maxn], n;

ll ans[maxn], tp[maxn];

void solve(int l, int r)

solve(l, pos - 1), solve(pos + 1, r);

}int main()

題意:51nod 1766

\(n\)個點被\(n-1\)條邊連線成了一顆樹,給出\(a\sim b\)和\(c\sim d\)兩個區間,表示點的標號請你求出兩個區間內各選一點之間的最大距離,即你需要求出\(\max\)

題解:線段樹

顯然乙個區間內的直徑由兩個點組成,兩個區間合併可以有6種方法(自己對自己2種,交叉6種)

用st表+尤拉序算lca(2023年居然還有出題人卡倍增和樹剖lca),得出任意兩點間的距離

用線段樹維護每個區間的直徑資訊

複雜度:\(o(n\log n)\)

#includeusing namespace std;

templateinline void read(t& x)

#define maxn 400005

struct edge

eg[maxn << 1];

int head[maxn], edgenum = 1;

inline void add(int fr, int to, int val)

; head[fr] = edgenum;

}int dfn[maxn], pos[maxn], dfn_clock, dep[maxn], n, dis[maxn];

int st[maxn][20], lg[maxn];

void dfs(int rt)

}inline void make_st()

}inline int getlca(int x, int y)

inline int dist(int x, int y)

struct segmenttree

t[maxn << 2], tp;

#define ls rt<<1

#define rs rt<<1|1

inline node merge(node l, node r)

; }void build(int rt, int l, int r)

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

build(ls, l, mid), build(rs, mid + 1, r);

t[rt] = merge(t[ls], t[rs]);

} node query(int rt, int l, int r, int fr, int to)

inline friend node merge(node l, node r)

; }}s;int main()

return 0;

}

題意:51nod 1611

題解:dp

設\(dp[i]\)為到了第\(i\)條路所能獲得的最大收入

令\(s[i]\)為\(c[i]\)字首和

其中\(val\)為所有\(r\leq i,l\geq j\)的比賽獎勵

所以用線段樹維護\(dp[i]+s[i]+val\)的最大值,查詢之後再減去\(s[i]\)即可

具體的維護方法就是先按\(r\)排序,對於乙個\([l,r]\)的比賽,\([1,l-1]\)區間加\(p[i]\)(左端點大於等於\([1,l-1]\))

然後每次求出\(dp[i]\)時單點加

設\(dp[0]\)為所有路全修的收益(因為轉移方程裡\(j+1\not= 0\))

注意最大值還要和\(dp[0]\)取\(\max\)

複雜度:\(o(n\log n)\)

#includeusing namespace std;

templateinline void read(t& x)

#define maxn 200005

#define ll long long

ll val[maxn];

struct segmenttree

t[maxn << 2];

#define ls rt<<1

#define rs rt<<1|1

inline void pushup(int rt)

inline void pushdown(int rt) }

void build(int rt, int l, int r)

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

build(ls, l, mid), build(rs, mid + 1, r);

pushup(rt);

} void update(int rt, int l, int r, int fr, int to, ll v)

pushdown(rt);

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

if (fr <= mid) update(ls, l, mid, fr, to, v);

if (to > mid) update(rs, mid + 1, r, fr, to, v);

pushup(rt);

} ll query(int rt, int l, int r, int fr, int to)

}s;struct road

}r[maxn];

ll dp[maxn];

int main()

if (i == 1) dp[i] = max(dp[i], dp[0] - val[i]);

else dp[i] = max(dp[i], max(dp[0], s.query(1, 1, n, 1, i - 1)) - val[i]);

s.update(1, 1, n, i, i, dp[i]);

} printf("%lld\n", dp[n]);

return 0;

}

題意:cf547e

給定\(s[i]\)

\(q\)組詢問,每組詢問\(l,r,k\)表示求\(\sum_^\),其中\(count(i,j)\)表示\(s[j]\)作為字串在\(s[i]\)中的出現次數

題解:這個不錯

這個對trie樹和這道題不錯

#includeusing namespace std;

inline void read(int& x)

#define maxn 200005

struct chairmantree

int query(int rt, int las, int l, int r, int fr, int to)

}ct;

struct failtree

eg[maxn << 1];

int head[maxn], edgenum, fail[maxn], dfn_l[maxn], dfn_r[maxn], dfn_clock;

inline void add(int fr, int to)

; head[fr] = edgenum;

} void dfs(int rt)

int son[maxn][26], fa[maxn], tot, pos[maxn];

void insert(int id, char* s)

pos[id] = rt;

} void getfail()

else son[tp][i] = son[fail[tp]][i];

}} }

}t;int root[maxn];

char s[maxn];

int main()

for (int i = 1, l, r, k; i <= q; ++i)

return 0;

}

考試總結 CQOI2017 考試總結

再奮鬥一年,爭取ak noip2016 cqoi2017 這是去年我立的flag。看考場,電腦挺快,而且配置和評測機一樣,可以放心的在自己的電腦上卡常測試啦,好評。碼了一道fft的題,沒網只好拷著回家交,鍵盤蜜汁小,enter佔據了兩行,旁邊還有關機按鈕。座位安排奧妙重重,和巴蜀dyf大神坐在一起。...

MBA考試總結

終於考完了 mba入學統考,兩年來參加了兩次,感覺還是挺辛苦和有壓力的。第一年沒有通過是因為之前了解太遲,大概準備了 20天左右,最後還是功成垂敗。09年其實也一直沒有心情複習的,逼到最後的 20天,狠了一把勁,還是狠狠的複習了幾天,貌似今年應該可以通過了。總結經驗如下 1 如果你決定去做一件事,請...

2016 7 14考試總結。

今天的考試,總的來說不難,但是考得很差,簡直 從中暴露出對知識的掌握不牢固,練習不夠等問題。1.求 方程x1 2x2 nxn m的所有非負整數解 x1,x2,xn 的個數。這個題目在加上取餘運算後就是乙個貨幣系統的問題。也就是揹包。難以接受自己連這是個揹包問題都沒看出來。3 2.其實邪狼王的貪婪也很...