EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2) 补题记录(A~D1,E)
A
容易发现答案为
#include<bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=1000100;
int a[N];
signed main(){
int T;
cin>>T;
while(T--){
int n,m,k;cin>>n>>m>>k;
n=min(n,k),m=min(m,k);
cout<<n*m<<'\n';
}
return 0;
} // main
B
容易发现 Alice 如果想要赢必然一直从左或者右端口开始删除元素。若对于 Alice 两种选择方案 Bob 都能够获胜那么 Bob 就必胜,反之 Bob 必败。用一个双端队列维护 Bob 当前所有的元素即可,时间复杂度为
#include<bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=1000100;
int a[N],b[N];
signed main(){
int T;
cin>>T;
while(T--){
int n;cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=1;i<=n;++i)cin>>b[i];
deque<int>t;for(int i=1;i<=n;++i)t.push_back(b[i]);
int ok=1;
for(int i=1;i<=n;++i){
if(a[i]==t.front())t.pop_front();
else if(a[i]==t.back())t.pop_back();
else{ok=0;break;}
}
reverse(a+1,a+n+1);
for(int i=1;i<=n;++i)t.push_back(b[i]);
for(int i=1;i<=n;++i){
if(a[i]==t.front())t.pop_front();
else if(a[i]==t.back())t.pop_back();
else{ok=0;break;}
}
if(!ok)cout<<"Alice\n";
else cout<<"Bob\n";
}
return 0;
} // main
C
谢谢你 C。考虑对于经过两点的直线
容易发现若 C –> D 的路径上 B 点和 A 点所对应的圆产生交点,则连接
于是问题就十分简单了,只需要判断到达终点的时候是否有一个圆已经将终点覆盖即可。时间复杂度为
#include<bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=331080;
int x[N],y[N];
int get(int a,int b,int c,int d){
return (c-a)*(c-a)+(d-b)*(d-b);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int T;
cin>>T;
while(T--){
int n;cin>>n;
for(int i=1;i<=n;++i)cin>>x[i]>>y[i];
int xs,ys,xt,yt;
cin>>xs>>ys>>xt>>yt;
int ok=1;
int len=get(xs,ys,xt,yt);
for(int i=1;i<=n;++i){
int len1=get(x[i],y[i],xt,yt);;
if(len1<=len){ok=0;break;}
}
if(ok)cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
} // main
/*
1
1
999999998 1000000000
999999999 999999999 1 1
*/
D1
考虑维护 代码还没调出来。
E
这题还挺有意思的。考虑挖掘题目所求答案的性质,可以发现对于两个相邻的位置
时间复杂度为
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=500100;
int a[N],b[N],res[N];
signed main(){
int T;cin>>T;
while(T--){
int n;cin>>n;
for(int i=1;i<=n;++i)cin>>a[i]>>b[i];
deque<int> stk;
int remain=0;
for(int i=1;i<=n;++i){
while(stk.size()){
if(b[i]!=b[stk.back()]){
if(a[i]>a[stk.back()])remain=a[stk.back()],stk.pop_back();
else break;
}else{
a[i]+=a[stk.back()]-remain;
stk.pop_back();
remain=0;
}
}
stk.push_back(i);
cout<<a[stk.front()]<<' ';
}
cout<<'\n';
}
return 0;
}
本文来自博客园,作者:yhbqwq,转载请注明原文链接:https://www.cnblogs.com/yhbqwq/p/18354484,谢谢QwQ
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)