題意: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.其實邪狼王的貪婪也很...