2022东北四省赛题解

A. Encryption

SA+二分

B. Capital Program

贪心+树形+二分

在一棵树上选择k个相连的点,要求最小化离这k个城市最远的城市的距离

首先我们贪心的想,当这棵树的根节点是直径中点的时候,一定有其他所有城市离根开始延申的城市的距离最小。

然后就是做一遍树型DP求出来每个点往下延申的最长深度,接着二分答案最小化的城市距离,一遍dfs,如果当前点到往下延伸的点的距离大于k意味着当前点也需要被选上,check最终选的点的数量是否<=k即可

const int N=200010,M=N*2,mod=1e9+7;
vector<int> edge[N];
int n,m,dep[N],color[N],depth,f[N],poi=1;void dfs(int u,int pre){dep[u]=dep[pre]+1;for(auto v:edge[u]){if(v==pre) continue;dfs(v, u);}
}bool find(int u,int pre, int depth){color[u]=1;for(auto v:edge[u]){if(v==pre) continue;if(find(v,u,depth)) return true;}if(dep[u]==depth) return true;else {color[u]=0;return false;}
}void dfs_init(int u,int pre){f[u]=max(dep[u],f[u]);for(auto v:edge[u]){if(v==pre) continue;dfs_init(v, u);f[u]=max(f[u], f[v]);}
}bool check(int x){if(depth<x) return 1;int ans=1;for(int i=1;i<=n;++i){if(i==poi) continue;if(f[i]-dep[i]>=x) ans++;}return ans<=m;
}void solve(){n=read(),m=read();rep(i,1,n-1){int u=read(),v=read();edge[u].push_back(v);edge[v].push_back(u);}dfs(1, 0);poi=1;for(int i=1;i<=n;++i){if(dep[i]>dep[poi]) poi=i;}memset(dep,0,sizeof dep);dfs(poi, 0);depth=0;for(int i=1;i<=n;++i){depth=max(depth, dep[i]);}find(poi,0,depth);for(int i=1;i<=n;++i){if(color[i]&&dep[i]==(1+depth)/2) poi=i;}memset(dep,0,sizeof dep);dfs(poi, 0);dfs_init(poi,0);int l=0,r=depth;while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}print(l);
}

C. Segment Tree

找规律题。手动模拟下线段树叶子节点的增加情况可以发现:

void solve(){LL ans=0;n=read(),q=read();q=min(q, n);int h = (int)(log2(n)), k = (int)(log2(q));if (q <= n-(1ll<<h)) {ans = (1 << (k + 1)) - 1 + (h - k + 1) * q;} else if (q <= (1 << h)) {ans=(1ll<<(k + 1))-(1ll<<h)-1+(h-k)*q+n;} else {ans=n+q-1;}print(ans);
}

D. Game

随机化/莫队

我们很容易发现如果[l,r]中出现的个数都是偶数个则先手必败。正常做可以使用莫队,但是VP的时候我们是用随机化过的,因为给每个数随机出一个比较大的数可以防止出现abc=0的情况。

const int N=200010,M=N*2,mod=1e9+7;
int n,m,q,a[N],s[N],rd[N];void solve(){n=read(),q=read();for(int i=1;i<=100000;++i) rd[i]=rand();rep(i,1,n) a[i]=read();rep(i,1,n) s[i]=s[i-1]^rd[a[i]];while(q--){int l=read(),r=read();int x=s[r]^s[l-1];if((x)==0) puts("Bob");else puts("Alice");}
}

E. Plus

签到+诈骗+打表

VP的时候先猜了一个结论:这个解很少,然后打了一个表发现只有p=2,q=3为解。

#define int LL
const int N=200010,M=N*2,mod=1e9+7;
int n,m,k,a[N];
string p;void solve(){n=read();if(n<3) print(0);else{print(1);printf("2 3\n");}
}

G. Hot Water Pipe

这是一道复杂度分析题,通过分析每一次操作我们可以发现这道题完全可以暴力。我们只需要暴力维护每一段即可。

