VP记录:Codeforces Round 875 (Div. 2) A~D

news/2025/2/12 12:50:42/

传送门:CF

前提提要:无

A题:A. Twin Permutations

简单思维题.不难发现只要将所有数对 a i + b i ai+bi ai+bi控制等于 n n n即可.因为两个数列都是排列,所以这个是必可以满足的.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int a[maxn];
int main() {int T=read();while(T--) {int n=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++) {cout<<n-a[i]+1<<" ";}cout<<endl;}return 0;
}

B题:B. Array merging

简单思维题.因为我们可以掌控出数的时刻.不难发现,我们只要找到两个数列中每一个数字的连续的个数即可.我们最终的答案就是两个数列中最大的每一个数字的连续个数和.
举一个栗子,对于合并,假设我们最终的答案是 1 1 1,我们肯定是需要找到a数列中最长的连续的1的位置(记为pos1)以及b数列中最长的连续的1的位置(记为pos2),我们先将pos2,pos1之前的所有数字都加入c中,然后我们再加入所有的1即可.
注意,在一个数列中假设数字不是连续的,我们必然是不可能让它们在合并后的数列中是连续的.这个很显然,就不在赘述了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int a[maxn],b[maxn];
int main() {int T=read();while(T--) {int n=read();map<int,int>num1,num2;for(int i=1;i<=n;i++) {a[i]=read();}for(int i=1;i<=n;i++) {b[i]=read();}int cnt=1;num1[a[1]]=1;for(int i=2;i<=n;i++) {if(a[i]==a[i-1]) {cnt++;	}else {num1[a[i-1]]=max(num1[a[i-1]],cnt);cnt=1;}if(i==n) {num1[a[i]]=max(num1[a[i]],cnt);}}cnt=1;num2[b[1]]=1;for(int i=2;i<=n;i++) {if(b[i]==b[i-1]) {cnt++;}else {num2[b[i-1]]=max(num2[b[i-1]],cnt);cnt=1;}if(i==n) {num2[b[i]]=max(num2[b[i]],cnt);}}int maxx=-int_INF;for(int i=1;i<=2*n;i++) {maxx=max(maxx,num1[i]+num2[i]);}cout<<maxx<<endl;}return 0;
}

C题:C. Copil Copac Draws Trees

一道图论题.推一推样例之后很容易知道应该怎么做.
考虑对所有给定的边进行建树,并且记录每一条边的优先级.
然后我们就可以开始从根节点开始跑dfs,对于每一条边,假设我们的下一条边的优先级小于我们的当前边,我们就可以在一次循环中将其遍历,反之我们需要将花费+1.
但是需要注意的是,我们在一次循环中可能遇到很多条需要加花费的边,这些边的花费是可以在一次循环中解决的,也就是花费只需要一,所以我们不能反复累加.
解决方案是,可以记录遍历到每一个节点需要的花费,最后在每一个叶子结点取一个 m a x max max.
图论题不是很好用文字来讲明白,建议结合代码食用

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
map<int,map<int,int> >mp;
vector<int>tree[maxn];
int vis[maxn];int ans=0;
void dfs(int u,int per_u,int last,int dep) {for(int i=0;i<tree[u].size();i++) {int v=tree[u][i];if(v==per_u) continue;if(mp[u][v]>last) {dfs(v,u,mp[u][v],dep);}else {dfs(v,u,mp[u][v],dep+1);}}ans=max(ans,dep);
}
int main() {int T=read();while(T--) {int n=read();for(int i=1;i<=n;i++) {tree[i].clear();vis[i]=0;}mp.clear();for(int i=1;i<=n-1;i++) {int u=read(),v=read();tree[u].push_back(v);tree[v].push_back(u);mp[u][v]=mp[v][u]=i;}ans=1;dfs(1,0,0,1);cout<<ans<<endl;}return 0;
}

D题:D. The BOSS Can Count Pairs

本题的突破口也是比较经典的了.对于这种看起来很像 n 2 n^2 n2的题目,一般都有一些性质.比如本题,在数的值域方面就是一个突破口.很显然对于n^2的暴力算法,我们的值域可以达到1e9,但是为什么这里的值域才n呢,想到这里,对于这道题应该就有思路了.

对于 a i + a j = b i + b j ai+aj=bi+bj ai+aj=bi+bj,又因为 b i + b j < = 2 ∗ n bi+bj<=2*n bi+bj<=2n,所以有 a i ∗ a j < = 2 ∗ n ai*aj<=2*n aiaj<=2n,因为最终是求点对的数量,和先后顺序无关,所以我们不妨将a数组从小到大排一个序.此时我们保证 a i < = a j ai<=aj ai<=aj.
然后我们枚举 a j aj aj,注意此时我们不能枚举 a i ai ai,这样我们的复杂度还是炸裂的(此时为 a i ai ai~ 2 ∗ n / a [ i ] 2*n/a[i] 2n/a[i]),至于为什么枚举 a j aj aj竟然就可以缩小复杂度呢,这就是算法的巧妙所在了.真是太妙啦.

