D - Gravity
每一行消除,得等所有在这一行消除的都落到这一行
每一列也是按顺序消除
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long longconst int N=200010;
int x[N],y[N];int ans[N];
vector<pii> G[N];
void solve(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){cin>>x[i]>>y[i];G[x[i]].pb({i,y[i]});
}for(int i=1;i<=n;i++)ans[i]=-1;int mn=inf;for(int i=1;i<=m;i++)mn=min(mn,(int)G[i].size());
int cur=-1;
for(int j=0;j<mn;j++){int tmp=cur+1;for(int i=1;i<=m;i++){tmp=max(tmp,G[i][j].se-1);}cur=tmp;//这一行的消除时间为curfor(int i=1;i<=m;i++){ans[G[i][j].ft]=tmp;}
}int qq;cin>>qq;
while(qq--){int ti,idxi;cin>>ti>>idxi;// cout<<ans[idxi]<<'\n';if(ans[idxi]==-1)yes;else {if(ans[idxi]<ti)no;else yes;}
}}
signed main(){std::ios::sync_with_stdio(false);int T;T=1;while(T--){solve();}
}
E - Hierarchical Majority Vote
递归,可以回忆一下之前也写过一个pre,cur的递归
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long longstring s;int n;int ksm(int a,int b){int res=1;while(b){if(b&1)res=res*a;a=a*a;b>>=1;}return res;
}
int dfs(int l,int r){if(r-l==2){int res=0;for(int i=l;i<=r;i++)if(s[i]=='1')res++;if(res<=1)return 0;else return 1;}int len=(r-l+1)/3;int res=0;if(dfs(l,l+len-1))res++;if(dfs(l+len,l+len+len-1))res++;if(dfs(r-len+1,r))res++;if(res<=1)return 0;else return 1;
}
int work(int l,int r){if(r-l==2){int res=0;for(int i=l;i<=r;i++)if(s[i]=='1')res++;if(res==0)return 2;else return 1;}vector<int> vec;int len=(r-l+1)/3;int res=0;if(dfs(l,l+len-1))res++;else vec.pb(work(l,l+len-1));if(dfs(l+len,l+len+len-1))res++;else vec.pb(work(l+len,l+len+len-1));if(dfs(r-len+1,r))res++;else vec.pb(work(r-len+1,r));if(res>=2)return 0;sort(vec.begin(),vec.end());if(res==1){return vec[0];}if(res==0){return vec[0]+vec[1];}
}
void solve(){
cin>>n;
n=ksm(3,n);cin>>s;s="a"+s;
int t=dfs(1,n);
if(t)for(int i=1;i<=n;i++)if(s[i]=='1')s[i]='0';else s[i]='1';cout<<work(1,n)<<'\n';}
signed main(){std::ios::sync_with_stdio(false);int T;T=1;while(T--){solve();}
}
F - K-th Largest Triplet
优先队列经典思路,优先队列的bfs,出队K-1个
O(4Klog(4K))
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long longconst int N=200010;
int a[N],b[N],c[N];
pair<pii,pii> get(int i,int j,int k){return {{a[i]*b[j]+a[i]*c[k]+b[j]*c[k],i},{j,k}};
}
void solve(){
int n,K;cin>>n>>K;
for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);reverse(a+1,a+n+1);
for(int i=1;i<=n;i++)cin>>b[i];sort(b+1,b+n+1);reverse(b+1,b+n+1);
for(int i=1;i<=n;i++)cin>>c[i];sort(c+1,c+n+1);reverse(c+1,c+n+1);priority_queue<pair<pii,pii>,vector<pair<pii,pii>>> pq;
set<pair<pii,pii>> s;s.insert(get(1,1,1));pq.push(get(1,1,1));
for(int _=1;_<=K-1;_++){auto tem=pq.top();pq.pop();int val=tem.ft.ft;int i=tem.ft.se;int j=tem.se.ft;int k=tem.se.se;//cout<<"get"<<val<<'\n';if(i+1<=n){auto t=get(i+1,j,k);if(!s.count(t)){s.insert(t);pq.push(t);}}if(j+1<=n){auto t=get(i,j+1,k);if(!s.count(t)){s.insert(t);pq.push(t);}}if(k+1<=n){auto t=get(i,j,k+1);if(!s.count(t)){s.insert(t);pq.push(t);}}
}
auto tem=pq.top();
cout<<tem.ft.ft<<'\n';}
signed main(){std::ios::sync_with_stdio(false);int T;T=1;while(T--){solve();}
}