#define int LL
const int N=1000010,M=N*2,mod=1e9+7;
int n,m,k,a[N];
int tmn,tmx;
deque<pair<int,int>> q;int get(int x){int len=(tmx-tmn+1);x-=tmn;return (x%len+len)%len+tmn;
}void solve(){n=read(),m=read(),tmn=read(),tmx=read();rep(i,1,n) {a[i]=read();q.push_front({a[i], 1});}int delta=0;while(m--){LL ans =0 ;int t=read(),k=read();delta += t;int now = 0;while(q.size()){if(now == k) break;auto u=q.front(); q.pop_front();if(u.y+now<=k){ans += 1ll*u.y*get(u.x-delta);now += u.y ;}else{ans += 1ll*(k-now)*get(u.x-delta);u.y -= k-now;q.push_front(u);now = k;}}if(now!=k) ans += 1ll*(k-now)*tmx;q.push_back({get(tmx+delta), min(n,k)});print(ans);}
}

I. Generator

签到题

#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
double a[1000000];
const double t = 0.57721566490153287;
int main() {int n;cin >> n;double ans = 1;if (n <= 1000000) {for (int i = 2; i <= n; i++) {ans += 1.0 / (i - 1);}} else {ans = 1 + log(n) + 1.0 / (2 * n) + t;}cout << fixed << setprecision(10) << ans << '\n';return 0;
}

K.Maze

分层图BFS,签到题

#define int LL
const int N=110,M=N*2,mod=1e9+7;
int n,m,k;
struct Node{int x,y,z,p,o;
};
Node q[N*N*N];
int hh,tt;
char str[N];
int g[N][N],st[N][N][N][4]; //0表示向下 1表示向右 2表示向上 3表示向左void solve(){n=read(),m=read();rep(i,1,n){scanf("%s",str+1);rep(j,1,n){g[i][j]=(str[j]=='.');}}int ans=0x3f3f3f3f;hh=0,tt=-1;if(g[1][2]) q[++tt]={1,2,1,1,1},st[1][1][1][1]=1;if(g[2][1]) q[++tt]={2,1,1,1,0},st[2][1][1][0]=1;while(hh<=tt){auto u=q[hh++];int x=u.x,y=u.y,z=u.z,p=u.p,o=u.o;if(x==n&&y==n) {ans=min(ans,z);}for(int i=0;i<4;++i){int xx=x+mov[i][0],yy=y+mov[i][1];if(xx<1||xx>n||yy<1||yy>n||g[xx][yy]==0) continue;if(i==o){if(p+1>m||st[xx][yy][p+1][o]) continue;st[xx][yy][p+1][o]=1;q[++tt]={xx,yy,z+1,p+1,o};}else{if(st[xx][yy][1][i]) continue;st[xx][yy][1][i]=1;q[++tt]={xx,yy,z+1,1,i};}}}if(ans==0x3f3f3f3f) print(-1);else print(ans);rep(i,1,n) rep(j,1,n) rep(k,1,m) st[i][j][k][0]=st[i][j][k][1]=st[i][j][k][2]=st[i][j][k][3]=0;
}

L. Polygon

签到题

#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 2e5 + 10;
int n;
int a[maxn];
int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n;int sum = 0;for (int i = 1; i <= n; i++) {cin >> a[i];sum += a[i];}int mx = *max_element(a + 1, a + 1 + n);if (sum - mx > mx) {cout << "YES\n";} else {cout << "NO\n";}return 0;
}

