Codeforces div3-498题解

A. Adjacent Replacements

对于这道题目就比较简单了,如果该数N为奇数,那么经过变换之后不变,如果该数为偶数则变为N - 1

#include <stdio.h>const int maxn=1005;
int a[maxn];
int n;void work()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]%2){printf("%d ",a[i]);}elseprintf("%d ",a[i]-1);}
}int main()
{work();return 0;
}

B. Polycarp’s Practice

首先根据题意我们可以确定的是,所挑选出来的数一定为输入的数中的最大的K个数,则我们所需要做的就是找出来这K个最大的数,并且记录下其位置,根据其位置来进行划分。自己这里使用的方法比较麻烦,另外使用了一个容器来存储位置,其实只要一个pair类型就可以解决的.

#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;const int maxn = 2003;map<int,queue<int> > pos;bool cmp(int a,int b)
{return a > b;
}int n,k;
vector<int> problems(maxn);void input()
{scanf("%d%d",&n,&k);for(int i = 0;i < n;i++){scanf("%d",&problems[i]);pos[problems[i]].push(i);}
}void work()
{vector<int> opro = problems;vector<int> ans;sort(opro.begin(),opro.end(),cmp);int power = 0;int old = -1;for(int i = 0;i < k;i++){power += opro[i];ans.push_back(pos[opro[i]].front());pos[opro[i]].pop();}printf("%d\n",power);sort(ans.begin(),ans.end());int left = 0;for(int i = 0;i < ans.size();i++){if(i != ans.size() - 1){printf("%d ",ans[i] - left + 1);left = ans[i] + 1;}else{printf("%d",n - left);}}
}int main()
{input();work();return 0;
}

C. Three Parts of the Array

对于这道题目,首先第一部分一定在数组左侧,第二部分一定在数组右侧,同时中间的部分可以为空,则可以采用双指针的方法,一个指针在前,一个指针在后,相遇或者部分之和相同的时候停止。

#include <cstdio>
#include <vector>
using namespace std;const int maxn = 2 * 1e5 + 3;vector<int> nums(maxn);int n;void input()
{scanf("%d",&n);for(int i = 0;i < n;i++){scanf("%d",&nums[i]);}
}void work()
{int left = 0;int right = n - 1;long long int suml = nums[left];long long int sumr = nums[right];long long int max = 0;while(left < right){if(suml > sumr){right--;sumr += nums[right];}else if(suml < sumr){left++;suml += nums[left];}else{if(suml > max){max = suml;}left++;right--;sumr += nums[right];suml += nums[left];}}printf("%lld",max);
}int main()
{input();work();return 0;
}

D. Two Strings Swaps

先要看懂题意,在每一次交换的时候,实际上只涉及到四个元素即a[i],a[n - i -1],b[i],b[n - i - 1],在这之中又有着几种不同的情况

1.四个元素相同
2.四个元素均不相同
3.三个元素相同
4.两个元素分别相同
5.两个元素相同,另外两个元素不同
其中对于1和4来说,不需要进行预处理即可,对于3来说则只需要进行一次预处理即可,对于2则需要进行两次预处理,对于5我们还需要分情况讨论,当a[i] = a[n - i - 1]时,由于我们只能对a进行处理,所以这个时候需要进行两次预处理,a[i] != a[n - i - 1]时则只需要进行一次。

