22牛客国庆(模拟、构造、几何)

国庆1 B-Crazy Binary String(构造)

题意:有一串01串,求01串的(0和1数量相等的)最长子序列长度和最长子串长度

思路:1. 最长子序列长度就是0和1最小的个数的两倍

2. 求最长子串长度:

因为只有0和1,可以把0看作-1,那么开始求和,只要求和的数字回到之前有过的数字,那么这段子串就是0和1的个数相等的,所以可以用vector记录下每一个前缀和出现的位置,然后最晚出现的地方减去最早出现的地方就是01平衡的子串的长度

代码:

#include<bits/stdc++.h>
using namespace std;
vector<int >v[200005];int sum=0;
int main()
{ 
    int n;cin>>n;string s;
    cin>>s;int x=0,y=0;s=" "+s;v[100000].push_back(0);
    for(int i=1;i<=n;i++){
        if(s[i]=='1'){sum+=1;x++;}
        else {sum-=1;y++;}
        v[sum+100000].push_back(i);
    }
    int ans=0;
    for(int i=0;i<=200000;i++){
        if(v[i].size()==0)continue;
        int r=(int)v[i].size()-1;
        ans=max(ans,v[i][r]-v[i][0]);
    }
    cout<<ans<<" "<<2*min(x,y);
    return 0;
}

H-Magic Line(几何)

题意:找到一根线把 点集 等分

思路:很数学,要计算斜率、直线公式什么的

代码:

#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<int,int>a,pair<int,int>b)
{
    if(a.first!=b.first)
    return a.first<b.first;
    return a.second<b.second;
}
int main()
{
    int T;cin>>T;
    while(T--){
        pair<int,int>p[1003];
        int n;cin>>n;
        for(int i=1;i<=n;i++) cin>>p[i].first>>p[i].second;
        sort(p+1,p+n+1,cmp);
        cout<<p[n/2].first-1<<" "<<999000000<<" "<<p[n/2].first+1<<" "<<2*p[n/2].second-999000000+1<<endl;
    }
    return 0;
}

J-LRU management(模拟)

思路:用stl的list模拟,list的迭代器不会被改变,且li.end()不指向内容

用map来记录list的迭代器,这样能快速消除想删掉的数字

代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<string,int> PSI;
typedef list <PSI>::iterator lit;
#define fi first 
#define se second 
map <string,lit>mp;
list <PSI> li;

int main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    int T;cin>>T;
    while(T--){
        mp.clear();li.clear();
        int q,m;cin>>q>>m;int op,v;string s;int ans=0;
        while(q--){
            cin>>op>>s>>v;
            if(op==0){
                if(mp.count(s)==0||mp[s]==li.end()){                    
                    if(ans==m){
                        mp[li.begin()->fi]=li.end();
                        li.erase(li.begin());
                    }
                    else ans++;
                    li.push_back({s,v});
                    mp[s]=--li.end();
                    cout<<v<<'\n';
                }
                else{
                   lit it=mp[s];
                    int vv=(*it).se;
                    cout<<vv<<'\n';
                    li.erase(it);
                    li.push_back({s,vv});
                    mp[s]=--li.end();
                }
            }
            else{
                if(mp.count(s)==0||mp[s]==li.end()){cout<<"Invalid\n";continue;}
                lit it=mp[s];
                if(v==0){cout<<(*it).se<<"\n";continue;}
                else if(v==1){
                    if(it==--li.end()){cout<<"Invalid\n";continue;}
                    else {
                        it++;
                        cout<<(*it).se<<"\n";continue;
                    }
                }
                 else if(v==-1){
                    if(it==li.begin()){cout<<"Invalid\n";continue;}
                    else {
                        it--;cout<<(*it).se<<"\n";continue;
                    }
                }
            }      
        }   
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zy98zy998/article/details/127327069