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();
    }
}
posted @ 2025-10-19 13:08  arin876  阅读(8)  评论(0)    收藏  举报