今天又考的奇差
題解:第一題;
這麼簡單一道題我想了好久,智商實在是下線了;
#includeusingview codenamespace
std;
intmain()
第二題:我們發現e的長度很小,我們可以在上面做文章,其實每個位置對應的%strlen(e)都是一樣的;我們用樹狀陣列維護rt[pos][len][yu][id]表示1到pos每次跳len,當前位置%len = yu的id字元有多少個;對於乙個字串,查詢就是rt[r][len][(l + i - 1) % len][a[i]],修改就把長度列舉一下;
這道題我開始想到每次跳len, 維護乙個字首和,但沒有想到樹狀陣列,暴力修改和我直接暴力複雜度差不多;如果想到餘數這一維就好了
#includeusingview codenamespace
std;
const
int m = 1e5 + 10
;char
s[m], ch[m];
int rt[m][11][10][4
], n, a[m], b[m];
inline
intget(charx)}
inline
int lowbit(int x)
void add(int pos, int len, int yu, int id, intd)}
int query(int pos, int id, int k, int
yu)
return
ret;
}void
init()
}void add(int pos, int id, int
d)int
main()
else
printf(
"%d\n
", ans);}}
}
第三題:
線段樹存樹邊,維護最大值更新非樹遍,用非樹邊更新線段樹上的限制;
#includeusingnamespace
std;
const
int m = 2e5 + 10
;const
int oo = 0x3f3f3f3f
;#define ex(i, u) for(int i = h[u]; i; i = g[i].nxt)
#define ls nd->ls, lf, mid
#define rs nd->rs, mid + 1, rg
int fa[m], ans[m], n, m, h[m], top[m], siz[m], son[m], dep[m], in
[m];
intidc, tot, seq[m], line[m];
bool
intree[m], fg;
struct edgeg[m];
struct edgeg[m << 1
];void add(int u, int v, int
i)bool
cmp(edge a, edge b)
bool
cmp_id(edge a, edge b)
int find(int
x)void uni(int u, int
v)struct
node;
void modify(int l, int r, int d, node * nd, int lf, int
rg);
struct
node
}inline
void
up()
}pool[m
<< 2], *tail = pool, *root;
node * build(int lf = 1, int rg =n)
else
return
nd;}
int query(int l, int r, node * nd = root, int lf = 1, int rg =n)
}void modify(int l, int r, int d, node * nd = root, int lf = 1, int rg =n)
else
}void getdown(node * nd = root, int lf = 1, int rg =n)
nd->down(lf, rg);
int mid = (lf + rg) >> 1
; getdown(ls);
getdown(rs);
}void dfs(int u, intf)}
void dfs2(int u, int
tp)}
void modify(int u, int v, int
d)
if(dep[u]
if(in[u] != in[v])modify(in[v] + 1, in
[u], d);
}int query(int u, int
v)
if(dep[u]
if(in[u] != in[v])ans = max(ans, query(in[v] + 1, in
[u]));
//if(fg)printf("%d %d %d\n", u, v, ans);
return
ans;
}int
main();
}sort(g + 1, g + 1 +m, cmp);
for(int i = 1; i <= n; i++)fa[i] =i;
for(int i = 1; i <= m; i++)
line[
1] = 0
; dfs(
1, 0
); dfs2(
1, 1
);
//for(int i = 1; i <= n; i++)printf("%d %d %d\n", i, dep[i], top[i]);puts("");
sort(g + 1, g + 1 +m, cmp_id);
root =build();
for(int i = 1; i <= m; i++)
getdown();
for(int i = 1; i <= m; i++)
printf(
"%d
",ans[i] == oo ? -1
: ans[i]);
}
暑假第二十測
題解 第一題 這道題最先想到的就是貪心,但是純貪心明顯是不對的,如 2 2 1 3 3 貪心結果為2 2 133 但實際是2 21 3 3 所以這樣是不對的。那要怎麼做呢.考慮用dp.階段應該是明顯的就是第幾個數,我們還是要用到貪心的思想,就是保證在最後面的合起來的數盡可能的小 我們用f i 表示到...
第二十六講 深入委託
主要內容 1.我們忽略的事件與委託 有關於視窗載入的系統預定義的原 的理解 2.定義,使用委託 分兩步1.定義要使用的委託 2.建立例項 3.實踐 說媒,娶媳婦的標準 4.多播委託 1.可以讓乙個委託去呼叫一系列的方法 2.採用 增加到執行序列,使用 從序列移除 5.匿名方法 沒有方法簽名,只有方法...
第二十六天總結
求多源 無負權邊的最短路 floyd演算法 floyd warshall演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n3 空間複雜度為o n2 最小生成樹 給定乙個無向圖,...