Codeforces Round 971 (Div. 4)

C. The Legend of Freya the Frog
因为是从x开始跳,贪心的取肯定是直接用max(a,b)/d向上取整然后再乘2,但是要注意,如果再x到达之前,y已经是到达了,也就是某次以后,y都取0,那么最终次数就要-1,因为最后不用再跳y方向的

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007


void solve()
{
    int x,y,d;
    cin>>x>>y>>d;
    int ans=max((x+d-1)/d,(y+d-1)/d);
    ans*=2;
    if((x+d-1)/d>(y+d-1)/d) ans--;
    cout<<ans<<endl;
}

signed main()
{
    int t=1; cin>>t;
    while(t--) solve();
    
}

D. Satyam and Counting
分为两种情况
1.(x,0) (x,1),( )这里可以任意一点,所以这一种每一次可以贡献n-2
2.(x,0) (x+2,0),(x+1,1)和(x,1)(x+2,1) (x+1,0)

#include <bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	int n;
	cin>>n;
	set<pair<int,int> >se;
	for(int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		se.insert({x,y});
	}
	
	int ans=0;
	for(auto [x,y]:se)
	{
		if(se.count({x+2,y}) &&se.count({x+1,y^1}))  ans++;
		if(y==0&&se.count({x,1}) ) ans+=n-2;
		
	}
	cout<<ans<<endl;
	
	
}

signed main()
{
	int t=1;
	cin>>t;
	while(t--) solve();
	
}

E. Klee's SUPER DUPER LARGE Array!!!
直接二分答案,当cal(mid)> cal(mid+1)更新,对于绝对值里面的元素和,直接使用等差求和公式计算

#include <bits/stdc++.h>
using namespace std;
#define int long long



void solve()
{
	int n,k;
	cin>>n>>k;
	auto cal=[&](int x)
	{
		int res=0;
		res+=(2*k+x-1)*x/2;
		res-=(2*k+x+n-1)*(n-x)/2;
		return abs(res);
	};
	
	int l=1,r=n;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(cal(mid)>cal(mid+1)) l=mid+1;
		else r=mid-1;
	}
	cout<<cal(l)<<endl;

	
}

signed main()
{
	int t=1;
	cin>>t;
	while(t--) solve();
	
}

F. Firefly's Queries
基于官方题解我举样例方便读者理解
比如4 8 3 2 4 4 8 3 2 4,我们会发现这样接上去以后,从下标1-5开始每个数往后延4个数,便是翻转后的结果,比如从第二个数开始时8 3 2 4 4第三个数开始是3 2 4 4 8。
然后举l=2,r=13,(从0开始)|4 8 【3 2 4| 8 3 2 4 4| 3 2 4 4】 8|,那么答案就是pre【n】*3-左边那段翻转的对应位置的前缀和-右边那段翻转的对应位置后缀和

#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
	int n,k;
	cin>>n>>k;
	vector<int>pre(1),ve(n);
	for(auto &t:ve) {
		cin>>t;
		pre.push_back(pre.back()+t);
	}
	//按1 2 3 1 2 3这样排,前三个数字就是翻转的起点
	for(auto t:ve)
	{
		pre.push_back(pre.back()+t);
	}
	
//	for(auto t:pre) cout<<t<<" ";
	while(k--){
		int l,r;
		cin>>l>>r;
		l--,r--;
		int i,j;//i为翻转的起点,j同理
		i=l/n, j=r/n;
		l%=n,r%=n;//此时l,r分别为各自计算前缀和后缀的位置
		cout<<pre[n]*(j-i+1)-(pre[i+l]-pre[i])-(pre[j+n]-pre[j+r+1])<<endl;	
		//pre[i+l]-pre[i]理解为计算前缀和
		//pre[j+n]-pre[j+r+1]理解为计算后缀和
	}
	
	
}


signed main() {
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
}

posted on 2024-09-11 21:40  swj2529411658  阅读(54)  评论(0编辑  收藏  举报

导航