Algo-Trian
This commit is contained in:
		@@ -0,0 +1,51 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
set<vector<int>> result;
 | 
			
		||||
 | 
			
		||||
bool check(const vector<int>& path, int pos) {
 | 
			
		||||
    int row = path.size(); // <20><>ǰҪ<C7B0>ŵ<EFBFBD><C5B5><EFBFBD>
 | 
			
		||||
    for (int i = 0; i < row; i++) {
 | 
			
		||||
        // ͬ<><CDAC> <20><> <20>ڶԽ<DAB6><D4BD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        if (path[i] == pos || abs(path[i] - pos) == row - i) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dfs(vector<int>& path_, int n){
 | 
			
		||||
	if(path_.size() == n){
 | 
			
		||||
		result.emplace(path_);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	int js = 0;
 | 
			
		||||
	for(int i = 0; i < n; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if(check(path_, i)){
 | 
			
		||||
			js++;
 | 
			
		||||
			path_.push_back(i);
 | 
			
		||||
			dfs(path_, n);
 | 
			
		||||
			path_.pop_back();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
int main(){
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<int> path;
 | 
			
		||||
	dfs(path, n);
 | 
			
		||||
	auto it = result.begin();
 | 
			
		||||
	for(int i = 0; i < 3; i++){
 | 
			
		||||
		for(auto x : *it){
 | 
			
		||||
			cout << x + 1 << " ";
 | 
			
		||||
		}
 | 
			
		||||
		cout << endl;
 | 
			
		||||
		it++;
 | 
			
		||||
	} 
 | 
			
		||||
	cout << result.size() << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								Algorithm/BigNum/P1601 A+B Problem(高精).cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Algorithm/BigNum/P1601 A+B Problem(高精).cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <string>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
string add(string a, string b) {
 | 
			
		||||
    reverse(a.begin(), a.end());
 | 
			
		||||
    reverse(b.begin(), b.end());
 | 
			
		||||
 | 
			
		||||
    int ms = max(a.size(), b.size()); 
 | 
			
		||||
    string tmp;
 | 
			
		||||
    tmp.resize(ms + 1, '0');
 | 
			
		||||
 | 
			
		||||
    int carry = 0;
 | 
			
		||||
    for (int i = 0; i < ms; i++) {
 | 
			
		||||
        int x = (i < a.size() ? a[i] - '0' : 0);
 | 
			
		||||
        int y = (i < b.size() ? b[i] - '0' : 0);
 | 
			
		||||
        int sum = x + y + carry;
 | 
			
		||||
        tmp[i] = sum % 10 + '0';
 | 
			
		||||
        carry = sum / 10;
 | 
			
		||||
    }
 | 
			
		||||
    if (carry) tmp[ms] = carry + '0';
 | 
			
		||||
    else tmp.pop_back();
 | 
			
		||||
 | 
			
		||||
    reverse(tmp.begin(), tmp.end());
 | 
			
		||||
    return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    string a, b;
 | 
			
		||||
    cin >> a >> b;
 | 
			
		||||
    cout << add(a, b) << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								Algorithm/Bit/P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Algorithm/Bit/P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
int checkbin(long long s){
 | 
			
		||||
	int js = 0;
 | 
			
		||||
	while(s){
 | 
			
		||||
		js += (s & 1);
 | 
			
		||||
		s = s>> 1;
 | 
			
		||||
	}
 | 
			
		||||
	return js;
 | 
			
		||||
}
 | 
			
		||||
int main(){
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<long long> s(n);
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		int a, b;
 | 
			
		||||
		cin >> a >> b;
 | 
			
		||||
		s[i] = ( 1 << (a - 1) ) + (b - 1);
 | 
			
		||||
	}
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		if(checkbin(s[i]) % 2 == 0)	cout << "BLACK" << endl;
 | 
			
		||||
		else cout << "RED" << endl; 
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										35
									
								
								Algorithm/Bit/全排列.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Algorithm/Bit/全排列.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <iomanip> 
 | 
			
		||||
using namespace std;
 | 
			
		||||
vector<vector<int>> result;
 | 
			
		||||
void dfs(vector<int>& path, vector<bool>& used, int n){
 | 
			
		||||
	int js = 0;
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		if(used[i] == false){
 | 
			
		||||
			js++;
 | 
			
		||||
			used[i] = true;
 | 
			
		||||
			path.push_back(i);
 | 
			
		||||
			dfs(path, used, n);
 | 
			
		||||
			path.pop_back();
 | 
			
		||||
			used[i] = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(js == 0){
 | 
			
		||||
		result.push_back(path);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
int main(){
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<int> path;
 | 
			
		||||
	vector<bool> used(n, false);
 | 
			
		||||
	dfs(path, used, n);
 | 
			
		||||
	for(auto x : result){
 | 
			
		||||
		for(auto y: x){
 | 
			
		||||
			cout << setw(5) << y + 1;
 | 
			
		||||
		} 
 | 
			
		||||
		cout << endl;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								Algorithm/DP-DynamicProgramming/Linear-DP/P1115 最大子段和.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Algorithm/DP-DynamicProgramming/Linear-DP/P1115 最大子段和.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <climits>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
using namespace std;
 | 
			
		||||
const int INF = INT_MAX >> 1;
 | 
			
		||||
int main() {
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<int> a(n);
 | 
			
		||||
	vector<int> dp(n + 1, -INF);
 | 
			
		||||
	for (int i = 0; i < n; i++) {
 | 
			
		||||
		cin >> a[i];
 | 
			
		||||
	}
 | 
			
		||||
	dp[0] = 0;
 | 
			
		||||
	for (int i = 1; i < n + 1; i++) {
 | 
			
		||||
		dp[i] = max(dp[i - 1] + a[i - 1], a[i - 1]);
 | 
			
		||||
	}
 | 
			
		||||
	cout << *max_element(dp.begin() + 1, dp.end()) << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,31 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main(){
 | 
			
		||||
    ios::sync_with_stdio(false);
 | 
			
		||||
    cin.tie(nullptr);
 | 
			
		||||
    
 | 
			
		||||
	string s;
 | 
			
		||||
    cin >> s;
 | 
			
		||||
    int n = s.size();
 | 
			
		||||
    vector<int> dp(n, 1);
 | 
			
		||||
    //dp[i]: <20><>i<EFBFBD><69>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EEB3A4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
 | 
			
		||||
    //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
 | 
			
		||||
    //Ԥ<><D4A4><EFBFBD><EFBFBD>
 | 
			
		||||
    for(int i = 1; i < n; i++){
 | 
			
		||||
        if(s[i] == s[i - 1] + 1 || s[i] == s[i - 1]){
 | 
			
		||||
            dp[i] = dp[i - 1] + 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ݳ⣬<DDB3><E2A3AC>ô<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    int sum = 0;
 | 
			
		||||
    for(int i = 0; i < n; i++){
 | 
			
		||||
        //<2F>Լ<EFBFBD><D4BC><EFBFBD> 
 | 
			
		||||
        sum += (dp[i] - 1) * dp[i] / 2;
 | 
			
		||||
        //ǰ<><C7B0>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 
 | 
			
		||||
        sum += dp[i] * (i - dp[i]);
 | 
			
		||||
    }
 | 
			
		||||
    cout << sum << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <tuple>
 | 
			
		||||
#include <cmath>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
using namespace std;
 | 
			
		||||
//tuple(t, x, y)
 | 
			
		||||
int dist(const tuple<int, int, int>& i, const tuple<int, int, int>& j){
 | 
			
		||||
	return ( abs(get<1>(i) - get<1>(j)) + abs(get<2>(i) - get<2>(j)) );
 | 
			
		||||
}
 | 
			
		||||
int time(const tuple<int, int, int>& i, const tuple<int, int, int>& j){
 | 
			
		||||
	return abs( get<0>(i) - get<0>(j) );
 | 
			
		||||
}
 | 
			
		||||
int main(){
 | 
			
		||||
	int n, m;
 | 
			
		||||
	cin >> n >> m;
 | 
			
		||||
	//n * n, m <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	vector<tuple<int, int, int>> ham(m);
 | 
			
		||||
	vector<int> dp(m, 1);
 | 
			
		||||
	for(int i = 0; i < m; i++){
 | 
			
		||||
		int t, x, y;
 | 
			
		||||
		cin >> t >> x >> y;
 | 
			
		||||
		ham[i] = make_tuple(t, x, y);
 | 
			
		||||
	} 
 | 
			
		||||
	//dp[m] = max (<28><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>(t2 - t1 > dist)dp[x] + 1)
 | 
			
		||||
	for(int i = 1; i < m; i++){
 | 
			
		||||
		for(int j = 0; j < i; j++){
 | 
			
		||||
			//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><CDB8><EFBFBD> 
 | 
			
		||||
			if(dist(ham[i], ham[j]) <= time(ham[i], ham[j])){
 | 
			
		||||
				dp[i] = max(dp[i], dp[j] + 1);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} 
 | 
			
		||||
	cout << *max_element(dp.begin(), dp.end()) << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								Algorithm/DP-DynamicProgramming/P1807 最长路.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								Algorithm/DP-DynamicProgramming/P1807 最长路.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
const int NEG_INF = -1e9;
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    int v, e;
 | 
			
		||||
    cin >> v >> e;
 | 
			
		||||
 | 
			
		||||
    vector<vector<int>> dp(v, vector<int>(v, NEG_INF));
 | 
			
		||||
    for (int i = 0; i < v; i++) dp[i][i] = 0;  // <20>Ի<EFBFBD>=0
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < e; i++) {
 | 
			
		||||
        int a, b, w;
 | 
			
		||||
        cin >> a >> b >> w;
 | 
			
		||||
        dp[a - 1][b - 1] = max(dp[a - 1][b - 1], w); // <20><><EFBFBD>ܶ<EFBFBD><DCB6><EFBFBD><EFBFBD>ߣ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int k = 0; k < v; k++) {
 | 
			
		||||
        for (int i = 0; i < v; i++) {
 | 
			
		||||
            if (dp[i][k] <= NEG_INF / 2) continue;
 | 
			
		||||
            for (int j = 0; j < v; j++) {
 | 
			
		||||
                if (dp[k][j] <= NEG_INF / 2) continue;
 | 
			
		||||
                dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int mx = -1;
 | 
			
		||||
    for (int i = 0; i < v; i++) {
 | 
			
		||||
        for (int j = 0; j < v; j++) {
 | 
			
		||||
            if (dp[i][j] > NEG_INF / 2) {
 | 
			
		||||
                mx = max(mx, dp[i][j]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mx == -1 ? cout << mx << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										61
									
								
								Algorithm/DP-DynamicProgramming/P3916 图的遍历.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								Algorithm/DP-DynamicProgramming/P3916 图的遍历.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main(){
 | 
			
		||||
	//dpֻ<70><D6BB>O(n3)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bfs<66><73><EFBFBD><EFBFBD>dfs 
 | 
			
		||||
    int v, e;
 | 
			
		||||
    cin >> v >> e;
 | 
			
		||||
    //vector<vector<int>> adj(v, vector<int>());
 | 
			
		||||
    vector<vector<bool>> dp(v, vector<bool>(v, false));
 | 
			
		||||
    for(int i = 0; i < e; i++){
 | 
			
		||||
        int a, b;
 | 
			
		||||
        cin >> a >> b;
 | 
			
		||||
        //adj[a - 1].push_back(b - 1);
 | 
			
		||||
        //adj[b - 1].push_back(a - 1);
 | 
			
		||||
        dp[a - 1][b - 1] = true;
 | 
			
		||||
    }
 | 
			
		||||
	//<2F><><EFBFBD><EFBFBD>dp[i][j] : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>k<EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> 
 | 
			
		||||
    for (int i = 0; i < v; i++) dp[i][i] = true; // <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>ͨ
 | 
			
		||||
	for(int k = 0; k < v; k++){
 | 
			
		||||
		for(int i = 0; i < v; i++){
 | 
			
		||||
			for(int j = 0; j < v; j++){
 | 
			
		||||
				if(dp[i][j]) continue;
 | 
			
		||||
				dp[i][j] = dp[i][j] || (dp[i][k] & dp[k][j]);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//bfs
 | 
			
		||||
	for(int i = 0; i < v; i++) {
 | 
			
		||||
    vector<bool> visited(v, false);
 | 
			
		||||
    queue<int> q;
 | 
			
		||||
    q.push(i);
 | 
			
		||||
    visited[i] = true;
 | 
			
		||||
    int mx = i;
 | 
			
		||||
    while (!q.empty()) {
 | 
			
		||||
        int curr = q.front();
 | 
			
		||||
        q.pop();
 | 
			
		||||
        for (int next : adj[curr]) {
 | 
			
		||||
            if (!visited[next]) {
 | 
			
		||||
                visited[next] = true;
 | 
			
		||||
                q.push(next);
 | 
			
		||||
                mx = max(mx, next);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    cout << mx + 1 << " ";
 | 
			
		||||
} 
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	for(int i = 0; i < v; i++){
 | 
			
		||||
		int mx = -1;
 | 
			
		||||
		for(int j = 0; j < v; j++){
 | 
			
		||||
			if(dp[i][j] && mx < j) mx = j;
 | 
			
		||||
		}
 | 
			
		||||
		cout << mx + 1 << " ";
 | 
			
		||||
	}
 | 
			
		||||
	cout << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								Algorithm/Enumerate/P2241 统计方形(数据加强版).cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Algorithm/Enumerate/P2241 统计方形(数据加强版).cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
							
								
								
									
										48
									
								
								Algorithm/Graph/BFS/P1443 马的遍历.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Algorithm/Graph/BFS/P1443 马的遍历.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include <tuple>
 | 
			
		||||
#include <climits>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
const int INF = INT_MAX >> 1;
 | 
			
		||||
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
 | 
			
		||||
int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
 | 
			
		||||
 | 
			
		||||
bool check(int bx, int by, int x, int y) {
 | 
			
		||||
    return (x >= 0 && x < bx && y >= 0 && y < by);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    int n, m, x, y;
 | 
			
		||||
    cin >> n >> m >> x >> y;
 | 
			
		||||
    vector<vector<int>> mp(n, vector<int>(m, INF));
 | 
			
		||||
 | 
			
		||||
    x--; y--; // ת<><D7AA><EFBFBD><EFBFBD> 0-based
 | 
			
		||||
    queue<tuple<int, int, int>> q;
 | 
			
		||||
    q.push({x, y, 0});
 | 
			
		||||
    mp[x][y] = 0;
 | 
			
		||||
 | 
			
		||||
    while (!q.empty()) {
 | 
			
		||||
        auto [qx, qy, path] = q.front();
 | 
			
		||||
        q.pop();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < 8; i++) {
 | 
			
		||||
            int nx = qx + dx[i];
 | 
			
		||||
            int ny = qy + dy[i];
 | 
			
		||||
            if (check(n, m, nx, ny) && mp[nx][ny] == INF) {
 | 
			
		||||
                mp[nx][ny] = path + 1;
 | 
			
		||||
                q.push({nx, ny, path + 1});
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (auto &row : mp) {
 | 
			
		||||
        for (auto v : row) {
 | 
			
		||||
            cout << (v == INF ? -1 : v) << " ";
 | 
			
		||||
        }
 | 
			
		||||
        cout << "\n";
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										48
									
								
								Algorithm/Graph/Bellman-Ford有负边的最短路径.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Algorithm/Graph/Bellman-Ford有负边的最短路径.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <tuple>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <climits>
 | 
			
		||||
using namespace std;
 | 
			
		||||
const int INF = INT_MAX >> 1;
 | 
			
		||||
int main(){
 | 
			
		||||
	int n, edge_num, start;
 | 
			
		||||
	cin >> n >> edge_num >> start;
 | 
			
		||||
	
 | 
			
		||||
	//<2F><><EFBFBD><EFBFBD>Ҫadj, <20><>Ҫdp <20><> edges 
 | 
			
		||||
	vector<tuple<int, int , int>> edges(edge_num);// p1, p2, w
 | 
			
		||||
	vector<int> dp(n, INF);
 | 
			
		||||
	dp[start] = 0;
 | 
			
		||||
	
 | 
			
		||||
	//<2F><><EFBFBD><EFBFBD>
 | 
			
		||||
	for(int i = 0; i < edge_num; i++){
 | 
			
		||||
		int a, b, w;
 | 
			
		||||
		cin >> a >> b >> w;
 | 
			
		||||
		edges[i] = {a, b, w};
 | 
			
		||||
	} 
 | 
			
		||||
	
 | 
			
		||||
	//<2F>Ƚ<EFBFBD><C8BD><EFBFBD>n - 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	for(int i = 0; i < n - 1; i++){
 | 
			
		||||
		for(auto [p1, p2, w] : edges){
 | 
			
		||||
			if(dp[p2] > dp[p1] + w){
 | 
			
		||||
				dp[p2] = dp[p1] + w;
 | 
			
		||||
			}
 | 
			
		||||
		} 
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//<2F>Ƿ<EFBFBD><C7B7>и<EFBFBD><D0B8><EFBFBD> 
 | 
			
		||||
	bool negcc = false;
 | 
			
		||||
	for(auto [p1, p2, w] : edges){
 | 
			
		||||
		if(dp[p2] > dp[p1] + w){
 | 
			
		||||
			negcc = true;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if(negcc) cout << "Negative Circle Detected" << endl;
 | 
			
		||||
	else{
 | 
			
		||||
		for(auto x : dp){
 | 
			
		||||
			cout << x << " ";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								Algorithm/Graph/DFS/P1036 [NOIP 2002 普及组] 选数.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Algorithm/Graph/DFS/P1036 [NOIP 2002 普及组] 选数.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
int js = 0;
 | 
			
		||||
vector<int> arr;
 | 
			
		||||
 | 
			
		||||
bool checkprime(int x) {
 | 
			
		||||
    if (x < 2) return false;
 | 
			
		||||
    for (int i = 2; i * i <= x; i++) {
 | 
			
		||||
        if (x % i == 0) return false;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dfs(int idx, int k, int sum) {
 | 
			
		||||
    if (k == 0) { // <20>Ѿ<EFBFBD>ѡ<EFBFBD><D1A1>k<EFBFBD><6B>
 | 
			
		||||
        if (checkprime(sum)) js++;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (idx >= arr.size()) return;
 | 
			
		||||
 | 
			
		||||
    // ѡ<><D1A1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
 | 
			
		||||
    dfs(idx + 1, k - 1, sum + arr[idx]);
 | 
			
		||||
    // <20><>ѡ<EFBFBD><D1A1>ǰ<EFBFBD><C7B0>
 | 
			
		||||
    dfs(idx + 1, k, sum);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    int n, k;
 | 
			
		||||
    cin >> n >> k;
 | 
			
		||||
    arr.resize(n);
 | 
			
		||||
    for (int i = 0; i < n; i++) cin >> arr[i];
 | 
			
		||||
 | 
			
		||||
    dfs(0, k, 0);
 | 
			
		||||
    cout << js << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										46
									
								
								Algorithm/Graph/Dijkstra最短路径.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Algorithm/Graph/Dijkstra最短路径.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
using namespace std;
 | 
			
		||||
const int INF = INT_MAX >> 1;
 | 
			
		||||
int main(){
 | 
			
		||||
	int n, edge_num, start;
 | 
			
		||||
	cin >> n >> edge_num >> start;
 | 
			
		||||
	vector<vector<pair<int, int>>> adj(n);
 | 
			
		||||
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> dp;
 | 
			
		||||
	vector<bool> used(n, false);
 | 
			
		||||
	vector<int> dist(n, INF); 
 | 
			
		||||
	
 | 
			
		||||
	for(int i = 0; i < edge_num; i++){
 | 
			
		||||
		int a, b, w;
 | 
			
		||||
		cin >> a >> b >> w;
 | 
			
		||||
		adj[a].push_back({b, w});
 | 
			
		||||
		adj[b].push_back({a, w}); 
 | 
			
		||||
	}
 | 
			
		||||
	dp.push({0, start});
 | 
			
		||||
	dist[start] = 0;
 | 
			
		||||
	
 | 
			
		||||
	while(!dp.empty()){
 | 
			
		||||
		//ȷ<><C8B7>ѡ 
 | 
			
		||||
		auto[dists, v] = dp.top();
 | 
			
		||||
		dp.pop();
 | 
			
		||||
		if(used[v]) continue;
 | 
			
		||||
		used[v] = true;
 | 
			
		||||
		
 | 
			
		||||
		//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD> 
 | 
			
		||||
		for(auto [u, d] : adj[v]){
 | 
			
		||||
			if(!used[u] && dist[v] + d < dist[u]){//<2F><>С 
 | 
			
		||||
				dist[u] = dist[v] + d;
 | 
			
		||||
				dp.push({dist[u], u});
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} 
 | 
			
		||||
	
 | 
			
		||||
	for(auto x : dist){
 | 
			
		||||
		if(x != INF) cout << x << " ";
 | 
			
		||||
		else cout << "INF" << " "; 
 | 
			
		||||
	}
 | 
			
		||||
	cout << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								Algorithm/Graph/Floyd两点之间最短路径.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Algorithm/Graph/Floyd两点之间最短路径.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <tuple>
 | 
			
		||||
using namespace std;
 | 
			
		||||
const int INF = 100001;//<2F><><EFBFBD><EFBFBD> 
 | 
			
		||||
int main(){
 | 
			
		||||
	//dp<64>ķֽ<D6BD><D7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ӽṹ<D3BD><E1B9B9><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>)
 | 
			
		||||
	int n, edge_num, start, end;
 | 
			
		||||
	cin >> n >> edge_num >> start >> end;
 | 
			
		||||
	//<2F><><EFBFBD>ش洢 
 | 
			
		||||
	//vector<tuple<int, int, int>> edge(edge_num);
 | 
			
		||||
	vector<vector<int>> dp(n, vector<int>(n, INF));
 | 
			
		||||
	
 | 
			
		||||
	for(int i = 0; i < edge_num; i++){
 | 
			
		||||
		int a, b, w;
 | 
			
		||||
		cin >> a >> b >> w;
 | 
			
		||||
		//edge[i] = {a, b, w};
 | 
			
		||||
		dp[a][b] = w;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//dp, һ<><D2BB><EFBFBD><EFBFBD>kд<6B><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 
 | 
			
		||||
	for(int k = 0; k < n; k++){
 | 
			
		||||
		for(int i = 0; i < n; i++){
 | 
			
		||||
			for(int j = 0; j < n; j++){
 | 
			
		||||
					dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} 
 | 
			
		||||
	for(int k = 0; k < n; k++){
 | 
			
		||||
		if(dp[k][k] < 0){
 | 
			
		||||
			cout << "Negative Cycle Detected!" << endl;
 | 
			
		||||
			return 0;
 | 
			
		||||
		}	
 | 
			
		||||
	} 
 | 
			
		||||
	cout << dp[start][end] << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								Algorithm/Graph/Kruskal最小生成树.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								Algorithm/Graph/Kruskal最小生成树.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
using namespace std;
 | 
			
		||||
vector<int> parent;
 | 
			
		||||
struct edge{
 | 
			
		||||
	int from;
 | 
			
		||||
	int to;
 | 
			
		||||
	int weight;
 | 
			
		||||
	
 | 
			
		||||
	edge() : from(-1), to(-1), weight(-1){}
 | 
			
		||||
	edge(int from_, int to_, int weight_): from(from_), to(to_), weight(weight_){}
 | 
			
		||||
};
 | 
			
		||||
struct cmp{
 | 
			
		||||
	bool operator()(const edge& a, const edge& b){
 | 
			
		||||
		return a.weight < b.weight;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int find(int x){
 | 
			
		||||
	if(parent[x] != x) parent[x] = find(parent[x]);
 | 
			
		||||
	return parent[x];
 | 
			
		||||
}
 | 
			
		||||
void merge(int x, int y){
 | 
			
		||||
	int rootX = find(x);
 | 
			
		||||
	int rootY = find(y);
 | 
			
		||||
	if(rootX != rootY) parent[rootY] = rootX;
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(){
 | 
			
		||||
	//<2F><>adj<64>ķ<EFBFBD>ʽ
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	//vector<vector<pair<int,int>>> adj(n, vector<pair<int,int>>());//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB> 
 | 
			
		||||
	parent.resize(n);
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		parent[i] = i;
 | 
			
		||||
	} 
 | 
			
		||||
	
 | 
			
		||||
	vector<pair<int, int>> result(n, {-1, -1});
 | 
			
		||||
	int path = 0;
 | 
			
		||||
	int edge_num;
 | 
			
		||||
	cin >> edge_num;
 | 
			
		||||
	vector<edge> arr(edge_num);
 | 
			
		||||
	for(int i = 0; i < edge_num; i++){
 | 
			
		||||
		int a, b, w;
 | 
			
		||||
		cin >> a >> b >> w;	
 | 
			
		||||
		arr[i] = edge(a, b, w);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 
 | 
			
		||||
	} 
 | 
			
		||||
	if(edge_num < n - 1) {
 | 
			
		||||
		cout << "Not Valid Full Graph" << endl;
 | 
			
		||||
		return ; 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sort(arr.begin(), arr.end(), cmp());
 | 
			
		||||
	for(auto x : arr){
 | 
			
		||||
		if(find(x.from) == find(x.to)){
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		merge(x.from, x.to);
 | 
			
		||||
		result.push_back({x.from, x.to});
 | 
			
		||||
		path += x.weight;
 | 
			
		||||
	}
 | 
			
		||||
	cout << path << endl;
 | 
			
		||||
	for(auto x : result){
 | 
			
		||||
		if(x.first != -1 && x.second != -1) cout << "{" << x.first << ", " << x.second << "}" << " ";
 | 
			
		||||
	}
 | 
			
		||||
	cout << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								Algorithm/Graph/P4779 【模板】单源最短路径(标准版).cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Algorithm/Graph/P4779 【模板】单源最短路径(标准版).cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main(){
 | 
			
		||||
	int v, e, start;
 | 
			
		||||
	cin >> v >> e >> start;
 | 
			
		||||
	vector<int> map(v, 0); 
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								Algorithm/Graph/P5318 【深基18.例3】查找文献.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Algorithm/Graph/P5318 【深基18.例3】查找文献.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <deque>
 | 
			
		||||
using namespace std;
 | 
			
		||||
vector<vector<int>> adj;
 | 
			
		||||
vector<bool> used;
 | 
			
		||||
//
 | 
			
		||||
void dfs(int idx){
 | 
			
		||||
    if(used[idx]) return;
 | 
			
		||||
    used[idx] = true;  // <20><><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD>
 | 
			
		||||
    cout << idx + 1 << " ";
 | 
			
		||||
    
 | 
			
		||||
    for(auto x : adj[idx]){
 | 
			
		||||
        dfs(x);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(){
 | 
			
		||||
	int v, e;
 | 
			
		||||
	cin >> v >> e;
 | 
			
		||||
	adj.resize(v);
 | 
			
		||||
	used.resize(v, false); 
 | 
			
		||||
	for(int i = 0; i < e; i++){
 | 
			
		||||
		int a, b;
 | 
			
		||||
		cin >> a >> b;
 | 
			
		||||
		adj[a - 1].push_back(b - 1);
 | 
			
		||||
	}
 | 
			
		||||
	for(int i = 0; i < v; i++){
 | 
			
		||||
		sort(adj[i].begin(), adj[i].end());
 | 
			
		||||
	} 
 | 
			
		||||
	dfs(0);
 | 
			
		||||
	fill(used.begin(), used.end(), false);
 | 
			
		||||
	
 | 
			
		||||
	cout << endl;
 | 
			
		||||
	//bfs
 | 
			
		||||
	deque<int> q;
 | 
			
		||||
	q.push_back(0);
 | 
			
		||||
	used[0] = true;
 | 
			
		||||
	while(!q.empty()){
 | 
			
		||||
    	int top = q.front(); q.pop_front(); // ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> front()
 | 
			
		||||
    	cout << top + 1 << " "; 
 | 
			
		||||
    	for(auto x : adj[top]){
 | 
			
		||||
        	if(!used[x]){
 | 
			
		||||
            	used[x] = true;  // <20><><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>
 | 
			
		||||
            	q.push_back(x);
 | 
			
		||||
        	}
 | 
			
		||||
    	}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
} 
 | 
			
		||||
							
								
								
									
										26
									
								
								Algorithm/Greedy/P1031 [NOIP 2002 提高组] 均分纸牌.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Algorithm/Greedy/P1031 [NOIP 2002 提高组] 均分纸牌.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <algorithm> 
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main(){
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<int> a(n);
 | 
			
		||||
	int sum = 0;
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		cin >> a[i];
 | 
			
		||||
		sum += a[i];
 | 
			
		||||
	}
 | 
			
		||||
	int avg = sum / n;
 | 
			
		||||
    int js = 0;
 | 
			
		||||
	for(int i = 0; i < n - 1; i++){
 | 
			
		||||
        if(a[i] != avg){
 | 
			
		||||
            int tmp = a[i] - avg;
 | 
			
		||||
            a[i] = avg;
 | 
			
		||||
            a[i + 1] += tmp;
 | 
			
		||||
            js++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
	cout << js << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								Algorithm/Greedy/P1090 [NOIP 2004 提高组] 合并果子.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Algorithm/Greedy/P1090 [NOIP 2004 提高组] 合并果子.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <queue>
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main(){
 | 
			
		||||
	ios::sync_with_stdio(false);
 | 
			
		||||
	cin.tie(nullptr);
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	priority_queue<int, vector<int>, greater<int>> q;
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		int a;
 | 
			
		||||
		cin >> a;
 | 
			
		||||
		q.emplace(a);
 | 
			
		||||
	}
 | 
			
		||||
	int value = 0;
 | 
			
		||||
	int min1 = 0, min2 = 0;
 | 
			
		||||
	while(q.size() > 1){
 | 
			
		||||
		min1 = q.top(); q.pop();
 | 
			
		||||
		min2 = q.top(); q.pop();
 | 
			
		||||
		int tmp = min1 + min2;
 | 
			
		||||
		value += tmp;
 | 
			
		||||
		q.emplace(tmp); 
 | 
			
		||||
	}
 | 
			
		||||
	cout << value<< endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								Algorithm/Greedy/P1106 删数问题.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Algorithm/Greedy/P1106 删数问题.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <deque>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    string s;
 | 
			
		||||
    int k;
 | 
			
		||||
    cin >> s >> k;
 | 
			
		||||
    deque<char> q;
 | 
			
		||||
 | 
			
		||||
    for(char curr : s) {
 | 
			
		||||
        while(!q.empty() && k > 0 && q.back() > curr){
 | 
			
		||||
            q.pop_back();
 | 
			
		||||
            k--;
 | 
			
		||||
        }
 | 
			
		||||
        q.push_back(curr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3> k <20><><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>ɾ<EFBFBD><C9BE>ջβ
 | 
			
		||||
    while(k > 0 && !q.empty()) {
 | 
			
		||||
        q.pop_back();
 | 
			
		||||
        k--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // ƴ<>ӽ<EFBFBD><D3BD><EFBFBD>
 | 
			
		||||
    string res;
 | 
			
		||||
    for(char c : q) res += c;
 | 
			
		||||
 | 
			
		||||
    // ȥ<><C8A5>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | 
			
		||||
    int i = 0;
 | 
			
		||||
    while(i < res.size() && res[i] == '0') i++;
 | 
			
		||||
    res = res.substr(i);
 | 
			
		||||
    if(res.empty()) res = "0";
 | 
			
		||||
 | 
			
		||||
    cout << res << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										0
									
								
								Algorithm/Greedy/一定要找对贪心策略
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								Algorithm/Greedy/一定要找对贪心策略
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										25
									
								
								Algorithm/PrefixAndSuffix/P8218 【深进1.例1】求区间和.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Algorithm/PrefixAndSuffix/P8218 【深进1.例1】求区间和.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
int main() {
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<int> sum(n + 1);
 | 
			
		||||
	sum[0] = 0;
 | 
			
		||||
	for (int i = 1; i < n + 1; i++) {
 | 
			
		||||
		int tmp;
 | 
			
		||||
		cin >> tmp;
 | 
			
		||||
		sum[i] = sum[i - 1] + tmp;
 | 
			
		||||
	}
 | 
			
		||||
	int cnum;
 | 
			
		||||
	cin >> cnum;
 | 
			
		||||
	vector<pair<int, int>> check(cnum);
 | 
			
		||||
	for (int i = 0; i < cnum; i++) {
 | 
			
		||||
		cin >> check[i].first >> check[i].second;
 | 
			
		||||
	}
 | 
			
		||||
	for (int i = 0; i < cnum; i++) {
 | 
			
		||||
		cout << sum[check[i].second] - sum[check[i].first - 1] << endl;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								Algorithm/Sort/P1496 火烧赤壁.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Algorithm/Sort/P1496 火烧赤壁.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
using namespace std;
 | 
			
		||||
struct cmp{
 | 
			
		||||
	bool operator()(const pair<int, int>& a, const pair<int, int>& b){
 | 
			
		||||
		return a.first < b.first;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
int main(){
 | 
			
		||||
	int n;
 | 
			
		||||
	cin >> n;
 | 
			
		||||
	vector<pair<int, int>> dp(n);
 | 
			
		||||
	//<2F><><EFBFBD><EFBFBD> 
 | 
			
		||||
	for(int i = 0; i < n; i++){
 | 
			
		||||
		cin >> dp[i].first >> dp[i].second;
 | 
			
		||||
	} 
 | 
			
		||||
	//<2F><><EFBFBD><EFBFBD>dp.first<73><74><EFBFBD><EFBFBD> 
 | 
			
		||||
	sort(dp.begin(), dp.end(), cmp());
 | 
			
		||||
	vector<pair<int, int>> merge;
 | 
			
		||||
	for(auto [l, r] : dp){
 | 
			
		||||
		if (merged.empty() || merged.back().second < l)
 | 
			
		||||
        	merged.push_back({l,r});
 | 
			
		||||
    	else
 | 
			
		||||
        	merged.back().second = max(merged.back().second, r);
 | 
			
		||||
	}
 | 
			
		||||
	int sum = 0;
 | 
			
		||||
	for(auto [l, r] : merge){
 | 
			
		||||
		sum += r - l;
 | 
			
		||||
	}
 | 
			
		||||
	cout << sum << endl;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user