AtCoder Beginner Contest 391
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 long
const 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;//这一行的消除时间为cur
for(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 long
string 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 long
const 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();
}
}

浙公网安备 33010602011771号