A. PaParty
import sysinput=sys.stdin.readlineMOD=10**9+7n,k=map(int,input().split())A=[0]*kLEN=[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=0for _ 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])%MODprint(ans)B. 排序
沒人解
C. 神奇畫筆
#pragma GCC optimize("Ofast","unroll-loops","no-stack-protector")#include <iostream>#include <utility>#define f first#define s secondusing 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

- BFS寫法,會TLE💀
#pragma GCC optimize("Ofast","unroll-loops","no-stack-protector")#include <iostream>#include <queue>#include <utility>#define f first#define s secondusing 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 sysinput=sys.stdin.readlinen,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 sysinput=sys.stdin.readlinedef 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=0dire=[(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 sysdef 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.readlinen,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=0ans+=f(n,male)ans+=f(n,female)print(ans)H. 簽到難題(signed‑in problem)
沒人解
排名

有趣的東西

- 三分鐘的pE
據說是跟CF一樣 https://codeforces.com/problemset/problem/827/D↗
感謝一中哥和小菜雞🥹
Thanks for reading!