2025 成大賽心得文

人生最後一次成大賽

Sun Apr 13 2025
818 words · 10 minutes

A. PaParty

import sys
input=sys.stdin.readline
MOD=10**9+7
n,k=map(int,input().split())
A=[0]*k
LEN=[0]*k
for i in range(k):
a,l,r=map(int,input().split())
A[i]=a
LEN[i]=r- l+1
ORD=list(range(k))
ORD.sort(key=lambda i: A[i])
SUF=[0]*(k+1)
for t in range(k-1,-1,-1):
i=ORD[t]
SUF[t]=(SUF[t+1]+A[i]*LEN[i])%MOD
q=int(input())
ans=0
for _ in range(q):
S=int(input())
l,r=0,k
while l<r:
m=(l+r)//2
if A[ORD[m]]>S:
r= m
else:
l=m+1
ans=(ans+SUF[l])%MOD
print(ans)

B. 排序

沒人解

C. 神奇畫筆

#pragma GCC optimize("Ofast","unroll-loops","no-stack-protector")
#include <iostream>
#include <utility>
#define f first
#define s second
using namespace std;
pair<int, int> arr[(int)1E7 + 7];
long long ans, cnt, tmp;
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int N, l, r; cin >> N;
for(int i = 0; i < N; i++) {
cin >> l >> r;
arr[l].f++;
arr[r].s++;
}
for(int i = 0; i < (int)1E7; i++) {
tmp = cnt;
if (arr[i].f) cnt += arr[i].f;
if (arr[i].s) cnt -= arr[i].s;
ans += cnt * cnt;
}
cout << ans << '\n';
return 0;
}

D. 領主進軍

根本還沒看

E. Minimum Spanning Tree

根本還沒看

F. 風水 Feng Shui

image

  • BFS寫法,會TLE💀
#pragma GCC optimize("Ofast","unroll-loops","no-stack-protector")
#include <iostream>
#include <queue>
#include <utility>
#define f first
#define s second
using namespace std;
queue< pair<int, int> > qu;
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1}, maxa, tmpa;
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int n, m; cin >> n >> m;
int grid[n+2][m+2][2], d = 1;
char c;
for(int i = 1; i <= n; i++) {
for(int j = 1;j <= m; j++) {
cin >> c;
if (c == '#') grid[i][j][0] = 0;
else grid[i][j][0] = 1;
grid[i][j][1] = 0, grid[0][j][0] = 0, grid[n+1][j][0] = 0, grid[0][j][1] = 0, grid[n+1][j][1] = 0;
}
grid[i][0][0] = 0, grid[i][m+1][0] = 0, grid[i][0][1] = 0, grid[i][m+1][1] = 0;
}
maxa = 0, tmpa = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if (grid[i][j][0] && grid[i][j][1] != d) {
tmpa++;
grid[i][j][1] = d;
for(int k = 0; k < 4; k++) {
if (grid[i + dx[k]][j + dy[k]][0] && grid[i + dx[k]][j + dy[k]][1] != d) {
qu.push({i + dx[k], j + dy[k]});
}
}
//bfs
while(!qu.empty()) {
auto tmpP = qu.front(); qu.pop();
if (grid[tmpP.f][tmpP.s][1] == d) continue;
grid[tmpP.f][tmpP.s][1] = d;
tmpa++;
for(int k = 0; k < 4; k++) {
if (grid[tmpP.f + dx[k]][tmpP.s + dy[k]][0] && grid[tmpP.f + dx[k]][tmpP.s + dy[k]][1] == (d ^ 1)) {
qu.push({tmpP.f + dx[k], tmpP.s + dy[k]});
}
}
}
maxa = max(maxa, tmpa), tmpa = 0;
}
}
}
int q, x, y; cin >> q;
while(q--) {
d++, tmpa = 1;
cin >> x >> y;
x++, y++;
grid[x][y][0] = 1, grid[x][y][1] = d;
for(int i = 0; i < 4; i++) {
if (grid[x + dx[i]][y + dy[i]][0] && grid[x + dx[i]][y + dy[i]][1] != d) {
qu.push({x + dx[i], y + dy[i]});
}
}
while(!qu.empty()) {
auto tmpP = qu.front(); qu.pop();
if (grid[tmpP.f][tmpP.s][1] == d) continue;
grid[tmpP.f][tmpP.s][1] = d;
tmpa++;
for(int k = 0; k < 4; k++) {
if (grid[tmpP.f + dx[k]][tmpP.s + dy[k]][0] && grid[tmpP.f + dx[k]][tmpP.s + dy[k]][1] != d) {
qu.push({tmpP.f + dx[k], tmpP.s + dy[k]});
}
}
}
maxa = max(maxa, tmpa);
cout << maxa << '\n';
}
return 0;
}
  • DFS寫法(會TLE💀)
