Codeforce round340 div2

本文详细解析了Codeforces竞赛中的四个算法题:从简单步数问题到复杂序列分割,再到几何覆盖问题和折线路径优化,每道题目都附有代码实现。深入探讨了动态规划、数学归纳、排序与搜索等核心算法思想。

Codeforces round 340 div2

A:题意:每次可以走1-5步,问你最少多少步走到x。

不说了..

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
int Ans,n;
int main() {
	scanf("%d",&n);
	Ans = n / 5 + ((n % 5 == 0) ? 0 : 1);
	cout<<Ans;
	return 0; 
}


B:题意:将一个0,1序列分成若干只有1的序列的方案数。

首先没有1的话答案是零(坑死)。

否则的话我们看两两1之间0的个数,设问num,那么把所有num + 1连乘起来就是答案了。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <ctime>
#define Int long long
using namespace std;
Int n,A[1010],head,tail,Ans = 1;
bool F = false;
int main() {
	scanf("%I64d",&n);
	for(int i = 1;i <= n;i ++)
	{
		scanf("%I64d",&A[i]);
		if(A[i] == 1) F = true;
	}
	if(!F) printf("0"),exit(0);
	head = 1;
	while(head <= n)
	{
		while(head <= n && A[head] == 1) head++;
		if(head > n) break;
		tail = head;
		while(A[tail + 1] == 0 && tail < n) tail ++;
		if(head == 1 || tail == n) head = tail + 1;
		else Ans *= (tail - head + 2),head = tail + 1;
	}
	cout<<Ans;
	return 0;
}


C:题意:给出平面上n个点,问以两个给定点为圆心作园,覆盖这n个点所需的两园半径的最小平方和是多少。

我们把n个点按与第一个点的距离排序,记录前缀和need[i]表示覆盖第1-i所需的最小的r1,记录后缀和have[i]表示覆盖i-n所需的最小的r2,那么min(need[i] + haveh[I + 1])就是答案。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <ctime>
#define Int long long
using namespace std;
struct point{Int x;Int y;
};point Point[100010];
Int Ans = 1e18,n,a,b,c,d,have[100010],need[100010];
Int calc(Int A,Int B,Int C,Int D) {return (A - C) * (A - C) + (B - D) * (B - D);}
bool comp(const point &x,const point &y) {
	Int val1 = calc(a,b,x.x,x.y);
	Int val2 = calc(a,b,y.x,y.y);
	return val1 < val2;
}
int main() {
	cin>>n;
	cin>>a>>b>>c>>d;
	for(int i = 1;i <= n;i ++) cin>>Point[i].x>>Point[i].y;
	sort(Point + 1,Point + n + 1,comp);
	for(int i = 1;i <= n;i ++) need[i] = max(calc(a,b,Point[i].x,Point[i].y),need[i - 1]);
	for(int i = n;i >= 1;i --) have[i] = max(calc(c,d,Point[i].x,Point[i].y),have[i + 1]);
	for(int i = 0;i <= n;i ++) Ans = min(Ans,need[i] + have[i + 1]);
	cout<<Ans;
}


D:题意:给出三个点,用一条折线经过这三个点,折线的所有部分必须和坐标轴平行,问折线最少由几条直线组成。

大特判..

若三点一线,答案是1.

若两点一线且三点不是构成T字型,答案是2

否则答案是3.

#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
int Ans,n;
int a,b,c,d,e,f;
int main() {
	scanf("%d%d",&a,&b);
	scanf("%d%d",&c,&d);
	scanf("%d%d",&e,&f);
	if((a == c && c == e) || (b == d && d == f)) printf("1");
	else if(a == c)
	{
		if(f >= max(b,d) || f <= min(b,d)) printf("2");
		else printf("3");
	}
	else if(a == e)
	{
		if(d >= max(b,f) || d <= min(b,f)) printf("2");
		else printf("3");
	}
	else if(c == e)
	{
		if(b >= max(f,d) || b <= min(f,d)) printf("2");
		else printf("3");
	}
	else if(b == d)
	{
		if(e >= max(a,c) || e <= min(a,c)) printf("2");
		else printf("3");
	}
	else if(b == f)
	{
		if(c >= max(a,e) || c <= min(a,e)) printf("2");
		else printf("3");
	}
	else if(d == f)
	{
		if(a >= max(e,c) || a <= min(e,c)) printf("2");
		else printf("3");
	}
	else printf("3");
	return 0;
}


