A
01序列,一个操作对某一位取反,一个操作问你当前第k大是多少
维护一个当前最后一个1所在排名

#include <cstdio>
using namespace std;
const int MAX_N = 100025;
int arr[MAX_N];
int main()
{int n,m,sum = 0;scanf("%d%d",&n,&m);for(int i = 1;i<=n;++i){scanf("%d",&arr[i]);sum+=arr[i];}while(m--){int x,y;scanf("%d%d",&x,&y);if(x==1){if(arr[y]==0){sum+=1;arr[y] = 1;}else{arr[y] = 0;sum-=1;}}else{if(y<=sum){printf("1\n");}else{printf("0\n");}}}return 0;
}

B
比较有意思的一题 我们会发现只要纵坐标相邻之间绝对值<=1 就会必须要移动 否则不用移动
当一条竖线需要特判

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 100025;
int arr[MAX_N];
int main()
{int t;int n,u,v;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&u,&v);bool flag = true;int tmp = 0;for(int i = 1;i<=n;++i){scanf("%d",&arr[i]);if(i==2){tmp = arr[i] - arr[i-1];if(abs(arr[i]-arr[i-1])>1){flag = false;}}else if (i>=3){if(abs(arr[i]-arr[i-1])>1){flag = false;}}}bool flag_ = false;sort(arr+1,arr+1+n);if(arr[1]==arr[n]) flag_ = true;if(flag_){printf("%d\n",min(v*2,u+v));}else if (flag){printf("%d\n",min(u,v));}else {printf("0\n");}}return 0;
}

C
我们发现某一位被递减至1时 他会对 i+2,i+3…i+Si 都做出一跳贡献
所以我们从右往左倒着做,维护每一位对后面的贡献
某一位如果已经到了1 此时过多的贡献会传递到下面

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX_N = 5025;long long arr[MAX_N];
long long dp[MAX_N];
int main()
{long long ans = 0;int t,n;scanf("%d",&t);while(t--){ans = 0;scanf("%d",&n);for(int i = 1;i<=n;++i){scanf("%lld",&arr[i]);dp[i] = 0;}for(int i = n;i>=1;--i){int l = i + 2;int r = min(1ll*n,i+arr[i]);for(int j = l;j<=r;++j){dp[j]++;if(dp[j]>(arr[j]-1)) {int tmp = dp[j]-(arr[j]-1);dp[j+1]+=tmp,dp[j]-=tmp;}}while(r+2<=n&&r+1<=n&&dp[r+1]>(arr[r+1]-1)) {int tmp = dp[r+1]-(arr[r+1]-1);dp[r+2]+=tmp,dp[r+1]-=tmp,r++;}}for(int i = 1;i<=n;++i){ans += max(0ll,arr[i]-1-dp[i]);}printf("%lld\n",ans);}return 0;
}

D
给你n m,定义连边,u,v u&v == v 则可以连一条单向边 u -> u+v 问你n能不能到m
我们不难发现m>=n才有解
那么还有如果m是 2^i - 1 那么肯定无解
并且还有一个性质m含1的个数要<=n 比赛的时候一直当做相等做 因为多个1只要顺序小 可以向前合成比原先少个数的1
相等时我们就知道顺序关系了 m每一个1都要在n同排名1左边 即从右到左统计下标 ith 1 ∈m 下标 >= ith 1 ∈n

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N = 35;int arr[MAX_N],brr[MAX_N],f[MAX_N];int main()
{int t;scanf("%d",&t);while(t--){int n,m;for(int i = 1;i<=30;++i){arr[i] = brr[i] = 0;}scanf("%d%d",&n,&m);if(m>=n){int num = 0,num_ = 0,step = 0;int tmp = (1<<29);while(tmp){if((n&tmp)!=0){arr[++num] = 30 - step+1;}if((m&tmp)!=0){brr[++num_] = 30 - step+1;}tmp/=2;step++;}bool flag = (num>=num_)?true:false;for(int i = 1;i<=min(num,num_);++i){flag &= (arr[num-i+1]<=brr[num_-i+1])?true:false;}if(flag) printf("YES\n");else printf("NO\n");}else{printf("NO\n");}}return 0;
}

