首页 > 其他分享 >Codeforces Round 875 (Div. 2) A~D

Codeforces Round 875 (Div. 2) A~D

时间:2023-05-29 09:44:41浏览次数:37  
标签:cntb int res rep 875 Codeforces len cin Div

Codeforces Round 875 (Div. 2) A~D

A. Twin Permutations

构造\(a[i]+b[i]=n+1\)

void work() {  
	int n;
	cin >> n;
	rep (i, 1, n) {
		int x;
		cin >> x;
		cout << n - x + 1 << " ";
	}
	cout << endl;
}

B. Array merging

对于最长的subarray,每个数组最多贡献一个连续段

void work() {  
	int n;
	cin >> n;
	vector<LL> a(n + 1), b(n + 1), cnta(2 * n + 1), cntb(2 * n + 1);
	LL res = 0, len = 0;	
	rep (i, 1, n) {
		cin >> a[i];
		if (a[i] != a[i - 1]) {
			cnta[a[i - 1]] = max(cnta[a[i - 1]], len);
			len = 1;
		}
		else len++;
	}
	if (len) cnta[a[n]] = max(cnta[a[n]], len);
	len = 0;
	rep (i, 1, n) {
		cin >> b[i];
		if (b[i] != b[i - 1]) {
			cntb[b[i - 1]] = max(cntb[b[i - 1]], len);
			len = 1;
		}
		else len++;
	}
	if (len) cntb[b[n]] = max(cntb[b[n]], len);
	rep (i, 1, 2 * n) {
		res = max(res, cnta[i] + cntb[i]);
	}
	cout << res << "\n";
}

C. Copil Copac Draws Trees

结点\(u\)能被选择,当且仅当其所有祖先结点都被选择。所以整个过程是由根不断向叶子扩展的过程,可以用\(dfs\)传入上一条边的\(id\),如果当前边的\(id\)小于它,就只能在下一个回合被选择,\(f[v]=f[u]+1\),否则\(f[v]=f[u]\),时间复杂度\(O(n)\)

void work() {  
	int n;
	cin >> n;
	
	vector<int> dp(n + 1);
	vector<vector<PII>> g(n + 1);
	
	rep (i, 1, n - 1) {
		int u, v;
		cin >> u >> v;
		g[u].push_back({v, i});
		g[v].push_back({u, i});
	}
	
	function<void(int, int, int)> dfs = [&](int u, int fa, int uid) {
		for (auto x: g[u]) {
			int v = x.fr, id = x.se;
			if (v == fa) continue;
			if (id < uid) dp[v] = dp[u] + 1;
			else dp[v] = dp[u];
			dfs(v, u, id);
		}
	};
	
	dfs(1, 0, 0);
	
	int res = 1;
	rep (i, 1, n) res = max(res, dp[i] + 1);
	cout << res << "\n";
}

D. The BOSS Can Count Pairs

对于\(a[i]*a[j]=b[i]+b[j]\)成立的所有\((i,j)\),\(b[i]+b[j]<=2*n\),所以\(min(a[i],a[j])<=sqrt(2*n)\)。外层枚举\(min(a[i],a[j])\)的值来统计。

赛时很快想到这里,但是内层循环居然去枚举\(a[i]*a[j]\),这样内层的时间复杂度远不止\(O(n)\),导致放弃了这个思路,其实遍历一遍数组就能统计了。

时间复杂度\(O(nsqrt(2n))\)

int f[N];
 
void work() {
    int n;
    cin >> n;
    vector<int> a(n + 1), b(n + 1);
    rep (i, 1, n) cin >> a[i];
    rep (i, 1, n) cin >> b[i];
    
    LL res = 0;
    for (int i = 1; i * i <= 2 * n; i++) {
        rep (j, 1, n) {
            if (a[j] == i) {
                if (b[j] < i * i) res += f[i * i - b[j]];
                f[b[j]]++;
            }
        }
        rep (j, 1, n) {
            if (a[j] > i && 1ll * a[j] * i <= 2 * n) {
                if (b[j] < a[j] * i) res += f[a[j] * i - b[j]];
            }
        }
        rep (j, 1, n) if (a[j] == i) f[b[j]]--;
    }
    
    cout << res << "\n";
}

