EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)
赛时没打,赛后补的。
D题过的太慢,估计赛时过不了。
A#
每行里隔
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
void solve() {
int n, m, k;
cin >> n >> m >> k;
cout << min(n, k) * min(m, k) << endl;
}
int main() {
int T;
cin >> T;
while(T --) solve();
}
B#
如果
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 7;
int a[N], b[N];
void solve() {
int n;
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++) {
if(a[i] != n) cout << a[i] + 1 << " ";
else cout << 1 << " ";
}
cout << endl;
}
signed main() {
int T;
cin >> T;
while(T --) solve();
}
C#
只需要判断
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 7;
int x[N], y[N];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void solve() {
int n;
n = read();
for(int i = 1; i <= n; i ++) x[i] = read(), y[i] = read();
int xs, ys, xt, yt;
xs = read(), ys = read(), xt = read(), yt = read();
int diss = (xs - xt) * (xs - xt) + (yt - ys) * (yt - ys);
for(int i = 1; i <= n; i ++) {
int now = (x[i] - xt) * (x[i] - xt) + (y[i] - yt) * (y[i] - yt);
if(now <= diss) {
puts("NO");
return;
}
}
puts("YES");
}
signed main() {
int T;
T = read();
while(T --) solve();
}
D1#
对于排列中相邻的两个数
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7;
int vis[N];
int p[N], a[N];
int chk(int x, int y) {
int f = y / 2;
if(f == 1) return 1;
while(x != 1) {
x /= 2;
if(x == f) return 1;
}
return 0;
}
void solve() {
int n, q;
cin >> n >> q;
for(int i = 2; i <= n; i ++) cin >> a[i];
// for(int i = 2; i <= n; i ++) {
// v[i].push_back(a[i]);
// v[a[i]].push_back(a[j]);
// }
for(int i = 1; i <= n; i ++) cin >> p[i];
for(int i = 1; i <= n + 1; i ++) vis[i] = 0;
int nw = 0;
for(int i = 1; i < n; i ++) {
if((p[i + 1] / 2) == p[i] || chk(p[i], p[i + 1])) vis[i] = 1, nw ++;
}
for(int i = 1; i <= q; i ++) {
int x, y;
cin >> x >> y;
if(x > y) swap(x, y);
if(vis[y] && y != n) vis[y] = 0, nw --;
if(vis[y - 1] && y - 1 != 0) vis[y - 1] = 0, nw --;
if(vis[x] && x != n && x + 1 != y) vis[x] = 0, nw --;
if(x != 1 && vis[x - 1]) vis[x - 1] = 0, nw --;
swap(p[y], p[x]);
if(y != n && (p[y + 1] / 2 == p[y] || chk(p[y], p[y + 1]))) vis[y] = 1, nw ++;
if(y != 1 && (p[y] / 2 == p[y - 1] || chk(p[y - 1], p[y]) == 1)) vis[y - 1] = 1, nw ++;
if(x != n && x + 1 != y && (p[x + 1] / 2 == p[x] || chk(p[x], p[x + 1]) == 1)) vis[x] = 1, nw ++;
if(x != 1 && (p[x] / 2 == p[x - 1] || chk(p[x - 1], p[x]) == 1)) vis[x - 1] = 1, nw ++;
if(nw == n - 1) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
int main() {
int T;
cin >> T;
while(T --) solve();
}
D2#
上面算法的时间复杂度是对的,存一下边然后查询的时候倍增跳就可以。
写的有点丑。。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
vector<int> v[N];
int vis[N];
int p[N], a[N];
int chk1(int x, int y) {
if(a[y] == x) return 1;
return 0;
}
int Log[N];
int fa[N][32];
int dep[N];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void dfs(int now,int father)
{
fa[now][0]=father;
dep[now]=dep[father]+1;
for(int i=1;i<=Log[dep[now]];++i)
{
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(int i = 0; i < v[now].size(); i ++)
{
int o = v[now][i];
if(o!=father)
{
dfs(o,now);
}
}
}
inline int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]>dep[y])
{
x=fa[x][Log[dep[x]-dep[y]]-1];
}
if(x==y) return x;
for(int k=Log[dep[x]];k>=0;k--)
{
if(fa[x][k]!=fa[y][k])
{
x=fa[x][k];
y=fa[y][k];
}
}
return fa[x][0];
}
int chk2(int x, int y) {
int fy = a[y];
if(y == 1) return 0;
if(fy == 1) return 1;
if(lca(x, fy) == fy) return 1;
return 0;
}
void solve() {
int n, q;
n = read(), q = read();
for(int i = 1; i <= n; i ++) v[i].clear();
for(int i = 1; i <= n; i ++) Log[i] = Log[i - 1] + (1 << Log[i - 1] == i);
for(int i = 2; i <= n; i ++) a[i] = read();
for(int i = 1; i <= n; i ++) p[i] = read();
for(int i = 2; i <= n; i ++) {
v[i].push_back(a[i]);
v[a[i]].push_back(i);
}
for(int i = 0; i <= n + 1; i ++) vis[i] = 0, dep[i] = 0;
for(int i = 1; i <= n; i ++) {
for(int j = 0; j <= 31; j ++) fa[i][j] = 0;
}
dfs(1, 0);
int nw = 0;
for(int i = 1; i < n; i ++) {
if(chk1(p[i], p[i + 1]) || chk2(p[i], p[i + 1])) vis[i] = 1, nw ++;
}
for(int i = 1; i <= q; i ++) {
int x, y;
x = read(), y = read();
if(x > y) swap(x, y);
if(vis[y] && y != n) vis[y] = 0, nw --;
if(vis[y - 1] && y - 1 != 0) vis[y - 1] = 0, nw --;
if(vis[x] && x != n && x + 1 != y) vis[x] = 0, nw --;
if(x != 1 && vis[x - 1]) vis[x - 1] = 0, nw --;
swap(p[y], p[x]);
if(y != n && (chk1(p[y], p[y + 1]) || chk2(p[y], p[y + 1]))) vis[y] = 1, nw ++;
if(y != 1 && (chk1(p[y - 1], p[y]) || chk2(p[y - 1], p[y]) == 1)) vis[y - 1] = 1, nw ++;
if(x != n && x + 1 != y && (chk1(p[x], p[x + 1]) || chk2(p[x], p[x + 1]) == 1)) vis[x] = 1, nw ++;
if(x != 1 && (chk1(p[x - 1], p[x]) || chk2(p[x - 1], p[x]) == 1)) vis[x - 1] = 1, nw ++;
if(nw == n - 1) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
int main() {
int T;
cin >> T;
while(T --) solve();
}
E#
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步