提交时间:2025-05-27 13:50:50

运行 ID: 37883

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=2e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n; vector<int>a,b; inline void chkmin(int &x,int y){if(x>y)x=y;} bool DP[3][3][3][4][4][3][3][3]; void init_allow(int x,int y,int z,int A,int B){ int f[4][3][3][3]; memset(f,0,sizeof(f)); f[0][x][y][z]=1; up(i,0,2){ int w=(i+1)%3; up(j,0,2){ up(k,0,2){ up(l,0,2)if(f[i][j][k][l]){ up(o1,0,(j==i))up(o2,0,(k==i))up(o3,0,(l==i)){ int total=o1+o2+o3; if(!i)total+=A+B; if(i==1)total+=B; if(total>3||(!total))continue; f[i+1][o1?w:j][o2?w:k][o3?w:l]|=f[i][j][k][l]; } } } } } up(i,0,2)up(j,0,2)up(k,0,2)DP[x][y][z][A][B][i][j][k]=f[3][i][j][k]; //up(i,0,2)up(j,0,2)up(k,0,2)chkmin(dp[i][j][k][i_2][j_2],f[3][i][j][k]); } void slv(){ n=read(); map<int,int>M1,M2; ll extra=0; up(i,1,n){ int w=read(),t=read(); if(w==1)M1[t]++; else M2[t]++; } for(auto it:M1){ int tot=it.p2; while(tot>=6){ extra+=2*it.p1+7; tot-=6; } up(i,1,tot)a.p_b(it.p1); } for(auto it:M2){ int tot=it.p2; while(tot>=6){ extra+=4*it.p1+5; tot-=6; } up(i,1,tot)b.p_b(it.p1); } up(i,0,2)up(j,0,2)up(k,0,2)up(x,0,3)up(y,0,3)if(x+y<=3)init_allow(i,j,k,x,y); vector<vector<int> >dp[3][3][3]; up(i,0,2)up(j,0,2)up(k,0,2){ dp[i][j][k].resize((int)a.size()+1); up(p,0,(int)a.size())dp[i][j][k][p].resize((int)b.size()+1,1e9); } dp[0][0][0][0][0]=0; auto ZY=[&](int i,int j,int i_2,int j_2,int a,int b,int x,int y,int z,int init_val){ if(init_val>=1e9)return; int A=i_2-i,B=j_2-j; a=max(a,b); a=max(a,1); b=max(b,1); up(i,0,2)up(j,0,2)up(k,0,2) if(DP[x][y][z][A][B][i][j][k]) chkmin(dp[i][j][k][i_2][j_2],init_val+a+b+1); }; up(i,0,(int)a.size())up(j,0,(int)b.size())up(x,0,2)up(y,0,2)up(z,0,2){ up(ii,0,min((int)a.size()-i,3))up(jj,0,min((int)b.size()-j,3-ii)) ZY(i,j,i+ii,j+jj,(ii?a[i+ii-1]:0),(jj?b[j+jj-1]:0),x,y,z,dp[x][y][z][i][j]); } cout<<dp[0][0][0][a.size()][b.size()]+extra; } int main(){ //freopen("ship.in","r",stdin),freopen("ship.out","w",stdout); slv(); return 0; }