tem5
tem5
//Hàm đệ quy
void printSubset()
{
for (int i : curSubset) cout << i << " ";
cout << "\n";
}
int main()
{
cin >> n >> k;
curSubset.clear();
genSubset(1);
return 0;
}
------
- SỐ HỌC
---------------------------------------------------------------------
* Tính tổ hợp Ckn tính trước
for (int i = 0; i <= n; i++){
C[i][0] = 1 % MOD;
for (int k = 1; k <= i; k++){
C[i][k] = (C[i - 1][k - 1] + C[i - 1][k]) % MOD;
}
}
-----------------------------------------------------------------------
* Sàng Eratosthenes
const int maxn = 1000000 + 5; //10^6 + 5
bool is_prime[maxn];
void Eratosthenes(int n){
for (int i = 2; i <= n; i++)
is_prime[i] = true;
for (int i = 2; i * i <= n; i++) {
if (is_prime[i]) {
// j sẽ bắt đầu chạy từ i * i
for (int j = i * i; j <= n; j += i)
is_prime[j] = false;
}
}
}
----------
* Ptich số ngto
const int maxn = 1000000 + 5; //10^6 + 5
int min_prime[maxn];
void sieve(int n){
for (int i = 2; i * i <= n; ++i) {
if (min_prime[i] == 0) { //nếu i là số nguyên tố
for (int j = i * i; j <= n; j += i) {
if (min_prime[j] == 0) {
min_prime[j] = i;
}
}
}
}
for (int i = 2; i <= n; ++i) {
if (min_prime[i] == 0) {
min_prime[i] = i;
}
}
}
vector<int> factorize(int n) {
vector<int> res;
while (n != 1) {
res.push_back(minPrime[n]);
n /= minPrime[n];
}
return res;
}
------------------------------------------------------------------------
#include <bits/stdc++.h>
using namespace std;
int Bit[1003][1003],n,m,q,e,x,y,x1,x2,_ymot,y2,a[1004][1004];
void update(int x, int y, int val)
{
for(;x <= n; x += x&(-x))
for(int j = y ;j <= m; j += j&(-j))
Bit[x][j] += val;
}
int get(int x, int y)
{
int res = 0;
for(;x > 0; x -= x&(-x))
for(int j = y;j > 0; j -= j&(-j))
res += Bit[x][j];
return res;
}
int main()
{
cin >> n >> q;
m = n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
char o;
cin >> o;
if(o == '*') a[i][j] = 1;
update(i,j,a[i][j]);
}
}
while(q--)
{
cin >> e;
if(e == 1)
{
cin >> x >> y;
if(get(x,y) - get(x-1,y) - get(x,y-1)+get(x-1,y-1) == 1) update(x,y,-1);
else update(x,y,1);
}
else
{
cin >> x1 >> _ymot >> x2 >>y2;
cout << get(x2,y2) - get(x1-1,y2) - get(x2,_ymot-1) +get(x1-1,_ymot-1)
<<'\n';
}
}
}
----------------------------------------------------------------------
-BIT
struct Bittree{
int BIT[N];
void update(int id, int val)
{
for(; id <= n; id += id&(-id))
BIT[id] += val;
}
int getSum(int id)
{
int res = 0;
for(;id > 0; id -= id&(-id))
res+= BIT[id];
return res;
}
int get(int l, int r)
{
return (getSum(r) - getSum(l-1));
}
}
---------------------------------------------------------------------
* 1D sprase table
////QUERY SUM
// LG là số lớn nhất thoả 2^LG < N
// ví dụ: N = 10^5 thì LG = 16 vì 2^16 = 65536
int a[N], st[LG + 1][N];
void preprocess() {
for (int i = 1; i <= n; ++i) st[0][i] = a[i];
for (int j = 1; j <= LG; ++j)
for (int i = 1; i + (1 << j) - 1 <= n; ++i)
st[j][i] = st[j - 1][i] + st[j - 1][i + (1 << (j - 1))];
}
int querySum(int l, int r) {
int len = r - l + 1;
int sum = 0;
for (int j = 0; (1 << j) <= len; ++j)
if (len >> j & 1) {
sum = sum + st[j][l];
l = l + (1 << j);
}
return sum;
}
///// QEUERY _MIN
// LG là số lớn nhất thoả 2^LG < N
// ví dụ: N = 10^5 thì LG = 16 vì 2^16 = 65536
int a[N], st[LG + 1][N];
void preprocess() {
for (int i = 1; i <= n; ++i) st[0][i] = a[i];
for (int j = 1; j <= LG; ++j)
for (int i = 1; i + (1 << j) - 1 <= n; ++i)
st[j][i] = min(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]);
}
int queryMin(int l, int r) {
int k = __lg(r - l + 1);
return min(st[k][l], st[k][r - (1 << k) + 1]);
}
------
2D Sprase_tablse
int a[M][N], st[LGM + 1][M][LGN + 1][N];
void preprocess() {
for (int k = 0; k <= LGM; ++k) {
for (int i = 1; i + (1 << k) - 1 <= m; ++i) {
for (int l = 0; l <= LGN; ++l) {
for (int j = 1; j + (1 << l) - 1 <= n; ++j) {
if (k == 0) {
if (l == 0) {
st[0][i][0][j] = a[i][j];
}
else {
st[0][i][l][j] = min(st[0][i][l - 1][j], st[0][i][l -
1][j + (1 << (l - 1))]);
}
}
else {
st[k][i][l][j] = min(st[k - 1][i][l][j], st[k - 1][i + (1
<< (k - 1))][l][j]);
}
}
}
}
}
}
int getMin(int x, int y, int a, int b) {
int k = __lg(a - x + 1);
int l = __lg(b - y + 1);
return min({ st[k][x][l][y],
st[k][x][l][b - (1 << l) + 1],
st[k][a - (1 << k) + 1][l][y],
st[k][a - (1 << k) + 1][l][b - (1 << l) + 1] });
___________________________________________________________________________________
_____
______HLD
#include<bits/stdc++.h>
using namespace std;
const int MaxN = 1e5 + 5;
int N, Q;
int Val[MaxN];
vector<int> AdjList[MaxN]; // input
// find LCA
// Segment Tree
// main
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
freopen("cowland.in", "r", stdin);
freopen("cowland.out", "w", stdout);
cin >> N >> Q;
for(int i = 1; i <= N; i++) {
cin >> Val[i];
}
for(int i = 1; i < N; i++) {
int u, v;
cin >> u >> v;
AdjList[u].push_back(v);
AdjList[v].push_back(u);
}
CurPos = CurChain = 1;
Dfs(1);
Hld(1);
Build(1, 1, N);
while(Q--) {
int type;
cin >> type;
if(type == 1) {
// Update
int x, val;
cin >> x >> val;
Update(x, val);
}
else {
int u, v;
cin >> u >> v;
cout << Query(u, v) << '\n';
}
}
}
_____________________________________________________________________
- ĐỒ THỊ
__________
CẦU_KHỚP_TPLTMANH
#include <bits/stdc++.h>
int n, m;
bool joint[maxN];
int timeDfs = 0, bridge = 0;
int low[maxN], num[maxN];
vector <int> g[maxN];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 1; i <= n; i++)
if (!num[i]) dfs(i, i);
int cntJoint = 0;
for (int i = 1; i <= n; i++) cntJoint += joint[i];
/*
tag:
*/
#include <bits/stdc++.h>
int coin[N],n,m;
Vector g[N], adj[N];
int id[N],low[N],tplt[N],r[N],f[N],Time = 0;
stack<int> st;
bool vis[N];
int cc = 0;
int n, m;
struct adj
{
int v;
int u;
long long w;
};
int dist[N];
vector<adj> edges;
int trace[N];
void Ford_Bellman(int s)
{
fill(dist + 1, dist + n + 1, INF);
dist[s] = 0;
for (int i = 0; i < n; i++)
{
for (auto [u, v, W] : edges)
{
if (dist[v] > dist[u] + W)
{
dist[v] = dist[u] + W;
trace[v] = u;
if (i == n - 1)
{
cout << "YES" << endl;
vector<int> cycle;
int node = v;
// for (int j = 0; j < n; j++)
// {
// node = trace[node];
// }
int start = node;
while (true)
{
cycle.push_back(node);
node = trace[node];
if (node == start)
break;
} cycle.push_back(start);
reverse(cycle.begin(), cycle.end());
signed main()
{
cin >> n >> m;
For(i, 1, m)
{
int x, y, w;
cin >> x >> y >> w;
edges.push_back({x, y, w});
//edges.push_back({y,x,w});
}
Ford_Bellman(1);
/*
tag:
*/
#include <bits/stdc++.h>
int n,m;
Vector g[N],Tg[N];
stack<int> S;
bool vis[N];
int Count = 0;
void inp()
{
cin >> n >> m;
For(i,1,m) {
int x,y;
cin >> x >> y;
g[x].push_back(y);
Tg[y].push_back(x);
}
}
void Topo(int s)
{
vis[s] = true;
for(auto x : g[s])
if(!vis[x])
Topo(x);
S.push(s);
}
void DFS(int s)
{
vis[s] = true;
for(auto x : Tg[s])
{ if(!vis[x])
DFS(x);
}
}
void Kosaraju()
{
For(i,1,n)
{
if(!vis[i]) Topo(i);
}
fill(vis+1, vis+n+1, false);
Vector trace;
while(!S.empty()){
int node = S.top();
S.pop();
if(!vis[node]) DFS(node),Count++,trace.push_back(node);
}
if(Count == 1) cout << "YES";
else {
cout << "NO\n";
cout << trace[1] <<' ' << trace[0];
}
}
signed main(){
inp();
Kosaraju();
}
___________________
SMALL_TO_LARGE
int n,m,k;
Vii g[N],a[N];
int par[N], siz[N], Result[N];
void Make_set() {
For(i, 1, n) {siz[i] = 1; par[i] = i;}
}
int Find(int u) {
return (u == par[u]) ? u : par[u] = Find(par[u]);
}
void Union (int u, int v, int idx)
{
u = Find(u);
v = Find(v);
if(u == v) return ;
if(siz[u] < siz[v]) swap(u,v);
par[v] = u;
siz[u] += siz[v];
ios_base :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
bool ok(int i,int j){
return i >= 1 && i <= n && j >= 1 && j <= m;
}
void Make_set() {
For(i, 1, m * n) {siz[i] = 1; par[i] = i;}
}
int Find(int u) {
return (u == par[u]) ? u : par[u] = Find(par[u]);
}
void Union(int u, int v,int idx) {
u = Find(u);
v = Find(v);
if (u == v) return;
if (siz[u] < siz[v]) swap(u, v);
siz[u] += siz[v];
par[v] = u;
for(auto o : g[v])
{ int x = o.fi;
int y = o.si;
if(Result[y] != -1) continue;
if(Find(x) == u)
{
Result[y] = idx ; continue;
}
g[u].push_back({x,y});
}
}
signed main() {
init();
cin >> n >> m >> k;
Make_set();
fill( Result + 1, Result + k + 1, -1);
For(i,1,n)
For(j,1,m)
{
cin >> a[i][j];
adj[a[i][j]].push_back({i,j});
}
For(i,1,k){
int a,b;
cin >> a >> b;
if(a == b) {
Result[i] = a ; continue;
}
g[a].push_back({b,i});
g[b].push_back({a,i});
}
}
_______________________________________________________________________
- XÂU
*tìm xâu xoay có thứ tự từ điển nhỏ nhất
#include <bits/stdc++.h>
using namespace std;
cin >> s;
return 0;
}
-=----------------------------------------------------------
*HASH
9325366013
9507142283
9333449891
101
199
------------------------------------------------------------
*KMP
Sau khi tính mảng KMP, mảng match tính hoàn toàn tương tự (thay S bằng T). Chú ý,
mảng match tính từ 1 (chứ ko for từ 2 như mảng KMP)
int match[MAX];
int k = 0;
for (i : 1 -> n) {
while (k > 0 && t[i] != s[k + 1]) k = kmp[k];
match[i] = t[i] == s[k + 1] ? ++k : 0;
if (match[i] == m) { xâu S xuất hiện tại trong T tại vị trí i - m + 1 }
}
// độ phức tạp: O(n). Tương tự như trên, vòng while luôn làm giảm biến k nên chỉ
thực hiện được không quá n lần (do có tối đa n lần tăng biến k)
------------------------------------------
*MANACHER
#include<bits/stdc++.h>
using namespace std;
const int N = 6e6 + 8;
string tmp;
int ans = 0,vtri;
vector<int> p;
vector<char> s,t;
int len ,K;
void solvesub3()
{ int l = 0, r = -1,num = 0;
for(int i = 1; i <= K; i++)
{
for(int j = 0; j < tmp.size(); j++)
{
t[num] = tmp[j];
num++;
}
}
int n = 2*num,cnt = -1,k;
s.resize(n+10);
p.resize(n+10);
for(int i = 0; i < num; i++)
{
s[++cnt] = '#';
s[++cnt] = t[i];
}
s[++cnt] = '#';
for(int i = 0; i <= n; i++)
{ int j = r - i + l;
if(i > r) k = 1;
else k = min(p[j],r-i);
while(i-k > 0 && i + k < n && s[i-k] == s[i+k]) k++;
if(s[i-k] != s[i + k]) k--;
p[i] = k;
if(ans < p[i])
{
ans = k;
vtri = i;
}
if(i + k >= r)
{
l = i - k;
r = i + k;
}
}
for(int i = vtri - ans; i <= vtri + ans; i ++)
{
if(s[i] == '#') continue;
cout << s[i];
}
int main()
{ ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
K = 1;
cin >> tmp;
len = tmp.size();
t.resize(len*K+10);
return solvesub3(),0;
}
#include<bits/stdc++.h>
using namespace std;
const int MaxN = 255;
int Cnt[MaxN][26];
int Cnt_Odd[MaxN];
int D_odd[MaxN];
int D_even[MaxN];
char c[MaxN][MaxN];
bool Ok[MaxN];
int N,M;
int Ans = 0;
bool Equal(int Row1, int Row2) {
if(!Ok[Row1]) return false;
if(!Ok[Row2]) return false;
for(int j = 0 ; j < 26 ; j++) {
if(Cnt[Row1][j] != Cnt[Row2][j]) return false;
}
return true;
}
void Calc_D_odd() {
int L = 1;
int R = 0;
for(int i = 1 ; i <= N ; i++) {
if(i > R) D_odd[i] = 0;
else D_odd[i] = min(R - i, D_odd[L + (R - i)]);
if (Ok[i]) while(i - D_odd[i] - 1 > 0 && i + D_odd[i] + 1 <= N && Equal(i -
D_odd[i] - 1, i + D_odd[i] + 1)) {
D_odd[i]++;
}
Ans += (D_odd[i] + Ok[i]);
if(i + D_odd[i] > R) {
R = i + D_odd[i];
L = i - D_odd[i];
}
}
}
void Calc_D_even() {
// D_even[i] is the value for the space between i and i + 1
int L = 1;
int R = 0;
for(int i = 1 ; i < N ; i++) {
int j = i + 1;
if(j > R) D_even[i] = 0;
else D_even[i] = min(R - j + 1, D_even[L + (R - j)]);
while(i - D_even[i] > 0 && j + D_even[i] <= N && Equal(i - D_even[i], j +
D_even[i])) {
D_even[i]++;
}
Ans += D_even[i];
if(i + D_even[i] > R) {
R = i + D_even[i];
L = j - D_even[i];
}
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N >> M;
for(int i = 1 ; i <= N ; i++) {
cin >> c[i] + 1;
}
for(int c1 = 1 ; c1 <= M ; c1++) {
for(int c2 = c1 ; c2 <= M ; c2++) {
bool ok = true;
for(int i = 1 ; i <= N ; i++) {
int t = c[i][c2] - 'a';
Cnt[i][t]++;
Node() {
for (int i = 0; i < 26; i++) child[i] = NULL;
exist = cnt = 0;
}
};
int cur;
Node* root;
Trie() : cur(0) {
root = new Node();
};
void add_string(string s) {
Node* p = root;
for (auto f : s) {
int c = f - 'a';
if (p->child[c] == NULL) p->child[c] = new Node();
p = p->child[c];
p->cnt++;
}
p->exist++;
}
if (p != root) {
p->cnt--;
if (p->cnt == 0) {
delete(p); // Khác với cài đặt bằng mảng,
// ta có thể thực sự xóa đỉnh này đi
return true;
}
}
return false;
}
void delete_string(string s) {
if (find_string(s) == false) return;
delete_string_recursive(root, s, 0);
}
bool find_string(string s) {
Node* p = root;
for (auto f : s) {
int c = f - 'a';
if (p->child[c] == NULL) return false;
p = p->child[c];
}
return (p->exist != 0);
}
};
#include <bits/stdc++.h>
using namespace std;
// Tên chương trình
const string NAME = "code";
// Số test kiểm tra
const int NTEST = 100;
mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count());
#define rand rd
int main()
{
srand(time(NULL));
for (int iTest = 1; iTest <= NTEST; iTest++)
{
ofstream inp((NAME + ".inp").c_str());
// Code phần sinh test ở đây
inp.close();
// Nếu dùng Linux thì "./" + Tên chương trình
system((NAME + ".exe").c_str());
system((NAME + "_trau.exe").c_str());
// Nếu dùng linux thì thay fc bằng diff
if (system(("fc " + NAME + ".out " + NAME + ".ans").c_str()) != 0)
{
cout << "Test " << iTest << ": WRONG!\n";
return 0;
}
cout << "Test " << iTest << ": CORRECT!\n";
}
return 0;
}
bao loi
#include <bits/stdc++.h>
using namespace std;
// Kiểu điểm
struct Point {
int x, y;
};
// A -> B -> C đi theo thứ tự theo chiều kim đồng hồ (-1), thẳng hàng (0), ngược
chiều kim đồng hồ (1)
int ccw(const Point &A, const Point &B, const Point &C) {
long long S = cross(A, B, C);
if (S < 0) return -1;
if (S == 0) return 0;
return 1;
}
// Trả về bao lồi với thứ tự các điểm được liệt kê ngược chiều kim đồng hồ
vector<Point> convexHull(vector<Point> p, int n) {
// Đưa điểm có tung độ nhỏ nhất (và trái nhất) lên đầu tập
for (int i = 1; i < n; ++i) {
if (p[0].y > p[i].y || (p[0].y == p[i].y && p[0].x > p[i].x)) {
swap(p[0], p[i]);
}
}
// Sắp xếp các điểm I theo góc tạo bởi trục hoành theo chiều dương và OI
sort(p.begin() + 1, p.end(), [&p](const Point &A, const Point &B) {
int c = ccw(p[0], A, B);
if (c > 0) return true;
if (c < 0) return false;
return A.x < B.x || (A.x == B.x && A.y < B.y);
});
// Tập bao lồi
vector<Point> hull;
hull.push_back(p[0]);