ACM2023SWJTU寒假选拔赛2不完全题解
- 2022.01.15.更新D | L:数学找规律 | dfs(tle)->贪心模拟
- 2022.01.14.更新L题:统计连通子图数模型,三解:dsu,bfs,dfs
文章目录
- B - 这是一道方块题 [CodeForces 272C](https://vjudge.net/problem/CodeForces-272C/origin)
- [E - 这是一道果果题](https://vjudge.net/problem/CodeForces-743B)[CodeForces - 743B ](https://vjudge.net/problem/CodeForces-743B/origin)
- [G - 这是一道树林题](https://vjudge.net/problem/POJ-3090)[POJ - 3090](https://vjudge.net/problem/POJ-3090/origin)
- [J - 这是一道猫咪题](https://vjudge.net/problem/CodeForces-1070D)[CodeForces - 1070D ](https://vjudge.net/problem/CodeForces-1070D/origin)
- [L - 这是一道玩具题](https://vjudge.net/problem/CodeForces-1209D) [CodeForces - 1209D](https://vjudge.net/problem/CodeForces-1209D/origin)
- [D - 这是一道算数题](https://vjudge.net/problem/Gym-104090D)[Gym - 104090D ](https://vjudge.net/problem/Gym-104090D/origin)
- [K - 这是一道奶茶题](https://vjudge.net/problem/CodeForces-863B) [CodeForces - 863B ](https://vjudge.net/problem/CodeForces-863B/origin)
B - 这是一道方块题 CodeForces 272C
Input
- 列数n
- 每列高度 a 1 , a 1 , . . . , a n {a1,a1,...,an} a1,a1,...,an
- 新方块数m
- 每个方块尺寸 w , h w,h w,h
Output
一共输出 mm 行,每行一个整数,表示方块落下后,下边缘距离游戏场景底部的距离。
Solution
线段树板子,每个方块下落时,落在区间最值 m a x n ( 1 : w ) maxn(1:w) maxn(1:w)位置,这个区间被赋新值 a ( 1 : w ) = m a x n + h a(1:w)=maxn+h a(1:w)=maxn+h
Code
#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=1e5+5;ll a[N];
ll d[N<<2]={0};
ll tag[N<<2]={0};inline int left(int i) { return i<<1; }
inline int right(int i) { return i<<1|1; }
inline int fa(int i) { return i>>1; }inline void push_up(int p)
{ //线段树维护区间最值d[p] = max(d[left(p)] , d[right(p)] );
}
inline void push_down(int l,int r,int p)
{if (!tag[p]) return;int mid = (l + r) >> 1;tag[left(p)] = tag[p];tag[right(p)] = tag[p];d[left(p)] = tag[p];d[right(p)] = tag[p];tag[p] = 0;
}void build(int l,int r,int p)
{if(l==r) {d[p]=a[l];return; }int mid=(l+r)>>1;build(l,mid,left(p));build(mid+1,r,right(p));push_up(p);
}
ll query(int lo,int hi,int l,int r,int p)
{ll res=0;if(lo<=l && r<=hi) return d[p];int mid=(l+r)>>1;push_down(l,r,p);if(lo<=mid) res=max(res,query(lo,hi,l,mid,left(p)));if(hi>mid) res=max(res,query(lo,hi,mid+1,r,right(p)));return res;
}
void update(int lo,int hi,int l,int r,int p,ll elm)
{//区间修改操作位区间赋值if(lo<=l && r<=hi){d[p]=elm;tag[p]=elm;return;}push_down(l,r,p);int mid = (l + r) >> 1;if (lo <= mid) update(lo, hi, l , mid, left(p),elm);if (hi > mid ) update(lo, hi, mid+1, r , right(p),elm);push_up(p);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}build(1,n,1);
// for(int i=1,lvl=0;i<=4*n;lvl++) {for(int j=1;j<=1<<lvl;j++) cout<<d[i++]<<" "; cout<<'\n';}int m;cin>>m;while(m--){int w,h;cin>>w>>h;ll maxn=query(1,w,1,n,1);cout<<maxn<<'\n';update(1,w,1,n,1,maxn+h);}return 0;}
E - 这是一道果果题CodeForces - 743B
公孙英朗给公孙晚霁买了很多果果,公孙晚霁很喜欢,但是为了她的减肥计划,她一天不能吃太多果果。
公孙晚霁的减肥计划由n步生成,生成过程如下:
1 ≤ n ≤ 50 , 1 ≤ k ≤ 2 50 − 1 1\le n \le 50,1\le k \le 2^{50} -1 1≤n≤50,1≤k≤250−1
- 第 2 i 2^i 2i个元素,其值为 i + 1 i+1 i+1
- 第 K K K个元素,由**“复制”**的特性,其值等于第 K − ( 1 < < l g ( K ) ) K-(1<<lg(K)) K−(1<<lg(K))个元素
ll query(ll k)
{ ll bin=0;while( ( 1<<bin ) <= k) bin++; bin--;if(k==1<<bin) return bin+1;else return query(k-(1<<bin));
这个bin是难求而重复的,tle了,如果通过map记忆化递归推lg,mle了
1: 1 3 5 7 9 ,... beg=2^0,del=2^1
2: 2 6 10 ,... beg=2^1,del=2^2
3: 4 12 20 ,... beg=2^2,del=2^3
4: 8 ,... beg=2^3,del=2^4
ll querr(ll n,ll k)
{for(ll i=1;i<=n+1;i++){ll tmp=k-(1ll*1<<(i-1));if(tmp%(1ll*1<<(i))==0) {return i;}}
}
G - 这是一道树林题POJ - 3090
公孙英朗从 (0, 0) 的位置转头,公孙晚霁就藏在了这些树后边,因为树之间有遮挡关系,公孙英朗只能看见一部分树,请帮公孙晚霁计算一下,公孙英朗能看见多少树。
小树林中每一颗树都看做平面直角坐标系下的一个个点,从 (0, 0) 到 (n, n)都种满了树。当 n=5时,小树林的样子如下图所示:
当某点与 (0, 0的连线上有其它点时,该点会被连线上的点遮挡,公孙英朗就看不见这棵树了,如 (4, 2)这棵树会被 (2, 1)这棵树挡住,公孙英朗看不见位于 (4, 2) 的这课树。
样例数T 1 ≤ T ≤ 1 e 3 1 \le T \le 1e3 1≤T≤1e3
矩阵规模n 1 ≤ n ≤ 1 e 3 1 \le n \le 1e3 1≤n≤1e3
用map记录每一对 ( i , j ) (i,j) (i,j)的斜率,打表也能过,不优化是 O ( T n n l o g n ) O(Tnnlogn) O(Tnnlogn),T了
考查右下角三角形内任意数对 ( x , y ) ( 1 ≤ x ≤ y ) (x,y)(1\le x \le y) (x,y)(1≤x≤y)
反之,当 g c d ( x , y ) = = 1 gcd(x,y)==1 gcd(x,y)==1时,即k不可再约,这个元素不重复
∴ a n s = 3 + 2 ∗ ∑ 2 n p h i [ i ] ans=3+2*\sum_2^n phi[i] ans=3+2∗∑2nphi[i]
void phis()
{phi[1]=1;for(int i=2;i<=N;i++){if(!vis[i]){prime[cnt++]=i;phi[i]=i-1;}for(int j=0;j<cnt && i*prime[j]<=N;j++){vis[prime[j]*i]=1;if(i%prime[j]==0){phi[i*prime[j]]=prime[j] * phi[i];break;}else phi[i*prime[j]]=(prime[j] -1 ) *phi[i]; }}
}
void solve(int n)
{ll ans=0;for(int i=2;i<=n;i++) ans+=phi[i];ans=ans*2+3;cout<<ans<<"\n";
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);phis();int T;cin>>T;for(int i=1;i<=T;i++){int n;cin>>n;cout<<i<<" "<<n<<" ";solve(n);}return 0;}
J - 这是一道猫咪题CodeForces - 1070D
公孙晚霁领养了一只学校里的流浪猫咪,并将给猫咪剪指甲这个工作交给了公孙英朗,让猫咪做公孙英朗的猫主子。
第二行包含 nn 个整数 a_i ( 0 ≤ a i ≤ 1 0 9 ) (0 \le a_i \le 10^9) (0≤ai≤109),表示第 i个月猫咪指甲的增长长度
#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=1e5+5;int vis[N]={0};
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;cin>>n>>m;int cnt=0; for(int i=1;i<=m;i++){int x,y;cin>>x>>y;if(vis[x] && vis[y]){cout<<i<<' ';cnt++;}vis[x]=1;vis[y]=1;}cout<<cnt;return 0;}
L - 这是一道玩具题 CodeForces - 1209D
公孙晚霁和公孙英朗打算去孤儿院做志愿活动。第一次去之前,公孙晚霁准备了 nn 种玩具各一个,送给 mm 小朋友们玩。在这 nn 种玩具中,每个小朋友都有2种喜欢的玩具。分玩具的步骤为:
已知每个小朋友喜欢的玩具的种类。请帮公孙英朗计算伤心的小朋友最少有几个?
每个小朋友喜欢的玩具 x i , y i xi,yi xi,yi
而题面所述的图可能是不连通的,求其连通分量数目即可。有bfs,dfs,dsu三种解法
A N S = M − ( n − c o u n t ( ) ) ANS=M-(n-count()) ANS=M−(n−count())
边集数组存图,用并查集来维护连通分量:将连通的点放在同一个集合(共祖先)里,统计dsu映射中祖先的个数即可知集合的个数
#include<bits/stdc++.h>
using namespace std;
using ll=long long;// 连通分量问题:将玩具建模为点,将child建模为两点之间的边:每入一条边,其两端的点被vis。
//在一张n个点(玩具)m条边(child)的连通图中,通过适当的(拓扑序)读边,可以满足N-1个child。(生成树)
//考查本题所建模的图,可以是不连通而有若干连通分量的,用并查集来维护连通分量数。
const int N=1e5+5,M=2*N;
struct Edge{int from,to;
}edge[M];
int cnt_e=0;
void add(int u,int v)
{edge[++cnt_e].from=u;edge[cnt_e].to=v;
}
int n,m;
//dsu
int dsu[N]={0};
int find(int x) { return dsu[x]==x?x:dsu[x]=find(dsu[x]);}
void unite(int lhs,int rhs)
{dsu[find(rhs)]=find(lhs);
}int vis[N];
int count()
{int cnt=0;for(int i=1;i<=n;i++){if(!vis[find(i)]){vis[find(i)]=1;cnt++;}}return cnt;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++) dsu[i]=i;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);unite(u,v);}cout<<max(0,m-(n-count()));return 0;}
#include<bits/stdc++.h>
using namespace std;
using ll=long long;// 连通分量问题:将玩具建模为点,将child建模为两点之间的边:每入一条边,其两端的点被vis。
//在一张n个点(玩具)m条边(child)的连通图中,通过适当的(拓扑序)读边,可以满足N-1个child。(生成树)
//考查本题所建模的图,可以是不连通而有若干连通分量的,用并查集来维护连通分量数。
const int N=1e5+5,M=2*N;
struct Edge{int to, nxt;
}edge[M];
int cnt_e=0;
int head[N]={0};
void add(int u,int v)
{edge[++cnt_e].to=v;edge[cnt_e].nxt=head[u];head[u]=cnt_e;
}
int n,m;
bool vis[N]={0};
int cnt=0;
void bfs(int beg)
{if(!vis[beg]) cnt++;queue<int> que;que.push(beg);while(!que.empty()){int u=que.front();que.pop();if(!vis[u]){vis[u]=1;for(int j=head[u];j;j=edge[j].nxt){int to=edge[j].to;if(!vis[to]){que.push(to);}}}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}for(int i=1;i<=n;i++) bfs(i);cout<<max(0,m-(n-cnt));return 0;}
void dfs(int u)
{if(vis[u]) return;vis[u]=1;for(int j=head[u];j;j=edge[j].nxt){int to=edge[j].to;if(!vis[to]) dfs(to);}
}
for(int i=1;i<=n;i++)
{if(!vis[i]){cnt++;dfs(i);}
}
D - 这是一道算数题Gym - 104090D
公孙英朗的算数技能太差了,公孙晚霁决定给公孙英朗进行算数训练。
公孙晚霁准备了nn个整数,公孙英朗需要按顺序完成以下操作:
**打表看看每轮结果,最终结果会固定。**而while(1)等其固定会tle
再找找规律:
K = s u m / ( n + 1 ) a 1 = 2 K , a i = K K=sum/(n+1)\\ a1=2K,ai=K K=sum/(n+1)a1=2K,ai=K
3. 对于“将第i个数的一半搬运给第i+1个数”这个回圈的操作,2:1:1:1:1...
这个比例满足稳定的需求。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=1e5+5;
int n;
double a[N];
int main()
{// ios::sync_with_stdio(false);
// cin.tie(0);cout.tie(0);double sum=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}double k=sum/(n+1);printf("%f ",2*k);for(int i=2;i<=n;i++) printf("%f ",k);
// puts("");
// double last=-1;
// while(1)
// {//
// for(int i=1;i<n;i++)
// {// a[i]/=2;
// a[i+1]+=a[i];
// }
// a[n]/=2;
// a[1]+=a[n];
// if(last==a[1])
// {// for(int i=1;i<=n;i++)printf("%f ",a[i]);
// return 0;
// }
// last=a[1];
//
// }return 0;}
K - 这是一道奶茶题 CodeForces - 863B
公孙英朗打算请大家喝奶茶,于是他和公孙晚霁两人到奶茶店,下单了 2 n 2n 2n 杯不同的饮品。
当使用两杯装包装时,公孙晚霁发现因为每杯重量不同,这些包装会产生不平衡值,若这两杯的重量分别为 u u u和 v v v,则不平衡值为$ abs(u-v)$。一杯装包装不产生不平衡值。
拎着奶茶的公孙英朗想让不平衡值的和尽可能小,请你求出该最小值。
n , 1 ≤ n ≤ 50 n,1\le n\le 50 n,1≤n≤50
奶茶重量 { a 0 , a 1 , . . . , a 2 n } \{a0,a1,...,a2n\} {a0,a1,...,a2n}
DFS θ ( 2 n ) n − 1 \theta(2n)^{n-1} θ(2n)n−1,TLE
#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N=55;
int n;
int a[2*N];struct Edge{int from,to,val;
}edge[2*N];
int cnt_e=0;
void add(int u,int v,int val)
{edge[cnt_e].from=u;edge[cnt_e].to=v;edge[cnt_e++].val=val;
}
bool cmp(const Edge& lhs,const Edge& rhs) {return lhs.val<rhs.val;}bool vis[N]={0};int ans=0x7f7f7f7f;
vector<Edge> vec;
void dfs(int lvl,int sum)
{if(lvl>n-1){cout<<sum<<'\n';for(auto it:vec) cout<<it.from<<" "<<it.to<<" "<<it.val<<'\n'; cout<<'\n';ans=min(ans,sum);return;}for(int i=0;i<cnt_e;i++){if(!vis[edge[i].from] && !vis[edge[i].to]){vis[edge[i].from]=1;vis[edge[i].to] =1;vec.push_back(edge[i]);dfs(lvl+1,sum+edge[i].val);vis[edge[i].from]=0;vis[edge[i].to] =0;vec.pop_back();}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=2*n;i++) cin>>a[i];sort(a+1,a+2*n+1);for(int i=1;i<=2*n-1;i++){add(i,i+1,a[i+1]-a[i]);}sort(edge,edge+cnt_e,cmp); dfs(1,0);cout<<ans;return 0;}
删去两个点将原序列分为三个区间,需要这三个区间长度均为偶数,才符合依旧相邻的规则
,eg { 1 , 2 , _ , 4 , 5 , _ , 7 , 8 } \{1,2,\_,4,5,\_,7,8\} {1,2,_,4,5,_,7,8}
删点策略为:第一个点必为奇数,第二个点与第一个点间隔偶数距离,然后简单读相邻元素差即可。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;int n;
const int N=55;
int a[2*N];
int b[2*N];
bool vis[2*N]={0};
int ans=0x7f7f7f7f;void solve()
{int sum=0;for(int i=1;i<=2*n;){if(vis[i]) i++;if(vis[i]) i++;sum+=a[i+1]-a[i];i+=2;}ans=min(ans,sum);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=2*n;i++) cin>>a[i];sort(a+1,a+2*n+1);for(int i=1;i<=2*n;i+=2){vis[i]=1;for(int j=i+1;j<=2*n;j+=2){vis[j]=1;solve();vis[j]=0;}vis[i]=0;}cout<<ans;return 0;}
ACM2023SWJTU寒假选拔赛2不完全题解相关推荐
- ICPC训练联盟2021寒假冬令营(2)(部分题解)
ICPC训练联盟2021寒假冬令营(2)(部分题解) B - Diplomatic License In an effort to minimize the expenses for foreign ...
- 郑州轻工业大学2019学年第十一届蓝桥杯校内选拔赛Java B组 题解
@郑州轻工业大学蓝桥杯校内选拔赛 题解 笔者自述 前些天参加学校的蓝桥杯校内选拔赛,做完之后感觉题大部分不是很难,就把考场上的代码保存下来,给大家做个简单的注释,和解析.因为后来参加会议,比较忙,所以 ...
- 2020ICPC·小米 网络选拔赛第一场 全部题解
整理的算法模板合集: ACM模板 目录 题目传送门 题目总体情况 A.Intelligent Warehouse B.Intelligent Robot C.Smart Browser D.Route ...
- 2022—SWJTU-寒假ACM校队选拔赛第三场-题解
A - A 算法分析 要想让 只能是发生在进位的时候,因此每逢尾数为 9 时就会对答案产生贡献. AC code #include<bits/stdc++.h> using namespa ...
- NEFU 2021大一寒假集训总结赛 全题解
比赛链接:这里 OP 肝了两个半小时A,没过-- sl大佬也写题解了 A SET 最大公约数 感谢老师的标程~ 思路 任选两数 a,b 做 2*a-b 运算,可以理解成 a + a - b ,即 a ...
- 牛客寒假算法基础集训营 题解
A. 处女座与线性代数 题目描述 众所周知,处女座是数学大师.他定义了k维空间里的处女座点. 对于给出的k维度空间上N个点,处女座点满足: 对于这个点P和空间里任意其他两个点P1P1.P2P2,有do ...
- ZAFU_2021_2_17_2021寒假个人赛第四场题解
A题 原题链接:https://codeforces.com/problemset/problem/1296/A 相关tag:简单思维 我们每次操作可以把数组中的一个数变为另一个数,那么如果这两个数同 ...
- 2020寒假集训排位赛 Cow Gymnastics 题解(思维)
专题链接:https://codeforces.com/group/5yyKg9gx7m/contest/269717/problem/A 思路 这道题乍一看没什么思路,但经过观察可以发现,如果两头牛 ...
- 黑龙江农垦科技职业学院喜迎寒假多校联赛2——题解
J题 比赛开始了清楚姐姐喊了一句:签到了签到了 选手们纷纷开始签到,现在给出n个数字代表选手们签到所用秒数 请给出第几个选手最先签到.同秒数先输入的算快. (不会吧 不会吧 不会有人用牛客不知道清楚姐 ...
最新文章
- 带android小绿人的屏保相册,盘点:那些年我们追过的Android
- angular2 表单
- CF 6 A. Triangle
- 2021春季每日一题【week4 完结】
- python中beautifulsoup是什么库_BeautifulSoup库详解(个人整理)
- Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
- 第一章 计算机系统概述 1.1 计算机发展史 [计算机组成原理笔记]
- Page_PreInit在网页传值的应用
- 上传自定义日志_ZKEYS系统重磅更新,新增后台数据库备份、主控运行日志管理等新功能!...
- Python接口自动化之接口依赖
- Ruby eventmachine install
- 计算机会计技术特点,会计电算化的特点
- Lucene 如何热备份
- C语言:一种高效、易学的编程语言
- android暗水印技术,基于Android的隐藏数字水印技术的研究与实现
- Python使用quote、unquote、urlencode、urldecode对url编码解码
- 如何看懂EMC测试报告
- python如何在图片上添加文字_Python在图片中添加文字的两种方法
- ElasticSearch Docker 部署实例
- spring框架的优势
热门文章
- 地下城与勇士(DNF)格兰之森副本(幽暗密林、幽暗密林深处、雷鸣废墟、猛毒雷鸣废墟、冰霜幽暗密林、格拉卡、烈焰格拉卡、暗黑雷鸣废墟)(童年的回忆)
- 51单片机LCD显示温度与串口接受温度
- Ubuntu14.04上安装calamari
- oracle图书操作、sql语句查询+授权、视图、索引、表操作
- 元·认知·人机环·渔樵耕读
- ClickME 隐私策略
- 2021年最新最全Flink系列教程_Flink快速入门(概述,安装部署)(一)(JianYi收藏)
- k8s使用ipvs模式
- 单身狗福音:钢铁直男也可以用AI歌曲俘获女友芳心!
- 详细地址通过正则抽取省市区