首页 > 其他分享 >Codeforces Round 1000 (Div. 2)

Codeforces Round 1000 (Div. 2)

时间:2025-01-22 23:10:44浏览次数:1  
标签:std int Codeforces ++ flag Div deg mx 1000


A. Minimal Coprime

题意:互素区间是指\(gcd(l, r) = 1\)的区间,极小互素区间是互素区间并且没有一个被他包含的区间也是互素区间。问你区间\([l, r]\)里有多少个极小互素区间。

根据数论的基础知识,\(x,x+1\)一定是互素的,所以统计所有长度为\(2\)的区间就行,不过要注意,\([1, 1]\)是唯一一个长度不为\(2\)的极小互素区间。

点击查看代码
void solve() {
    int l, r;
    std::cin >> l >> r;
    int ans = r - l;
    if (l == 1) {
    	ans = std::max(ans, 1);
    }

    std::cout << ans << "\n";
}

B. Subsequence Update

题意:给你一个数组,你可以翻转一个子序列,求一次操作后\([l, r]\)区间的最小总和。

赛时把子序列看成子数组了。。。
左边的最小的\(r-l+1\)个数一定能翻转到\([l, r]\)里。具体操作是,假设前\(r-l+1\)小的数有\(x\)个不在\([l, r]\)里面,那么\([l, r]\)里有\((r-l+1)-x\)个最小值,发现不是最小值的正好也是\((r-l+1-(r-l+1)-x)=x\)个,那么明显可以选中这些数进行翻转,这样\(x\)个数就到\([l, r]\)里了。右边同理,所以两边模拟一下取最小就行。

点击查看代码
void solve() {
    int n, l, r;
    std::cin >> n >> l >> r;
    std::vector<int> a(n);
    for (int i = 0; i < n; ++ i) {
    	std::cin >> a[i];
    }

    auto b = a;
    std::sort(a.begin(), a.begin() + r);
    i64 sum1 = 0, sum2 = 0;
    for (int i = 0; i < r - l + 1; ++ i) {
    	sum1 += a[i];
    }

    std::sort(b.begin() + l - 1, b.end());
    for (int i = l - 1; i < l - 1 + r - l + 1; ++ i) {
    	sum2 += b[i];
    }

    i64 ans = std::min(sum1, sum2);

    std::cout << ans << "\n";
}

C. Remove Exactly Two

题意:给你一颗树,你要删掉两个点,然后使得剩下的连通块最大。

设\(u\)的度数为\(deg_u\)。因为树没有环,那么如果删一个点就会分成\(deg_u\)块,那就是删度数最大的。现在考虑两个点,发现如果删除的两个点之间没有连边的话是不影响的,如果连边则因为有一条边重复了会少分成一个块。所以我们先枚举所有度数最大的点看有没有两个最大点之间没有连边,有点话就选这两个点就行。否则就拿一个度数最大的和一个剩下点度数最大的点就行。然后我是用并查集数的联通块,不过好像可以直接算。
这题赛时代码写的奇丑。

点击查看代码
struct DSU {
    std::vector<int> f, siz;
    
    DSU() {}
    DSU(int n) {
        init(n);
    }
    
    void init(int n) {
        f.resize(n);
        std::iota(f.begin(), f.end(), 0);
        siz.assign(n, 1);
    }
    
    int find(int x) {
        while (x != f[x]) {
            x = f[x] = f[f[x]];
        }
        return x;
    }
    
    bool same(int x, int y) {
        return find(x) == find(y);
    }
    
    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }
    
    int size(int x) {
        return siz[find(x)];
    }
};

void solve() {
    int n;
    std::cin >> n;
    std::vector<std::vector<int> > adj(n);
    std::vector<std::pair<int, int> > edges;
    std::vector<int> deg(n);
    for (int i = 1; i < n; ++ i) {
    	int u, v;
    	std::cin >> u >> v;
    	-- u, -- v;
    	adj[u].push_back(v);
    	adj[v].push_back(u);
    	++ deg[u]; ++ deg[v];
    	edges.push_back({u, v});
    }

    if (n == 2) {
    	std::cout << 0 << "\n";
    	return;
    }
    int max = *std::max_element(deg.begin(), deg.end());

    std::vector<int> b;
    int x = -1, y = -1, mx = 0;
    for (int i = 0; i < n; ++ i) {
		if (deg[i] == max) {
			b.push_back(i);
		}
    }


    if (b.size() >= 2) {
    	int mx = 0;
    	for (auto & u : b) {
    		for (auto & v : b) {
    			if (u != v) {
    				int flag = 0;
    				for (auto & x : adj[u]) {
    					if (x == v) {
    						flag = 1;
    						break;
    					}
    				}

    				if (max * 2 - flag > mx) {
    					mx = max * 2 - flag;
    					x = u, y = v;
    				}
    			}
    		}

    		if (mx == 2 * max) {
    			break;
    		}
    	}
    } else {
    	x = b[0];
    	int mx = -1;
    	for (int i = 0; i < n; ++ i) {
			if (i == x) {
				continue;
			}
			int flag = 0;
    		for (auto & j : adj[i]) {
    			if (x == j) {
					flag = 1;
					break;
				}
    		}

    		if (max + deg[i] - flag > mx) {
    			mx = max + deg[i] - flag;
    			y = i;
    		}
    	}
    }


    DSU d(n);
    for (auto & [u, v] : edges) {
    	if (u != x && u != y && v != x && v != y) {
    		d.merge(u, v);
    	}
    }

    int ans = 0;
    for (int i = 0; i < n; ++ i) {
    	if (i != x && i != y && d.find(i) == i) {
    		++ ans;
    	}
    }

    std::cout << ans << "\n";
}