#include <cstdio>
#include <map>using namespace std;const int maxn = 1e5 + 7;map<char,int> ans;int n;
char a[maxn],b[maxn];void input()
{scanf("%d",&n);getchar();scanf("%s",a);scanf("%s",b);
}void work()
{int cnt = 0;int mid = 0;if(n % 2){mid = n / 2 + 1;}else{mid = n / 2;}for(int i = 0;i < mid;i++){ans[a[i]]++;ans[b[i]]++;if(n - i - 1 != i){ans[a[n - i - 1]]++;ans[b[n - i - 1]]++;}else{if(ans[a[i]] % 2){cnt++;}break;}int temp = ans[a[i]] | ans[a[n - i - 1]] | ans[b[i]] | ans[b[n - i -1]];if(ans[a[i]] == 3 || ans[a[n - i - 1]] == 3 || ans[b[i]] == 3 || ans[b[n - i - 1]] == 3){cnt++;}else if(a[i] == a[n - i - 1] && b[i] != b[n - i - 1]){cnt += 2;}else if(b[i] == b[n - i - 1] && a[i] != a[n - i - 1]){cnt ++;}else if(ans[a[i]] == 1 && ans[a[n - i - 1]] == 1 && ans[b[i]] == 1 && ans[b[n - i - 1]] == 1){cnt += 2;}else if(temp == 3){cnt++;} ans.clear();}printf("%d",cnt);
}int main()
{input();work();return 0;
}

E. Military Problem

题目中所要求的就是求出从第i个节点开始进行dfs之后的第k个节点。那么我们只需要在最开始的时候在源节点进行一次dfs,并记录下每一个节点在搜索中出现的出现的位次n_i,那么此时访问第i个节点后的第k个节点,即访问第 n_i + k节点即可。

#include <cstdio>
#include <vector>using namespace std;int n,k;
const int maxn = 2 * 1e5 + 7;
int currentOrder;vector<vector<int> > officer(maxn);
vector<int> preorder(maxn);
vector<int> maxSize(maxn);
vector<int> preorder2Index(maxn);void dfs(int index)
{preorder[index] = currentOrder;preorder2Index[currentOrder] = index;currentOrder++;    for(int i = 0;i < officer[index].size();i++){dfs(officer[index][i]);}maxSize[index] = currentOrder - 1;
}void input()
{scanf("%d%d",&n,&k);int temp = 0;currentOrder = 0;for(int i = 2;i <= n;i++){scanf("%d",&temp);officer[temp].push_back(i);}
}void work()
{int p,q;for(int i = 0;i < k;i++){scanf("%d%d",&p,&q);  q += preorder[p] - 1;if(q > maxSize[p]){printf("-1\n");}else{printf("%d\n",preorder2Index[q]);}}
}int main()
{input();dfs(1);work();return 0;
}

F. Xor-Paths

根据题意,我们每走一步就会有两种选择,从(1,1)到(n,m)最多可走n + m - 2步,即如果我们从头走到尾,共有2^(n + m - 2)种情况,显然是会超时。所以我们就需要转换思路,这里采用中途相遇的方法。从(1,1)节点以及(n,m)节点同时开始走。两边各走一半的路程即(n + m - 2) / 2,记录下到达(i,j)节点时的异或值,最后再进行异或操作与k比较即可。

#include <cstdio>
#include <vector>
#include <map>using namespace std;int n,m;
int half;
long long int ans;
long long int target;
long long int cnt = 0;
long long int maps[23][23];
map<long long int, int> v[23][23];void input()
{scanf("%d%d%lld",&n,&m,&target);half = (n + m - 2) / 2;long long int temp;ans = 0;for(int i = 0;i < n;i++){for(int j = 0;j < m;j++){scanf("%lld",&maps[i][j]);}}
}void calclf(int x, int y, long long int val, int cnt)
{val ^= maps[x][y];if(cnt == half){v[x][y][val]++;return;}if(x + 1 < n){calclf(x + 1, y, val, cnt + 1);}if(y + 1 < m){calclf(x, y + 1, val, cnt + 1);}
}void calcrg(int x, int y, long long int val, int cnt)
{if(cnt == n + m - 2 - half){if(v[x][y].count(target ^ val)){ans += v[x][y][target ^ val];}return;}if(x > 0){calcrg(x - 1, y, val ^ maps[x][y], cnt + 1);}if(y > 0){    calcrg(x, y - 1, val ^ maps[x][y], cnt + 1);}
}void work()
{calclf(0,0,0,0);   calcrg(n - 1, m - 1,0,0);printf("%lld",ans);
}int main()
{input();work();return 0;
}