import sys
input=sys.stdin.readline
n,m=map(int,input().split())
grid=[list(input().strip()) for _ in range(n)]
def dfs(i,j,visited):
stack=[(i,j)]
area=0
while stack:
x,y=stack.pop()
if x<0 or x>=n or y<0 or y>=m:
continue
if visited[x][y] or grid[x][y] != '@':
continue
visited[x][y]=True
area += 1
stack.append((x+1,y))
stack.append((x-1,y))
stack.append((x,y+1))
stack.append((x,y-1))
return area
q=int(input())
for _ in range(q):
x,y=map(int,input().split())
if grid[x][y] !='@':
grid[x][y]='@'
visited=[[False] * m for _ in range(n)]
max_area=0
for i in range(n):
for j in range(m):
if grid[i][j]=='@' and not visited[i][j]:
max_area=max(max_area,dfs(i,j,visited))
print(max_area)
  • DSU
import sys
input=sys.stdin.readline
def find(x):
if p[x] != x:
p[x]=find(p[x])
return p[x]
def union(x,y):
rx=find(x)
ry=find(y)
if rx==ry:
return sz[rx]
if sz[rx]<sz[ry]:
rx,ry=ry,rx
p[ry]=rx
sz[rx] +=sz[ry]
return sz[rx]
n,m=map(int,input().split())
grid=[list(input().strip()) for _ in range(n)]
total=n*m
p=list(range(total))
sz=[1]*total
active=[[False]*m for _ in range(n)]
max_area=0
dire=[(1,0),(-1,0),(0,1),(0,-1)]
for i in range(n):
for j in range(m):
if grid[i][j]=='@':
active[i][j]=True
idx=i*m+j
for di,dj in dire:
ni,nj=i+di,j+dj
if 0<=ni<n and 0<=nj<m and active[ni][nj]:
new_area=union(idx,ni*m+nj)
max_area=max(max_area,new_area)
q=int(input())
for _ in range(q):
x,y=map(int,input().split())
if not active[x][y]:
active[x][y]=True
grid[x][y]='@'
idx=x*m+y
curr_area=1
for di,dj in dire:
ni,nj=x+di,y+dj
if 0<=ni<n and 0<=nj<m and active[ni][nj]:
curr_area=union(idx,ni*m+nj)
max_area=max(max_area,curr_area)
print(max_area)

G. 大隊接力

import sys
def f(n,player):
player.sort(key=lambda x:(-x[0],x[1]))
group=[]
i=0
while i < len(player):
pos=player[i][0]
min_s=player[i][1]
j=i+ 1
while j < len(player) and player[j][0] ==pos:
min_s=min(min_s,player[j][1])
j+=1
t=(n -pos)/ min_s
group.append((pos,t))
i=j
count=0
current_time= -1.0
for pos,t in group:
if t > current_time:
count+=1
current_time=t
return count
input=sys.stdin.readline
n,m=map(int,input().split())
male=[]
female=[]
for _ in range(m):
s,p,g=input().split()
s,p,g=int(s),int(p),int(g)
if g ==0:
male.append((p,s))
else:
female.append((p,s))
ans=0
ans+=f(n,male)
ans+=f(n,female)
print(ans)

H. 簽到難題(signed‑in problem)

沒人解

排名

image

有趣的東西

image

  1. 三分鐘的pE image 據說是跟CF一樣 https://codeforces.com/problemset/problem/827/D

感謝一中哥和小菜雞🥹


Thanks for reading!

2025 成大賽心得文

Sun Apr 13 2025
818 words · 10 minutes