标签:cntb,int,res,rep,875,Codeforces,len,cin,Div
From: https://www.cnblogs.com/xhy666/p/17439531.html

相关文章

  • HTML中让上下两个div之间保持一定距离或没有距离
    这篇文章主要为大家详细介绍了HTML让上下两个DIV之间保持一定距离或没有距离,可以用来参考一下。1、若想上下DIV块之间距离,只需设定:在CSS里设置DIV标签各属性参数为0div{margin:0;border:0;padding:0;}这里就设置了DIV标签CSS属性相当于初始化了DIV标签CSS属性,这里设置margin外......
  • Educational Codeforces Round 149 (Rated for Div. 2)(A~F)
    A.GrasshopperonaLine题意:给出n,k,从0开始,每次可以加一个数,最快到达n需要,输出首先跳几次,然后每次跳多少,限制只有一个跳的长度不能整除k。分析:n%k,有余直接跳,没余数,先跳一个,再跳剩余的长度。代码:#include<cstring>#include<iostream>#include<algorithm>usingnamespac......
  • 29. Divide Two Integers刷题笔记
    参考的题解classSolution:defdivide(self,dividend:int,divisor:int)->int:positive=(dividend<0)is(divisor<0)dividend,divisor=abs(dividend),abs(divisor)res=0whiledividend>=divisor:......
  • Codeforces 1444E - Finding the Vertex
    非常神秘的一道题,当之无愧的*3500。首先考虑转化题意。考虑一种决策树,由于我们每次问一条边之后,相当于会根据信息删掉两个连通块中的一个,因此一种决策树实际上对应了原树的一棵边分树。而为了让最坏情况下的询问次数最少,我们目标实际上是最小化边分树的深度。考虑借鉴P5912JA......
  • Educational Codeforces Round 149 (Rated for Div. 2) 题解
    https://codeforces.com/contest/1837https://codeforces.com/contest/1837/problems利益相关:上紫祭。真的不要以为这道题放在F就不敢做。压线过题的感觉真好。ABC题都过水,就不写了。代码丢在这里:A:https://codeforces.com/contest/1837/submission/207156920B:https:......
  • 用fetch处理的流,放到div中会有样式丢失的问题
    最近在做fetch处理流的问题,发现接收到得流,在div中渲染得时候样式会丢失,特别是空格、换行之类得。为了解决问题去看看了css得样式处理发现css中有个属性white-space。然后就去看了这个属性的定义和取值情况。   在css中white-space属性用来控制容器的文本中带有空白符、制表......
  • 文字超过div容器的高度显示...
    我们一般遇到的场景为超过一行或者2行,3行等等显示...,但是对于div容器如果想实现超过div容器的高度才显示...,这该怎么实现呢我们知道,当div只有内部只有一个文字时此时空间足够,2个也是...那么第n个呢,所以思路来了,我们可以一直计算下去,知道超过容器高度为止代码如下:<html><bod......
  • CodeForces 1107B Digital root(找规律)
    传送门每个数字都有个数位和,就是把数字的每一位相加直到数位和是一个个位数。然后题目就要你求第K个数位和为X的数字是多少。写一些数字出来就很容易发现规律了可以看出每一竖列的数位和是相等的,然后就找到规律是9*(k-1)+x,注意数据范围是1e12,是longlong,然后就这么多,就可以直......
  • CodeForces 1107A Digits Sequence Dividing(思维)
    传送门唉,题目讲的天花乱坠的,花里胡哨,一上来真是把我唬住了。愣了半天也没看出来到底咋做,后来借助翻译明白了这个题就是让你把一串字符分成两串,然后第一串要比第二串小,就这样,然后又是个SpecialJudge。做的时候就把第一个数作为第一个串,然后串长如果为2,就判断一下后面的串要比第一个......
  • CodeForces 1108B Divisors of Two Integers(思维)
    传送门题目大意就是给你由X,Y两个数的所有因子(包括一和数本身)组成的序列,然后通过这个序列找出这两个数。由此可见,序列里最大的数一定是X或Y其中的一个,然后我们的任务就是找另一个了,我找的是剩下的因子里不能被已找到的那个数整除的数中最大的数,且没有和这个数相同的数。#include<std......