第16届东北四省赛题解相关推荐

  1. 记2020年(第16届)湖南ACM省赛

    记2020年(第16届)湖南ACM省赛 写在前面 我很喜欢<龙族>里那个叫路明非的衰小孩.虽然我也不知道为什么要说这个,逃 这个世界有多大,取决于你认识的人,你每认识一个人,世界对你来说就 ...

  2. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解

    "科林明伦杯"哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解 萌新又来写题解啦 原题链接 B 减成一 题意:存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多 ...

  3. 2018东北四省赛 Store The Matrix (矩阵)

    2018东北四省赛 Store The Matrix (矩阵) 题目描述 Given a matrix M with r rows and c columns. It is obviously tha ...

  4. 南京信息工程大学 第二届程序设计大赛团队赛 题解

    南京信息工程大学 第二届程序设计大赛团队赛 试题 难度 标题 通过数 提交数 Easy1 A - Offer 145 264 Easy2 B - 负鼠的工资 144 238 Easy3 C - 选队出 ...

  5. 第16届东北赛区线上比赛斯赛点时间安排+直播链接

    §01 比赛B站直播 序号 赛点 赛点直播链接 队伍数 给定时间 腾讯直播通道1 腾讯会议直播通道2 腾讯会议直播通道3 1 大连海事大学 https: live.bilibili.com 87686 ...

  6. 第十届蓝桥杯省赛题解+代码

    文章目录 组队(5分)(暴力) 年号字符(5分) 题解 AC 数列求值(10分)(递推) 题解 AC 数的分解(10分)(暴力) 题解 AC 迷宫(15分)(BFS) 题解 AC代码 特别数的和(15 ...

  7. 2018年第十届ACM四川省省赛题解(10 / 11)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2018ACM四川省省赛 题目链接:https://www.oj.swust.edu.cn/probl ...

  8. 2018东北四省赛 Spin A Web 曼哈顿距离最小生成树

    莫队的论文,讲的很清晰 问题描述:给定平面N个点,两边相连的代价为曼哈顿距离,求这些点的最小生成树 按一般想法,prime复杂度O(n^2),Kruskal复杂度O(n^2 logn),N很大时,这复 ...

  9. NUIST第一届程序设计大赛团队赛题解

    本次比赛,AK两题为签到题, 文章目录 A. 负鼠的追求者 解法1 解法2 B. Game 解法1 解法2 C. 犯困的负鼠 D. 天天爱跑步 E. 愉快的负鼠 F. Relative Molecul ...

  10. 东北四省赛H-Skyscraper-线段树的区间合并优化

    题目描述: At the main street of Byteland, there will be built n skyscrapers, standing sequentially one n ...

最新文章

  1. 树上启发式合并问题 ---- D. Tree and Queries[树上启发式合并+树状数组]
  2. 柱坐标系下的ns方程_笛卡尔坐标系到底是什么?
  3. Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
  4. 互联网1分钟 |1221
  5. linux下修改rm命令防止误删除
  6. 2020蓝桥杯省赛---java---B---7(分类计数)
  7. 如何让linux服务器同步互联网时间
  8. 我的Linux折腾史
  9. at/cron计划任务初解
  10. js统计字符串中特定字符出现的个数
  11. Java基础:Map
  12. BootStrap之导航navigation
  13. 浅谈网站建设方案主要内容
  14. 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.1~9.3】
  15. 连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册
  16. 微信服务号、订阅号和企业号的差别(运营和开发两个角度)
  17. 倍福PLC模拟量输入模块的使用方法
  18. 云服务器 文件服务,云服务器 和文件服务器
  19. 有史以来影响世界的颠覆性技术 | 未来的高附加值颠覆性技术产业
  20. ECCV2020 TIDE: A General Toolbox for Identifying Object Detection Errors

热门文章

  1. 如何批量实现通过MP3标题重命名文件名
  2. mysql如何上传音频文件_如何上传本地音乐获取MP3外链(欢迎分享和转载)
  3. 关于神舟笔记本电脑结束睡眠后耳机没声音的解决方法
  4. excel拆分单元格内容_Excel办公软件教程
  5. 企业即时通讯行业评测——imo VS RTX
  6. 安卓桌面软件_抖音上火爆的动态桌面壁纸(视频桌面),狂拽酷炫吊炸天!
  7. 非浙A号牌迁入为浙A区域号牌条件与流程
  8. java-阴历日期和阳历日期互相转换
  9. git add之后,如何撤销git add
  10. 想要体验《失控玩家》里Guy的视角,299美元还远远不够