Advent of Code 2024 & 2025: My solutions

2025

//aoc2025day2pt1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

char c[100000]={};
LL ans=0;
LL pow_10[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};

int main(){
	cin>>c+1;
	int idx=0;
	while(c[idx]!='\0' || idx==0){
		LL upp=0,low=0;
		while(c[++idx]>=48 && c[idx]<58){
			low*=10;
			low+=c[idx]-48;
		}
		while(c[++idx]>=48 && c[idx]<58){
			upp*=10;
			upp+=c[idx]-48;
		}
		for(LL i=low;i<=upp;i++){
			int digit=to_string(i).size();
			if(digit%2==1) continue;
			LL f=i/pow_10[digit/2], b=i%pow_10[digit/2];
			if(f==b) ans+=i;
		}
	}
	cout<<ans;
	return 0;
}
//aoc2025day2pt2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

char c[100000]={};
LL ans=0;
LL pow_10[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};

int main(){
	cin>>c+1;
	int idx=0;
	while(c[idx]!='\0' || idx==0){
		LL upp=0,low=0;
		while(c[++idx]>=48 && c[idx]<58){
			low*=10;
			low+=c[idx]-48;
		}
		while(c[++idx]>=48 && c[idx]<58){
			upp*=10;
			upp+=c[idx]-48;
		}
		for(LL i=low;i<=upp;i++){
			int digit=to_string(i).size();
			for(int j=1;j<=digit/2;j++){
				bool flag=true;
				if(digit%j!=0) continue;
				int ori=i%pow_10[j],num=i/pow_10[j];
				while(num){
					if(num%pow_10[j]!=ori){
						flag=false;
						break;
					}
					num/=pow_10[j];
				}
				if(flag){
					ans+=i;
					break;
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
//aoc2025day3pt2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

int main(){
    long long ans = 0;
    long long dp[105][15];
    string s;
    while(cin >> s,s[0]!='x'){
        memset(dp,0,sizeof dp);
        for(int i=0;i<100;i++){
        	if(i==0) dp[i][1]=s[i]-48;
        	else{
        		for(int j=1;j<=12;j++){
	        		dp[i][j]=dp[i-1][j];
	        		for(int k=0;k<i;k++){
	        			dp[i][j]=max(dp[i][j],dp[k][j-1]*10+(s[i]-48));
					}
				}
			}
		}
        ans += dp[99][12];
    }
    cout<<ans<<endl;
    return 0;
}
//AoC 2025 day4 pt2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

int ttt=0;
char c[1005][1005];
int dx[8]={1,1,0,-1,-1,-1,0,1},dy[8]={0,1,1,1,0,-1,-1,-1};

int main(){
	for(int i=1;i<=135;i++){
		cin>>c[i]+1;
	}
	int ans;
	do{
		ans=0;
		for(int i=1;i<=135;i++){
			for(int j=1;j<=strlen(c[i]+1);j++){
				if(c[i][j]=='@'){
					int cnt=0;
					for(int k=0;k<8;k++){
						if(i+dx[k]<=135 && i+dx[k]>=1 && j+dy[k]<=strlen(c[i]+1) && j+dy[k]>=1 && c[i+dx[k]][j+dy[k]]=='@'){
							cnt++;
						}
					}
					if(cnt<=3){
						c[i][j]='.';
						ans++;
					}
				}
			}
		}
		ttt+=ans;
	}while(ans);
	cout<<ttt;
	return 0;
}
//AoC 2025 day5
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

LL ans;
vector<pair<LL,LL> > v;

int main(){
	LL a,b,c;
	while(cin>>a>>b,a!=0){
		v.push_back({a,b});
	}
	sort(v.begin(),v.end());
	LL l=0,r=-1;
	for(auto i:v){
		LL ll=i.first, rr=i.second;
		if(ll>r){
			ans+=r-l+1;
			l=ll;
			r=rr;
		}
		else{
			r=max(r,rr);
		}
	}
	ans+=r-l+1;
	cout<<ans;
	return 0;
}
//AoC 2025 day6 pt1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

LL num[1005][15],ans=0;
char op[1005];

int main(){
	for(int i=1;i<=4;i++){
		for(int j=1;j<=1000;j++){
			cin>>num[j][i];
		}
	}
	for(int i=1;i<=1000;i++){
		cin>>op[i];
		if(op[i]=='+'){
			ans+=num[i][1]+num[i][2]+num[i][3]+num[i][4];
		}
		else{
			ans+=num[i][1]*num[i][2]*num[i][3]*num[i][4];
		}
	}
	cout<<ans;
	return 0;
}
//AoC 2025 day6 pt2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

LL ans;
char c[5][10005],op[1005];

int main(){
	for(int i=1;i<=4;i++){
		cin.getline(c[i]+1,9995);
	}
	for(int i=1;i<=1000;i++){
		cin>>op[i];
	}
	int idx=1000; LL sum=0;
	for(int i=strlen(c[1]+1);i>=1;i--){
		LL num=0;
		bool flag=true;
		for(int j=1;j<=4;j++){
			if(c[j][i]==' ') continue;
			else{
				flag=false;
				LL n=c[j][i]-48;
				num*=10; num+=n;
			}
		}
		if(flag){
			idx--; ans+=sum;
			sum=0; continue;
		}
		if(op[idx]=='+'){
			sum+=num;
		}
		else{
			if(sum==0) sum=1;
			sum*=num;
		}
	}
	idx--; ans+=sum;
	cout<<idx<<" "<<ans;
	return 0;
}
//AoC 2025 day7
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

char c[200];
LL ans[200],cnt;

int main(){
	cin>>c+1;
	for(int i=1;i<=141;i++){
		if(c[i]=='S') ans[i]=1;
	}
	for(int i=1;i<=140;i++){
		cin>>c+1;
		for(int j=1;j<=141;j++){
			if(c[j]=='^' && ans[j]){
				ans[j+1]+=ans[j]; ans[j-1]+=ans[j];
				ans[j]=0;
			}
		}
	}
	for(int i=1;i<=141;i++){
		if(ans[i]) cnt+=ans[i];
	}
	cout<<cnt;
	return 0;
}
//AoC 2025 day8 part1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

struct node{
	LL x,y,z;
	bool operator < (const node &t) const{
		return make_tuple(x,y,z) < make_tuple(t.x,t.y,t.z);
	}
}e[1005];

LL getd(node a,node b){
	LL c=abs(a.x-b.x)*abs(a.x-b.x)+abs(a.y-b.y)*abs(a.y-b.y);
	return c+abs(a.z-b.z)*abs(a.z-b.z);
}

struct dis{
	LL di;
	int n1,n2;
	bool operator < (const dis &t) const{
		return di < t.di;
	}
};

int fa[1005],cnt[1005];
vector<dis> d;
map<node,int> mp;

int find(int x){
	if(fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x];
}

int main(){
	for(int i=1;i<=1000;i++){
		cnt[i]=1;
		fa[i]=i;
		cin>>e[i].x>>e[i].y>>e[i].z;
		mp[e[i]]=i;
	}
	for(int i=1;i<=1000;i++){
		for(int j=i+1;j<=1000;j++){
			d.push_back({getd(e[i],e[j]),i,j});
		}
	}
	sort(d.begin(),d.end());
	for(int i=0;i<1000;i++){
		int tt=cnt[find(d[i].n1)];
		cnt[find(d[i].n1)]=0;
		fa[find(d[i].n1)]=find(d[i].n2);
		cnt[find(d[i].n2)]+=tt;
	}
	sort(cnt+1,cnt+1001,greater<>());
	for(int i=1;i<=1000;i++){
		cout<<cnt[i]<<" ";
	}
	LL ans=1ll*cnt[1]*cnt[2]*cnt[3];
	cout<<"\n"<<ans;
	return 0;
}
//AoC 2025 day8 part2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

struct node{
	LL x,y,z;
	bool operator < (const node &t) const{
		return make_tuple(x,y,z) < make_tuple(t.x,t.y,t.z);
	}
}e[1005];

LL getd(node a,node b){
	LL c=abs(a.x-b.x)*abs(a.x-b.x)+abs(a.y-b.y)*abs(a.y-b.y);
	return c+abs(a.z-b.z)*abs(a.z-b.z);
}

struct dis{
	LL di;
	int n1,n2;
	bool operator < (const dis &t) const{
		return di < t.di;
	}
};

int fa[1005],cnt[1005];
vector<dis> d;
map<node,int> mp;

int find(int x){
	if(fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x];
}

int main(){
	for(int i=1;i<=1000;i++){
		cnt[i]=1;
		fa[i]=i;
		cin>>e[i].x>>e[i].y>>e[i].z;
		mp[e[i]]=i;
	}
	for(int i=1;i<=1000;i++){
		for(int j=i+1;j<=1000;j++){
			d.push_back({getd(e[i],e[j]),i,j});
		}
	}
	sort(d.begin(),d.end());
	int id;
	for(id=0;id<505000;id++){
		int tt=cnt[find(d[id].n1)];
		cnt[find(d[id].n1)]=0;
		fa[find(d[id].n1)]=find(d[id].n2);
		cnt[find(d[id].n2)]+=tt;
		if(cnt[find(d[id].n2)]==1000) break;
	}
	LL ans=1ll*e[d[id].n1].x*e[d[id].n2].x;
	cout<<"\n"<<ans;
	return 0;
}
//AoC 2025 day9 pt2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e8+5;
const LL mod = 1e6+7;
const double eps = 1e-9;

int n=496;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
LL x[1005],y[1005],vis[5005][5005],ans;
vector<LL> alls;

LL find(int xx){
    return lower_bound(alls.begin(),alls.end(),xx) - alls.begin() + 1;
}

void dfs(int xx,int yy){
	vis[xx][yy]=2;
	for(int i=0;i<4;i++){
		if(xx+dx[i]<=alls.size()+1 && xx+dx[i]>=0 && yy+dy[i]<=alls.size()+1 && yy+dy[i]>=0 && vis[xx+dx[i]][yy+dy[i]]==0){
			dfs(xx+dx[i],yy+dy[i]);
		}
	}
}

void dfs2(int xx,int yy){
    queue<pair<int,int>> q;
    q.push({xx,yy});
    while(q.size()){
        auto p = q.front();
        q.pop();
        xx = p.first;
        yy = p.second;
        if(vis[xx][yy]) continue;
        vis[xx][yy] = 2;
        for(int i=0;i<4;i++){
            int nx = xx + dx[i];
            int ny = yy + dy[i];
            if(nx < 0 || nx > alls.size()+1 || ny < 0 || ny > alls.size()+1) continue;
            q.push({nx,ny});
        }
    }
}

int main(){
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
		alls.push_back(x[i]);
		alls.push_back(y[i]);
	}
	sort(alls.begin(),alls.end());
	alls.erase(unique(alls.begin(),alls.end()),alls.end());
	for(int i=0;i+1<alls.size();i++){
		if(alls[i+1]!=alls[i]+1){
			alls.insert(alls.begin()+i+1,alls[i]+1);
			i++;
		}
	}
	for(int i=1;i<=n;i++){
		int j=(i==n)? 1:i+1;
		if(x[i]==x[j]){
			for(int p=min(find(y[i]),find(y[j]));p<=max(find(y[i]),find(y[j]));p++){
				vis[find(x[i])][p]=1;
			}
		}
		else if(y[i]==y[j]){
			for(int p=min(find(x[i]),find(x[j]));p<=max(find(x[i]),find(x[j]));p++){
				vis[p][find(y[i])]=1;
			}
		}
	}
	dfs2(0,0);
	for(int i=0;i<=alls.size();i++){
		for(int j=0;j<=alls.size();j++){
			if(vis[i][j]==2) vis[i][j]=0;
			else vis[i][j]=1;
		}
	}
//	for(int i=0;i<=alls.size();i++){
//		for(int j=0;j<=alls.size();j++){
//			cout<<vis[j][i]<<" ";
//		}
//		cout<<endl;
//	}
	for(int i=1;i<=alls.size();i++){
        for(int j=1;j<=alls.size();j++){
            vis[i][j]+=vis[i-1][j]+vis[i][j-1]-vis[i-1][j-1];
        }
    }
    for(int i=1;i<=n;i++){
    	for(int j=i+1;j<=n;j++){
    		LL x1 = min(find(x[i]),find(x[j]));
            LL x2 = max(find(x[i]),find(x[j]));
            LL y1 = min(find(y[i]),find(y[j]));
            LL y2 = max(find(y[i]),find(y[j]));
            LL cnt=vis[x2][y2]-vis[x1-1][y2]-vis[x2][y1-1]+vis[x1-1][y1-1];
            if(cnt==(x2-x1+1)*(y2-y1+1)) ans = max(ans,(abs(x[i]-x[j])+1)*(abs(y[i]-y[j])+1));
		}
	}
	cout<<ans;
	return 0;
}

Leave a Comment