E:题意:给出一个序列,每次询问l到r间A[i]^A[i+1]^..A[j] ==k的i,j的数量(i<=j,k是全局的变量,不变。)

莫队算法,首先A[i]^A[i+1]..A[j]=(A[1]^A[2]..A[i-1])^(A[1]^A[2]…A[j])(i<=j)

那么我们记录前缀和s[]。问题就变成了每次询问l到r内s[i-1]^s[j]==k的对数。

于是再记录两个桶分别表示s[i-1]和s[i]出现的次数,就可以了。(注意每次加一个点是加在前面还是后面,加在前面用s[j]桶更新,否则用s[j-1]的桶)。.

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <ctime>
#define Int long long
using namespace std;
struct Ques {Int l;Int r;Int id;Int Ans;
};Ques q[100010];
Int n,m,A[100010],s[100010],head,tail,v,k;
Int Ans,M[3000010],N[3000010];
bool comp(const Ques &x,const Ques &y) {
	if(x.l / v != y.l / v) return x.l < y.l;
	return x.r < y.r;
}
bool back(const Ques &x,const Ques &y) {return x.id < y.id;}
int main() {
	scanf("%I64d%I64d%I64d",&n,&m,&k);
	v = (Int)sqrt(double(n));
	for(Int i = 1;i <= n;i ++) scanf("%I64d",&A[i]);
	for(Int i = 1;i <= n;i ++) s[i] = s[i - 1] ^ A[i];
	for(Int i = 1;i <= m;i ++)
	{
		scanf("%I64d%I64d",&q[i].l,&q[i].r);
		q[i].id = i;
	}
	sort(q + 1,q + m + 1,comp);
	head = 1,tail = 0;Ans = 0;
	for(Int i = 1;i <= m;i ++)
	{
		while(tail < q[i].r)
		{
			tail ++;
			N[s[tail]] ++;
			M[s[tail - 1]] ++;
			Ans += M[k ^ s[tail]];
		}
		while(tail > q[i].r)
		{
			Ans -= M[k ^ s[tail]];
			N[s[tail]] --;
			M[s[tail - 1]] --;
			tail --;
		}
		while(head < q[i].l)
		{
			Ans -= N[k ^ s[head - 1]];
			N[s[head]] --;
			M[s[head - 1]] --;
			head ++;
		}
		while(head > q[i].l)
		{
			head --;
			N[s[head]] ++;
			M[s[head - 1]] ++;
			Ans += N[k ^ s[head - 1]];
		}
		q[i].Ans = Ans;
	}
	sort(q + 1,q + m + 1,back);
	for(Int i = 1;i <= m;i ++) printf("%I64d\n",q[i].Ans);
	return 0;
}


### Codeforces Problem or Contest 998 Information For the specific details on Codeforces problem or contest numbered 998, direct references were not provided within the available citations. However, based on similar structures observed in other contests such as those described where configurations often include constraints like `n` representing numbers of elements with defined ranges[^1], it can be inferred that contest or problem 998 would follow a comparable format. Typically, each Codeforces contest includes several problems labeled from A to F or beyond depending on the round size. Each problem comes with its own set of rules, input/output formats, and constraint descriptions. For instance, some problems specify conditions involving integer inputs for calculations or logical deductions, while others might involve more complex algorithms or data processing tasks[^3]. To find detailed information regarding contest or problem 998 specifically: - Visit the official Codeforces website. - Navigate through past contests until reaching contest 998. - Review individual problem statements under this contest for precise requirements and examples. Additionally, competitive programming platforms usually provide comprehensive documentation alongside community discussions which serve valuable resources when exploring particular challenges or learning algorithmic solutions[^2]. ```cpp // Example C++ code snippet demonstrating how contestants interact with input/output during competitions #include <iostream> using namespace std; int main() { int n; cin >> n; // Process according to problem statement specifics } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值