1. 首页
  2. 公告
  1. 登录
  2. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文

2025tyoi0005

UID: 13911, 注册于 2025-7-3 15:36:06, 最后登录于 2026-4-1 17:05:17, 最后活动于 2026-4-1 17:20:09.

解决了 256 道题目,RP: 335.93 (No. 1)

♂
  • 个人简介

    一些模板

    数位DP数位DP数位DP

    #include <bits/stdc++.h>
    using namespace std;
    long long l , r , x;
    long long dp[20][2];
    int n;
    long long dgt[20100];
    long long dfs(int i , int o){
    	if(i == 0) return 1;
    	if(~dp[i][o]) return dp[i][o];
    	long long ret = 0;
    	int k = (o? dgt[i] : 9);
    	for(int d = 0 ; d <= k ; d++){
    		if(d == x) continue;
    		ret += dfs(i - 1 , o && d == k);
    	}
    	return (dp[i][o] = ret);
    }
    long long solve(long long a){
    	n = 0;
    	while(a){
    		dgt[++n] = a % 10;
    		a /= 10;
    	}
    	memset(dp , -1 , sizeof(dp));
    	return dfs(n , 1);
    }
    int main(){
    	cin >> l >> r >> x;
    	cout << solve(r) - solve(l - 1);
    	return 0;
    }
    
    

    线段树线段树线段树

    #include <iostream>
    #define int long long
    
    using namespace std;
    long long a[10010000] , b[10010000] , d[19919999] , n , q;
    void build(int s, int t, int p) {
    	if (s == t) {
    		d[p] = a[s];
    		return;
    	}
    	int m = s + ((t - s) >> 1);
    	build(s, m, p * 2), build(m + 1, t, p * 2 + 1);
    	d[p] = d[p * 2] + d[(p * 2) + 1];
    }
    void update(int l, int r, int c, int s, int t, int p) {
    	if (l <= s && t <= r) {
    		d[p] += (t - s + 1) * c, b[p] += c;
    		return;
    	}
    	int m = s + ((t - s) >> 1);
    	if (b[p] && s != t) {
    		d[p * 2] += b[p] * (m - s + 1), d[p * 2 + 1] += b[p] * (t - m);
    		b[p * 2] += b[p], b[p * 2 + 1] += b[p];  
    		b[p] = 0;                              
    	}
    	if (l <= m) update(l, r, c, s, m, p * 2);
    	if (r > m) update(l, r, c, m + 1, t, p * 2 + 1);
    	d[p] = d[p * 2] + d[p * 2 + 1];
    }
    int getsum(int l, int r, int s, int t, int p) {
    	if (l <= s && t <= r) return d[p];
    	int m = s + ((t - s) >> 1);
    	if (b[p]) {
    		d[p * 2] += b[p] * (m - s + 1), d[p * 2 + 1] += b[p] * (t - m);
    		b[p * 2] += b[p], b[p * 2 + 1] += b[p]; 
    		b[p] = 0;                             
    	}
    	int sum = 0;
    	if (l <= m) sum = getsum(l, r, s, m, p * 2);
    	if (r > m) sum += getsum(l, r, m + 1, t, p * 2 + 1);
    	return sum;
    }
    signed main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin >> n >> q;
    	for(int i = 1 ; i <= n; i++){
    		cin >> a[i];
    	}
    	build(1 , n , 1);
    	while(q--){
    		int f;
    		cin >> f;
    		if(f == 1){
    			int l , r , x;
    			cin >> l >> r >> x;
    			update(l , r , x , 1 , n , 1);
    		}
    		else{
    			int l , r;
    			cin >> l >> r;
    			cout << getsum(l , r , 1 , n , 1)<< endl;
    		}
    	}
    	return 0;
    }
    
    

    平衡树平衡树平衡树

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100000 + 5;
    int psz;
    long long key[maxn], pri[maxn], sz[maxn], lc[maxn], rc[maxn];
    
    int node(int x) {
    	int u = ++psz;
    	key[u] = x;
    	pri[u] = rand();
    	sz[u] = 1;
    	lc[u] = rc[u] = 0;
    	return u;
    }
    
    void maintain(int u) {
    	sz[u] = sz[lc[u]] + sz[rc[u]] + 1;
    }
    
    pair<int, int> split(int u, int x) {
    	if (u == 0) return make_pair(0, 0);
    	pair<int, int> p;
    	if (key[u] >= x) {
    		p = split(lc[u], x);
    		lc[u] = p.second;
    		p.second = u;
    	} else {
    		p = split(rc[u], x);
    		rc[u] = p.first;
    		p.first = u;
    	}
    	maintain(u);
    	return p;
    }
    
    int merge(int u, int v) {
    	if (u == 0 || v == 0) return u + v;
    	if (pri[u] > pri[v]) {
    		rc[u] = merge(rc[u], v);
    		maintain(u);
    		return u;
    	} else {
    		lc[v] = merge(u, lc[v]);
    		maintain(v);
    		return v;
    	}
    }
    
    void insert(int &root, int x) {
    	pair<int, int> rt = split(root, x);
    	root = merge(merge(rt.first, node(x)), rt.second);
    }
    
    void erase(int &root, int x) {
    	pair<int, int> rt1 = split(root, x);
    	pair<int, int> rt2 = split(rt1.second, x + 1);
    	int u = merge(lc[rt2.first], rc[rt2.first]);
    	root = merge(merge(rt1.first, u), rt2.second);
    }
    
    int order_of_key(int root, int k) {
    	int ret = 0;
    	int u = root;
    	while (u) {
    		if (key[u] >= k) {
    			u = lc[u];
    		} else {
    			ret += sz[lc[u]] + 1;
    			u = rc[u];
    		}
    	}
    	return ret;
    }
    
    int key_by_order(int root, int k) {
    	int u = root;
    	while (u) {
    		if (sz[lc[u]] == k) {
    			break;
    		}
    		if (k < sz[lc[u]]) {
    			u = lc[u];
    		} else {
    			k -= sz[lc[u]] + 1;
    			u = rc[u];
    		}
    	}
    	return key[u];
    }
    
    int get_prev(int root, int x) {
    	return key_by_order(root, order_of_key(root, x) - 1);
    }
    
    int get_next(int root, int x) {
    	return key_by_order(root, order_of_key(root, x + 1));
    }
    
    signed main() {
    	int n;
    	scanf("%d", &n);
    	int root = 0;
    	while (n--) {
    		int opt, x;
    		scanf("%d%d", &opt, &x);
    		if (opt == 1) {
    			insert(root, x);
    		} else if (opt == 2) {
    			erase(root, x);
    		} else if (opt == 3) {
    			int r = order_of_key(root, x);
    			printf("%d\n", r + 1);
    		} else if (opt == 4) {
    			int val = key_by_order(root, x - 1);
    			printf("%d\n", val);
    		} else if (opt == 5) {
    			int prev = get_prev(root, x);
    			printf("%d\n", prev);
    		} else if (opt == 6) {
    			int next = get_next(root, x);
    			printf("%d\n", next);
    		}
    	}
    	return 0;
    }
    
    

    ST表ST表ST表

    #include <algorithm>
    #include <iostream>
    using namespace std;
    const int MAXN = 2000001;
    const int logN = 21;
    int f[MAXN][logN + 1], Logn[MAXN + 1];
    
    void pre() { 
    	Logn[1] = 0;
    	Logn[2] = 1;
    	for (int i = 3; i < MAXN; i++) {
    		Logn[i] = Logn[i / 2] + 1;
    	}
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	int n, m;
    	cin >> n >> m;
    	for (int i = 1; i <= n; i++) cin >> f[i][0];
    	pre();
    	for (int j = 1; j <= logN; j++){
    		for (int i = 1; i + (1 << j) - 1 <= n; i++){
    			f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    		}
    	}
    	for	(int i = 1; i <= m; i++) {
    		int x, y;
    		cin >> x >> y;
    		int s = Logn[y - x + 1];
    		cout << max(f[x][s], f[y - (1 << s) + 1][s]) << '\n';
    	}
    	return 0;
    }
    
    

    dijkstradijkstradijkstra

    #include <bits/stdc++.h>
    using namespace std;
    
    using ll = long long;
    const int maxn = 100010;
    struct Edge {
        int v, w;
    };
    vector<Edge> G[maxn];
    struct Node {
        int u;
        ll d;
        bool operator<(const Node &n) const { return d > n.d; }
    };
    ll d[maxn];
    bool vis[maxn];
    
    void Dij(int s) {
        memset(d, 0x3f, sizeof(d));
        priority_queue<Node> pq;
        d[s] = 0, pq.push({s, d[s]});
        while (!pq.empty()) {
            int u = pq.top().u;
            pq.pop();
            if (vis[u]) continue;
            vis[u] = 1;
            for (Edge e : G[u]) {
                int v = e.v, w = e.w;
                if (d[v] > d[u] + w) {
                    d[v] = d[u] + w;
                    pq.push({v, d[v]});
                }
            }
        }
    }
    
    int main() {
        int n, m;
        cin >> n >> m;
        for (int i = 0; i < m; ++i) {
            int u, v, w;
            cin >> u >> v >> w;
            G[u].push_back({v, w});
        }
        Dij(1);
        for (int i = 1; i <= n; ++i) cout << d[i] << " ";
        return 0;
    }
    
    

    SPFASPFASPFA

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    const ll inf = 0x3f3f3f3f3f3f3f3f;
    const int maxn = 5010, maxm = 5010;
    struct edge {
        int v, w;
    };
    vector<edge> G[maxn];
    ll d[maxn];
    int n;
    bool inq[maxn];
    int cnt[maxn];
    bool spfa(int s) {
        memset(d, 0x3f, sizeof(d));
        queue<int> q;
        d[s] = 0, cnt[s] = 0, q.push(s), inq[s] = 1;
        while (!q.empty()) {
            int u = q.front();
            q.pop(), inq[u] = 0;
            for (int i = 0; i < G[u].size(); i++) {
                int v = G[u][i].v, w = G[u][i].w;
                if (d[v] > d[u] + w) {
                    d[v] = d[u] + w;
                    cnt[v] = cnt[u] + 1;
                    if (cnt[v] >= n) return 1;  
                    if (!inq[v]) {
                        q.push(v), inq[v] = 1;
                    }
                }
            }
        }
        return 0;
    }
    int main() {
        int m, u, v, w, s = 1;
        cin >> n >> m;
        for (int i = 0; i < m; ++i) {
            cin >> u >> v >> w;
            G[u].push_back({v, w});
        }
        spfa(1);
        for(int i = 1 ; i < n + 1 ; i++){
        	if(d[i] != inf)
    		cout << d[i] << " ";
    		else{
    			cout << "inf" << " ";
    		}
    	}
        return 0;
    }
    
    

    强连通分量强连通分量强连通分量

    #include <iostream>
    #include <vector>
    using namespace std;
    const int maxn = 2e5 + 5;
    int n , m;
    int clk , dfn[maxn] , low[maxn];
    int stc[maxn] , top;
    int id[maxn] , scc;
    vector<int> e[maxn];
    void dfs(int u){
    	stc[top++] = u;
    	dfn[u] = low[u] = ++clk;
    	for(int v : e[u]){
    		if(!dfn[v]){
    			dfs(v);
    			low[u] = min(low[u] , low[v]);
    		}
    		else if(!id[v]){
    			low[u] = min(low[u] , dfn[v]);
    		}
    	}
    	if(low[u] == dfn[u]){
    		++scc;
    		do{
    			id[stc[--top]] = scc;
    		}while(stc[top] != u);
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> n >> m;
    	while(m--){
    		int u , v;
    		cin >> u >> v;
    		e[u].push_back(v);
    	}
    	for(int u = 1 ; u <= n ; u++){
    		if(!dfn[u]){
    			dfs(u);
    		}
    	}
    	cout << scc;
    	return 0;
    }
    
    

    割点割点割点

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 5;
    int n , m;
    int clk , dfn[maxn] , low[maxn];
    int cvnum;
    vector<int> e[maxn];
    void dfs(int u , int fa){
    	bool iscut = false;
    	int son = 0;
    	dfn[u] = low[u] = ++clk;
    	for(int v: e[u]){
    		if(!dfn[v]){
    			dfs(v , u);
    			low[u] = min(low[u] , low[v]);
    			son++;
    			if(fa != -1 && low[v] >= dfn[u]){
    				iscut = true;
    			}
    		}else{
    			low[u] = min(low[u] , dfn[v]);
    		}
    	}
    	iscut |= (fa == -1 && son > 1);
    	if(iscut){
    		cvnum++;
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> n >> m;
    	while(m--){
    		int u , v;
    		cin >> u >> v;
    		e[u].push_back(v);
    		e[v].push_back(u);
    	}
    	for(int u = 1 ; u <= n ; u++){
    		if(!dfn[u]){
    			dfs(u , -1);
    		}
    	}
    	cout << cvnum;
    	return 0;
    }
    
    

    桥桥桥

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 5;
    int n , m;
    int clk , dfn[maxn] , low[maxn];
    int cvnum;
    vector<int> e[maxn];
    void dfs(int u , int fa){
    	dfn[u] = low[u] = ++clk;
    	for(int v: e[u]){
    		if(fa == v){
    			continue;
    		}
    		if(!dfn[v]){
    			dfs(v , u);
    			low[u] = min(low[u] , low[v]);
    			if(low[v] > dfn[u]){
    				cvnum++;
    			}
    		}else{
    			low[u] = min(low[u] , dfn[v]);
    		}
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> n >> m;
    	while(m--){
    		int u , v;
    		cin >> u >> v;
    		e[u].push_back(v);
    		e[v].push_back(u);
    	}
    	for(int u = 1 ; u <= n ; u++){
    		if(!dfn[u]){
    			dfs(u , -1);
    		}
    	}
    	cout << cvnum;
    	return 0;
    }
    
    

    kruskalkruskalkruskal

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010, maxm = 100010;
    struct Edge {
        int u, v, w;
        bool operator<(const Edge &n) const { return w < n.w; }
    }E[maxm];
    int fa[maxn], n, m;
    void init() {
        for (int i = 1; i <= n; i++) fa[i] = i;
    }
    int find(int x) {
        if (fa[x] == x) return x;
        return fa[x] = find(fa[x]);
    }
    void merge(int x, int y) {
        int rx = find(x), ry = find(y);
        fa[ry] = rx;
    }
    long long kru() {
    	sort(E, E + m); 
        long long res = 0;
    	int cnt = n; 
        for (int i = 0; i < m; ++i) {
            Edge e = E[i];
            if (find(e.u) != find(e.v)) {
    			merge(e.u, e.v);
            	--cnt, res += e.w;
    		}
        }
        if (cnt > 1) return -1; 
        return res;
    }
    int main() {
    	cin >> n >> m;
    	for (int i = 0; i < m; ++i) {
    		cin >> E[i].u >> E[i].v >> E[i].w;
    	}
    	init();
    	cout << kru() << endl;
    	return 0;
    }
    
    

    KMPKMPKMP

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6 + 10;
    int f[maxn];
    int kmp(string a , string b){
    	int n = a.size();
    	int m = b.size();
    	a = '$' + a;
    	b = '$' + b;
    	for(int k = 2 , j = 0 ; k <= m ; k++){
    		while(j > 0 && b[k] != b[j + 1]){
    			j = f[j];
    		}
    		if(b[k] == b[j + 1]){
    			j++;
    		}
    		f[k] = j;
    	}
    	int ans = 0;
    	for(int k = 1 , j = 0 ; k <= n ; k++){
    		while(j > 0 && a[k] != b[j + 1]){
    			j = f[j];
    		}
    		if(a[k] == b[j + 1]){
    			j++;
    			if(j == m){
    				ans++;
    				j = f[j];
    			}
    		}
    	}
    	return ans;
    }
    int main(){
    	string a , b;
    	cin >> a >> b;
    	cout << kmp(a , b);
    	return 0;
    }
    
    
  • 最近活动

    • 2026年小六春季班Class2-优先队列 作业
    • 2026年小六春季班Class2-哈希表 作业
    • TYOI2026年普及组模拟赛#03 OI
    • 2026年小六春季班Class1-链表与List 作业
    • TYOI2026年普及组模拟赛#01(副本) IOI
    • TYOI冬令营(2026)阶段测试3 IOI
    • 2025铁一集团新苗秋冬令营5——二分搜索2(最小值最大) 作业
    • 2025铁一集团新苗秋冬令营4——二分搜索1(最大值最小) 作业
    • TYOI冬令营(2026)阶段测试2 IOI
    • 2025铁一集团新苗秋冬令营3---《广度优先搜索2》 作业
    • 2025铁一集团新苗秋冬令营2---《广度优先搜索1》 作业
    • 2025铁一集团新苗秋冬令营1---《队列》 作业
    • 2026 年 C 班周赛计划 Extra #1 IOI
    • 2025OiClass入门组周赛计划#10 OI
    • 2025铁一集团新苗秋季班作业11---《深度优先搜索算法2》 作业
    • 2025OiClass入门组周赛计划#08 OI
    • 2025 年 C 班周赛计划 Extra #1 IOI
    • 2025OiClass入门组周赛计划#06 OI
    • 2025铁一集团新苗秋季班作业10----《深度优先搜索算法1》 作业
    • 2025铁一集团新苗秋季班作业9----《递归算法》 作业
    • 2025铁一集团新苗秋季班作业8----《栈结构》 作业
    • 2025铁一集团新苗秋季班作业7----《前缀和&差分前缀和》 作业
    • 2025铁一集团新苗秋季班作业7----贪心+递推 作业
    • 2025铁一集团新苗秋季班作业5----《枚举算法》 作业
    • 2025铁一集团新苗秋季班作业4----《模拟算法》 作业
    • 2025铁一集团新苗秋季班作业6----《排序和结构体排序》 作业
    • 2025铁一集团新苗周赛计划#02 IOI
    • 2025铁一集团新苗秋季班作业3------《位运算》 作业
    • 2025铁一集团新苗秋季班作业2----《进制转换》 作业
    • 铁外信息学C班训练集20250910 作业
    • 2025 CSP-J1初赛模拟测试10 OI
    • 2025 CSP-J1初赛模拟测试8 OI
    • 2025 CSP-J1初赛模拟测试4 OI
    • 2025 CSP-J1初赛模拟测试1 OI
    • 第六届oiclass信息学夏令营-模拟测试1(订题) 作业
    • 第六届oiclass信息学夏令营Class10-一维数组进阶 作业
    • 第六届oiclass信息学夏令营Class9-一维数组的定义和基础应用 作业
    • 第六届oiclass信息学夏令营Class8-循环嵌套 作业
    • 第六届oiclass信息学夏令营Class7-循环结构-while语句 作业
    • 2025铁一集团新苗for循环专题练习赛 IOI
    • 2025铁一集团新苗线下测试2 IOI
    • 2025铁一集团新苗线上模拟测试5 OI
    • 2025铁一集团新苗线上模拟测试4 OI
    • 2025铁一集团新苗线上模拟赛3 OI
    • 2025铁一集团新苗线下测试1 IOI
    • 2025铁一集团新苗day8作业-while2 作业
    • 2025铁一集团新苗线上(8月4日)-循环专题练习 作业
    • 2025铁一集团新苗复习-for循环专题练习1 作业
    • 2025铁一集团新苗day15作业-结构体和函数 作业
    • 2025铁一集团新苗day14作业-二维数组基础 作业
    • 2025铁一集团新苗秋季班作业1-二维数组和二维字符数组 作业
    • 2025铁一集团新苗day13作业-普通排序和桶排序 作业
    • 2025铁一集团新苗线上模拟赛2 OI
    • 2025铁一集团新苗day12作业-数组标记的应用 作业
    • 2025铁一集团新苗day11作业-字符、字符数组和字符串 作业
    • 2025铁一集团新苗day10作业-一维数组基础 作业
    • 2025铁一集团新苗day9作业-多重循环 作业
    • 2025铁一集团新苗day7作业-循环语句while1 作业
    • 2025铁一集团新苗线上模拟赛1 OI
    • 2025铁一集团新苗day6作业-for语句3(数据的在线处理) 作业
    • 2025铁一集团新苗day5作业-for语句2(枚举和筛选) 作业
    • 2025铁一集团新苗day4作业-循环for语句 作业
    • 2025铁一集团新苗day3作业-if条件语句 作业
    • 2025铁一集团新苗day2作业-表达式 作业
    • 2025铁一集团新苗day1作业-C++程序结构 作业
    • 2024小六秋季班第七课《前缀和&差分前缀和》 作业
    • 第五届oiClass信息学夏令营day11作业-while2 作业
  • Stat

  • Rating

907
已递交
256
已通过
0
题解被赞

状态

  • 评测队列
  • 服务状态

开发

  • 开源

支持

  • 帮助
  • 联系我们

关于

  • 关于
  • 隐私
  • 服务条款
  • 版权申诉
  1. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
  2. 兼容模式
  3. 主题
    1. 亮色
    2. 暗色
  1. 粤ICP备2024335011号
  2. Worker 0, 17ms
  3. Powered by Hydro v5.0.0-beta.18 Community
关闭

登录

使用您的 oiClass 通用账户

忘记密码或者用户名?