【Codeforces div3-498】题解相关推荐

  1. Codeforces Round #535 (Div. 3) [codeforces div3 难度测评]

    hhhh感觉我真的太久没有接触过OI了 大约是前天听到JK他们约着一起刷codeforces,假期里觉得有些颓废的我忽然也心血来潮来看看题目 今天看codeforces才知道居然有div3了,感觉应该 ...

  2. codeforces Div3 E. Boxers(签到题)

    codeforces Div3 E. Boxers 题目 http://codeforces.com/problemset/problem/1203/E 题意 有n个人参加比赛,比赛要求参赛选手的体重 ...

  3. c语言1106回文数,Codeforces 1106 简要题解

    A题 传送门 读错题还能过样例我给自己点个赞. 题意简述:给一个010101网格SSS,问满足Si,j=Si+1,j+1=Si+1,j−1=Si−1,j−1=Si−1,j+1S_{i,j}=S_{i+ ...

  4. Educational Codeforces Round 95题解

    Educational Codeforces Round 95题解 题目链接 代码链接 A. Buying Torches 题目大意: 你手上现在有一个木棍.有以下两种交换方式: 1.用一个木棍交换x ...

  5. Codeforces Round #498 (Div. 3)【完结】

    2022.3.6 题单地址:https://codeforces.com/contest/1006 目录 A. Adjacent Replacements B. Polycarp's Practice ...

  6. Codeforces 1110 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 众所周知ldxoildxoildxoi这种菜鸡选手是不会写HHH题的,因此该篇博客只有AAA题至GGG题的题解,实在抱歉. A题 传送门 题 ...

  7. codeforces div3 D Circular Dance (链式向前星)

    题目链接: http://codeforces.com/contest/1095/problem/D 通过题意可知,每次输入的两个数一定相邻,所有只要对每次输入的两个数看作是边,通过向前星构建无向图, ...

  8. Codeforces Round #498 (Div. 3) F. Xor-Paths

    题目链接:F. Xor-Paths 题解:从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc++.h> 2 #include<set> 3 #i ...

  9. codeforces 891E Lust 题解

    题目传送门 题目大意: 给出一个长度为 nnn 的序列,进行 kkk 次操作,每次随机选取一个 aia_iai​,让答案加上 aaa 序列中的其他数的乘积,然后让 ai−1a_i-1ai​−1,问最后 ...

最新文章

  1. U-boot链接地址的详解
  2. Ticker View
  3. mysql数据库的新特性_【数据库】MySQL新特性归档介绍
  4. 支付宝SDK ios快捷支付
  5. 毕设日志——Linux服务器状态查询命令
  6. 计算机网络的通信方式有哪几种,数据通信方式有哪几种
  7. QT实现年会抽奖小软件的实现
  8. 2012 考研的心路历程
  9. 基于SpringBoot的社团管理系统的设计与实现
  10. SAS中library是 excel引擎,LIBNAME STATEMENT
  11. 费马小定理和欧拉定理作业
  12. php-ftm,关于KEA128中FTM0/1的问题
  13. 国内有免费“免费虚拟主机““免费云服务器”吗?
  14. ArcGIS10.2版本正确的ArcGIS_Editor_OSM下载与安装
  15. python基础入门小结(1)
  16. 区块链技术改进身份和访问管理(IAM)的10种用例
  17. 菜鸟程序员自我修养心得
  18. Your account does not have sufficient permissions to modify containers的解决方法
  19. 我为什么放弃一个25000星的开源项目
  20. 802.1X Radius 服务器搭建

热门文章

  1. 母牛的故事 (递推)
  2. 【STC89C52】数码管静态显示和动态显示
  3. Unity Mesh基础系列(一)生成网格(程序生成)
  4. 干货:在Flutter项目下安卓flavor打包配置实践
  5. 机器学习——概率与统计
  6. C - A Mist of Florescence CodeForces - 989C
  7. matlab中矩阵的logical函数,Matlab中的logical
  8. 深入浅出CChart 每日一课——快乐高四第五十二课 旧梦重温,天上人间之炫彩界面库
  9. 数据分析侠:如何构建企业的数据分析能力
  10. Merge into用法总结