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) 编辑 收藏 举报