考虑枚举 a j aj aj,然后我们此时可以枚举 a i ai ai的值域,显然我们的 a i < = 2 ∗ n / a j ai<=\sqrt{2*n/aj} ai<=2n/aj ,因为此时 a i < = a j ai<=aj ai<=aj.此时我们就可以将复杂度降为 n n n\sqrt{n} nn 了.因为此时枚举了 a j aj aj,所以我们也知道了 b j bj bj,所以我们就知道了与 a i ai ai相配的 b i bi bi的大小,也就是 a i ∗ a j − b j ai*aj-bj aiajbj.所以此时我们的问题就变成了有多少个 < a i , b i > <ai,bi> <ai,bi>满足这个关系.这个也不难解决,使用一个桶记录一下即可.

注意本题比较卡内存和时限,map会被卡,数组大小需要计算一下,还需要开longlong

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
int mp[635][200010];
#define int long long
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
struct Node{int a,b;bool operator < (const Node &rhs) const {return a<rhs.a;}
}node[200010];
int mp1[200010],mp2[200010];
signed main() {int T=read();while(T--) {int n=read();for(int i=1;i<=n;i++) {node[i].a=read();mp1[node[i].a]++;}for(int i=1;i<=n;i++) {node[i].b=read();mp2[node[i].b]++;}sort(node+1,node+n+1);int ans=0;int limit=__builtin_sqrt(2*n);for(int i=1;i<=n;i++) {for(int j=1;j<=limit&&j*node[i].a<=2*n;j++) {if(mp1[j]) {if(node[i].a*j-node[i].b>n||node[i].a*j-node[i].b<0) continue;ans+=(ll)mp[j][node[i].a*j-node[i].b];}}if(node[i].a<=limit)mp[node[i].a][node[i].b]++;}for(int i=1;i<=n;i++) {if(node[i].a<=limit)mp[node[i].a][node[i].b]=0;mp1[node[i].a]=0;mp2[node[i].b]=0;}cout<<ans<<endl;}return 0;
}

http://www.ppmy.cn/news/121732.html

相关文章

家用电动跑步机选购经验

第一个要认真想好的问题&#xff1a;你会坚持跑步吗&#xff1f;一时冲动买了之后撂在一边的太多了&#xff01; 分类&#xff1a;家用&#xff08;单功能、多功能&#xff09;6k以下&#xff0c;高端家用或轻商用6k~3w&#xff0c;商用3w以上 关键配件&#xff1a;马达、减震…

健身装备有哪些推荐?健身运动装备品牌排行榜

现在人们对自己的身体状态越来越重视了&#xff0c;无论是怎样的生活&#xff0c;一个健康的身体非常重要&#xff0c;近几年的运动健身热潮的兴起&#xff0c;能看出来人们会花更多的时间去锻炼自己的身体了&#xff0c;与之而来的就是各种运动装备的不断推陈出新。作为一名运…

市面上跑步耳机哪种好、2023年最适合跑步用的耳机排名

这几年&#xff0c;越来越多人注意到了身体健康的重要性&#xff0c;而随着今年飞盘、露营、刘畊宏女孩的兴起&#xff0c;再到卡塔尔世界杯&#xff0c;不断刺激大众运动、健身的热情&#xff0c;面对全民运动热潮&#xff0c;作为普通人应该如何保持激情&#xff0c;实现身心…

跑步时戴什么耳机好、分享五款最适合跑步的运动耳机排名清单

在进行户外跑步、骑行等运动&#xff0c;往往会感到枯燥乏味&#xff0c;很难坚持下去&#xff0c;就像我经常跑一圈就觉得没了动力&#xff0c;但是当我戴上耳机听音乐跑步时&#xff0c;不知不觉就结束了&#xff0c;就感觉时间过得很快。不过话有说回来&#xff0c;适合跑步…

为何生活节奏越来越快因为城市是一台不断加速的跑步机

为何生活节奏越来越快因为城市是一台不断加速的跑步机 导语 从人类世进入城市世&#xff0c;城市的发展还在持续加速。被潮流推进的我们又如何窥测城市生长的节奏&#xff0c;以达到自身的“指数”发展&#xff1f;这篇文章是对Lus M. A. Bettencourt等和Geoffrey B. West 在2…

跑步戴什么耳机比较好、精挑五款最佳跑步耳机推荐

运动蓝牙耳机近几年受到市场的欢迎&#xff0c;种类越来越多&#xff0c;各类功能也日益五花八门&#xff0c;消费者很难准确的进行分辨&#xff0c;一不小心可能买到华而不实的产品。现在了解一下值得入手的运动蓝牙耳机&#xff0c;从多个角度对蓝牙耳机进行评估后&#xff0…

头戴式耳机跑步方便吗、公认最好的跑步耳机排行榜

平时&#xff0c;我们总能看到许多运动健身的人群&#xff0c;在锻炼时都佩戴着耳机。但运动耳机的选择&#xff0c;同样是大有学问的。如果佩戴传统的真无线蓝牙耳机&#xff0c;有可能出现佩戴不稳、耳道肿胀等问题&#xff0c;影响运动体验。所以今天我们特意给大家带来几款…

跑步运动耳机哪个牌子好,推荐几款专业跑步耳机

我喜欢运动&#xff0c;特别喜欢跑步、快走和骑行&#xff0c;说实话&#xff0c;运动的过程是枯燥乏味的&#xff0c;而音乐的注入就像一味调味剂&#xff0c;让我的运动丰富多彩了起来。开始的时候&#xff0c;每天广场4公里的快走是必修课&#xff0c;记得当时戴了一个有线耳…