E. Fib-tree
数的大小为斐波那契数,并且斐波那契树可以分裂成(去掉一条边)两个合法的斐波那契树 此时斐波那契树合法 个数为1也被认为是合法的斐波那契树
数学归纳法证明 至多有两条边可以完成分裂
且两条边将 Fbi -> Fbi-1 + Fbi-2 = 2Fbi-2 + Fbi-3
所以我们先找重心,证明:因为第四个斐波那契树开始 i>=4, Fbi-1 > Fbi-2 又Fbi-1+Fbi-2 = Fbi
vis代表边是否被用过(分裂则为用过)
找到重心后dfs查找 Fbi-2 是否有两个 看之前证明
有一个则走 Fbi-1 + Fbi-2
否则走 2
Fbi-2 + Fbi-3
注意全局变量在递归中要用临时变量传递下个递归过程

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;const int MAX_N = 200025;
vector<pair<int,int> > vt[MAX_N];
bool vis[MAX_N];
int sz[MAX_N],f[35],xb,arr[MAX_N];
vector<pair<int,int> >VT;void GG()
{printf("NO\n");exit(0);
}void init()
{f[0] = f[1] = 1;for(int i =2;i<=30;++i){f[i] = f[i-1] + f[i-2];}
}int tree_rt,tree_minn;
void dfs0(int x,int fa,int n)
{int maxx = 0;sz[x] = 1;for(auto y:vt[x]){if(y.first!=fa&&!vis[y.second]){dfs0(y.first,x,n);sz[x]+=sz[y.first];maxx = max(maxx,sz[y.first]);}}if(maxx*2<n&&sz[x]*2>=n) tree_rt = x;
}void dfs1(int x,int fa,int k)
{sz[x] = 1;for(auto y:vt[x]){if(y.first!=fa&&!vis[y.second]){dfs1(y.first,x,k);sz[x]+=sz[y.first];if(sz[y.first]==f[k-2]){VT.push_back(y);}}}
}void solve(int n,int x)
{if(n<=3) return;int k = 0;while(f[k]<n) ++k;if(f[k]!=n) GG();tree_minn = 0x3f3f3f3f;dfs0(x,0,f[k]);int now_rt = tree_rt;vector<pair<int,int> >s_VT;swap(VT,s_VT);dfs1(now_rt,0,k);if(VT.size()==0) GG();if(VT.size()==1){int V = VT[0].first;vis[VT[0].second] = true;solve(f[k-1],now_rt);solve(f[k-2],V);}else{int V = VT[0].first,V_ = VT[1].first;vis[VT[0].second] = vis[VT[1].second] = true;solve(f[k-2],V);solve(f[k-2],V_);solve(f[k-3],now_rt);}
}int main()
{init();int n,x,y;scanf("%d",&n);memset(vis,false,sizeof(bool)*(n+1));for(int i = 1;i<n;++i){scanf("%d%d",&x,&y);vt[x].push_back(make_pair(y,i));vt[y].push_back(make_pair(x,i));}solve(n,1);printf("YES\n");return 0;
}

Codeforces Global Round 13 A-E题解相关推荐

  1. Codeforces Global Round 13 E. Fib-tree

    E. Fib-tree 题意: 给你一棵树,问是不是斐波那契树: 这棵树要满足 1.本身的结点个数为斐波那契数. 2.断掉一条边,变成两棵树,两棵树的大小分别都是斐波那契数. 问能不能通过不断断掉一条 ...

  2. Codeforces Global Round 13 C

    C. Pekora and Trampoline 题意:对于数组a,每次出发开始可以选择任意元素作为起始点,然后在数组上移动,落点为i + a[i],直至超出数组范围,每次经过的点的值减一(先移动再减 ...

  3. Codeforces Global Round 24 A~D 题解

    说明 题目链接 就做出AB题,C题想了一个半小时.和我同场竞技的两位选手都做出了C,还是我太菜了555~ A - Doremy's Paint 答案等价于求包含不同元素个数最大的区间,就是全区间. # ...

  4. Codeforces Global Round 1

    Codeforces Global Round 1 题解:The Editorial of the First Codeforces Global Round A:其实mod 2计算一下就行了 B:删 ...

  5. Codeforces Global Round 1 晕阙记

    Codeforces Global Round 1 晕阙记 我做这场比赛的时候晕得要死.做这三道题做太久了,rating涨不起来啊! A 如果愿意的话你可以看做是膜2意义下的运算,写快速幂等各种膜运算 ...

  6. Codeforces Global Round 3

    Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...

  7. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  8. 【Codeforces Global Round 23】B. Rebellion

    Codeforces Global Round 23中B. Rebellion Codeforces比赛记录 文章目录 题目链接: 一.B. Rebellion 题目意思: 上思路: 总结 B. Re ...

  9. Codeforces Global Round 4-D. Prime Graph(伯特兰-切比雪夫定理)

    题目:Codeforces Global Round 4-D. Prime Graph 题意:给出n(顶点的个数),要求所得图满足: 1.无平行边和自环 2.边的总数是个质数 3.每个点的度(也就是点 ...

最新文章

  1. 目标检测—YOLO不难学,你只是不会方法!
  2. 2020 8月 每日花语
  3. 框架 go_go异步任务框架machinery,嗖嗖的[视频]
  4. Unity Mono脚本 加密
  5. Spring Boot(2.1.2.RELEASE) + Spring Cloud (Finchley.RELEASE)搭建服务注册和发现组件Eureka
  6. BZOJ 1599: [Usaco2008 Oct]笨重的石子( 枚举 )
  7. 微信支付金额为0.01分报错,和少一分钱的解决办法
  8. petya勒索病毒解密方法
  9. IBM和DoE推出世界上最快的超级计算机
  10. 3D建模场景怎么做?
  11. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-堆和优先队列(二)
  12. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划
  13. NerveBridge 助力 YF 和 Bingoo 社区实现资产跨链
  14. Scrapped or attached views may not be recycled. isScrap:false isAttached:true异常
  15. 性能魔方七剑下天山之由龙剑:世界级监测、完整且免费
  16. 力扣(674.160)补8.30
  17. 全球与中国网络漫画市场行业市场规模分析及发展规划研究报告2022~2028年
  18. Python实现简易版学生信息管理系统,包含源码及相关实现说明~
  19. 3A和ISP算法概念梳理
  20. java中 先进后出的集合_程序猿的日常——Java中的集合列表

热门文章

  1. java obervable_了解Java的Observable和JavaFX的Observable
  2. 使用 pdb 进行调试
  3. 【小甲鱼Python】文件:因为懂你,所以永恒课后作业
  4. USACO2011Open Silver Running Laps题解
  5. 【恒指早盘分析】9.3恒指早盘分析及最新资讯
  6. 视频教程-【吴刚】iOS原生图标设计原理与绘制技巧标准教程-UI
  7. 获取百度网盘下载真实地址
  8. 还在为PS抠图头疼?试试PPT这个功能,一学就会!
  9. 涨点利器:推荐系统中对双塔模型的各种改造升级(上)
  10. 华为,小米开关控制设置指南总自动弹出