8/12 最小表示法+牛客月赛

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8/12 最小表示法+牛客月赛相关的知识,希望对你有一定的参考价值。

P1368 【模板】最小表示法

用途:求出最小同构串
思路:
1.破环成链,长度扩大为2倍
2.利用三个指针控制,分类跳转,及时淘汰不满足题意 选项。

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
int n;
int s[N];
int get_min(int s[]) //找出最小同构串

    for(int i=1;i<=n;i++) s[n+i]=s[i];
    int i=1,j=2,k=0;
    while(i<=n&&j<=n)
    
        for(k=0;k<n&&s[i+k]==s[j+k];k++);
        s[i+k]>s[j+k]?i=i+k+1:j=j+k+1;
        if(i==j) j++;
    
    return min(i,j);

void solve()

    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>s[i];
    int k=get_min(s);

    for(int i=k;i<=n;i++)
        cout<<s[i]<<" ";
    for(int i=1;i<k;i++)
        cout<<s[i]<<" ";
    cout<<endl;

signed main()

    solve();
    return 0;

Sum 小白月赛A

思路:看到要删除数字,第一个想到stl容器。2个情况要考虑到:
1.如果n==1,直接输出0
2.只有将最大的两个数相加加入到容器中,值才会最大。若出现相加结果为0,及时退出。

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
using namespace std;
const int N=5e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n;
priority_queue<int>q;
void solve()

    while(!q.empty()) q.pop();
    cin>>n;
    if(n==1)
    
        cout<<0<<endl;return;
    
    for(int i=1;i<=n;i++)
    
        int x;cin>>x;
        q.push(x);
    
    int ans=0;
    while(q.size()>1)
    
        int x=q.top();q.pop();
        int y=q.top();q.pop();
        int tmp=x+y;
        if(tmp<0)
            break;
        ans=(ans+tmp)%mod;
        q.push(tmp);
    
    cout<<ans<<endl;

signed main()

    int t;cin>>t;
    while(t--)
    
        solve();
    
    return 0;


Gaming 小白月赛B

题意:刚开始看这个题意,真的不知道在说啥,
尤其是“如果多次获得编号为 xx 的 debuff,视为身上带有,但仅带有一个”这句话。
只要不带有m个点所有的debuff,就能获得分数
思路:
1.即为能获得所有分数,但要减去一个debuff所在点的分数不能获取。
2.里用差分求出每个点所有的分数,比较出一个最大值。

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
using namespace std;
const int N=7e6+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,m,a[N],b[N];

void solve()

    cin>>n>>m;
    int sum=0,ans=0;
    for(int i=1;i<=n;i++)
    
        int x,y,z;cin>>x>>y>>z;
        a[x]+=z;
        a[y+1]-=z;
        sum+=z;
    
    for(int i=1;i<=m;i++)
        b[i]=b[i-1]+a[i];
    for(int i=1;i<=m;i++)
        ans=max(ans,sum-b[i]);
    cout<<ans<<endl;

signed main()

    solve();
    return 0;


School 小白月赛C

思路:
1.开两个结构数组,进行区间合并 2.结构体内定义排序算法,方便使用lowerbound函数

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=1e3+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,m,h,q;
struct node

    int l,r;
    bool operator <(const node &e1) const
    
        return r<e1.r;
    
e[N],g[N];
bool cmp(node e1,node e2)

    if(e1.l==e2.l)
        return e1.r<e2.r;
    return e1.l<e2.l;

void solve()

    cin>>n>>h>>m>>q;
    for(int i=1;i<=n;i++)
    
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        e[i].l=a*m+b;
        e[i].r=c*m+d;
    
    sort(e+1,e+n+1,cmp);
    g[1]=e[1];
    int cnt=1;
    for(int i=2;i<=n;i++)
    
        if(g[cnt].r<e[i].l)
            g[++cnt]=e[i];
        else
            g[cnt].r=max(g[cnt].r,e[i].r);
    
    while(q--)
    
        int x,y;
        cin>>x>>y;
        node tmp=x*m+y,x*m+y;
        int p=lower_bound(g+1,g+cnt+1,tmp)-g;
        if(p>cnt)
            cout<<"Yes"<<endl;
        else
        
            if(tmp.l>=g[p].l)
                cout<<"No"<<endl;
            else
                cout<<"Yes"<<endl;
        
    

signed main()

    ios;
    solve();
    return 0;




以上是关于8/12 最小表示法+牛客月赛的主要内容,如果未能解决你的问题,请参考以下文章

牛客月赛43

牛客月赛42

牛客月赛42题解完结

博客总结第十周+牛客月赛

牛客月赛46部分题解

牛客月赛60 F.被抓住的小竹(数学&推式子)