第16届东北四省赛题解
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届东北四省赛题解相关推荐
- 记2020年(第16届)湖南ACM省赛
记2020年(第16届)湖南ACM省赛 写在前面 我很喜欢<龙族>里那个叫路明非的衰小孩.虽然我也不知道为什么要说这个,逃 这个世界有多大,取决于你认识的人,你每认识一个人,世界对你来说就 ...
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解
"科林明伦杯"哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解 萌新又来写题解啦 原题链接 B 减成一 题意:存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多 ...
- 2018东北四省赛 Store The Matrix (矩阵)
2018东北四省赛 Store The Matrix (矩阵) 题目描述 Given a matrix M with r rows and c columns. It is obviously tha ...
- 南京信息工程大学 第二届程序设计大赛团队赛 题解
南京信息工程大学 第二届程序设计大赛团队赛 试题 难度 标题 通过数 提交数 Easy1 A - Offer 145 264 Easy2 B - 负鼠的工资 144 238 Easy3 C - 选队出 ...
- 第16届东北赛区线上比赛斯赛点时间安排+直播链接
§01 比赛B站直播 序号 赛点 赛点直播链接 队伍数 给定时间 腾讯直播通道1 腾讯会议直播通道2 腾讯会议直播通道3 1 大连海事大学 https: live.bilibili.com 87686 ...
- 第十届蓝桥杯省赛题解+代码
文章目录 组队(5分)(暴力) 年号字符(5分) 题解 AC 数列求值(10分)(递推) 题解 AC 数的分解(10分)(暴力) 题解 AC 迷宫(15分)(BFS) 题解 AC代码 特别数的和(15 ...
- 2018年第十届ACM四川省省赛题解(10 / 11)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2018ACM四川省省赛 题目链接:https://www.oj.swust.edu.cn/probl ...
- 2018东北四省赛 Spin A Web 曼哈顿距离最小生成树
莫队的论文,讲的很清晰 问题描述:给定平面N个点,两边相连的代价为曼哈顿距离,求这些点的最小生成树 按一般想法,prime复杂度O(n^2),Kruskal复杂度O(n^2 logn),N很大时,这复 ...
- NUIST第一届程序设计大赛团队赛题解
本次比赛,AK两题为签到题, 文章目录 A. 负鼠的追求者 解法1 解法2 B. Game 解法1 解法2 C. 犯困的负鼠 D. 天天爱跑步 E. 愉快的负鼠 F. Relative Molecul ...
- 东北四省赛H-Skyscraper-线段树的区间合并优化
题目描述: At the main street of Byteland, there will be built n skyscrapers, standing sequentially one n ...
最新文章
- 树上启发式合并问题 ---- D. Tree and Queries[树上启发式合并+树状数组]
- 柱坐标系下的ns方程_笛卡尔坐标系到底是什么?
- Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
- 互联网1分钟 |1221
- linux下修改rm命令防止误删除
- 2020蓝桥杯省赛---java---B---7(分类计数)
- 如何让linux服务器同步互联网时间
- 我的Linux折腾史
- at/cron计划任务初解
- js统计字符串中特定字符出现的个数
- Java基础:Map
- BootStrap之导航navigation
- 浅谈网站建设方案主要内容
- 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.1~9.3】
- 连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册
- 微信服务号、订阅号和企业号的差别(运营和开发两个角度)
- 倍福PLC模拟量输入模块的使用方法
- 云服务器 文件服务,云服务器 和文件服务器
- 有史以来影响世界的颠覆性技术 | 未来的高附加值颠覆性技术产业
- ECCV2020 TIDE: A General Toolbox for Identifying Object Detection Errors