D. Game With Triangles

待补

标签:std,int,Codeforces,++,flag,Div,deg,mx,1000
From: https://www.cnblogs.com/maburb/p/18686919

相关文章

  • 【CodeForces训练记录】Codeforces Round 1000 (Div. 2)
    训练情况赛后反思C题猜了个假结论WA4,每次选择度最多的删掉,在连续三个度都是最大的情况下,删中间的会寄A题有点前缀和的感觉,\([1,l]\)互质个数为\(l\),\([1,r]\)互质个数为\(r\),所以区间\([l,r]\)的个数就是\(r-l\),特判一下\(l=1,r=1\)的情况答案是\(1\)点击查看代......
  • Codeforces Round 998 (Div. 3)(部分题解)
    补题链接A. Fibonacciness思路:了解清楚题意,求得是最大的斐波那契的度,数组只有5个数(最多度为3),能列出其对应的式子 或 或#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn,m,k;vector<int>a(4);set<int>s;......
  • IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)
    B.KevinandGeometryvector的删除,无论是删除单个元素还是区间,一定是传入迭代器,而且区间一定是左闭右开区间点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intT; cin>>T; while(T--) { int......
  • Codeforces Round 983 (Div. 2)(EF未改)
    有点爆。感觉自己速度又慢效果又不好。A简单题。最多就尽量让\(1,0\)搭配起;最少就是尽量搭配\(0,0\)和\(1,1\)。B也是简单题,想一下就可以了。首先,想要保证给定的是中位数,最简单的就是比它小的分一组,比它大的分一组,自己分一组。但是因为组长度必须是奇数,所以只有在偶数位......
  • IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)
    A.KevinandArithmetic题意:给你\(n\)个数,你一开始有一个\(x=0\),每次你让\(x\)加上一个没用过的数,然后\(x\)会一直除二直到变成奇数。如果你加上一个数后能除2,分数加1,问分数最大多少。奇数后面加奇数才能是偶数,但一开始\(x\)是零,那么需要一个偶数,否则只能浪费一个奇数。所......
  • 使用 div 自定义 input 和 textarea
    1.为什么要自定义呢?原生的 input和textarea在某些特定场景下存在功能或兼容性限制,因此使用div元素自定义实现,突破原生输入框在样式、功能、兼容性上的限制。1、解决火狐浏览器换行问题某些版本的火狐浏览器中,原生 textarea 存在回车不换行而显示为空格的问题。这种......
  • Codeforces Round 999 比赛记录
    前情提要这个菜鸡CF上了\(\color{darkcyan}Specialist\),心情大好,正好赶上放假,决定打一场CF。赛时记录A上来脑子抽了,吃了一发罚时。发现写错了一种情况,改过来就过了。感觉并不是一个好的开始。B竟成为本人唯一一遍过的题,虽然写的时候有点慌。CDP。一开始认为空间不够,但发......
  • CF div1+2 999 (A~E)
    赛时三题,\(D\)就差一个显然的剪枝就能过了,qwq...A显然第一步能选偶数就选偶数,之后只能选奇数。细节见代码。codeB对于选取的任意四条边,设腰为\(x\),短边为\(a\),长边为\(b\),则能形成等腰梯形的充要条件为:\(x\)出现次数\(>=2\),且\(a+2*x>b\)。两个腰选最大,并且\(a,b\)尽可能接近......
  • 写一个方法来获取div到浏览器窗口的高度
    在前端开发中,你可以使用JavaScript的getBoundingClientRect()方法来获取一个元素(比如div)相对于浏览器窗口的位置和大小。这个方法返回一个DOMRect对象,其中包含了top、right、bottom和left等属性,分别表示元素各边到视口(viewport)的距离。为了获取一个div元素到浏览器窗口顶部的高度......
  • Codeforces Round 998 (Div. 3) 部分题解
    写题解的时候这场在评测,就不放代码了。E.GraphComposition题意给两个无向简单图,对图\(1\)添加若干条边或删除若干条边,使得两图的连通性一致,最少需要变更多少条边。题解求出图\(2\)的连通性,考虑图\(1\)的所有边,若违背了图\(2\)联通性的要删除(图\(2\)不联通但图\(......