Jay的新歌《西西里》真的很好听!!!!!

《晴天》:

为你翘课的那一天

花落的那一天

教室的那一间

我怎么看不见

消失的下雨天

我好想再淋一遍

A.奇偶争锋

根据题意,使用优先队列模拟取走宝石的顺序即可。

有宝石取宝石,没宝石的就把答案记录为0。(注意:一共进行n-1***作,即使都空了也要进行)

代码:

void Rainstorm()
{
    cin>>n;
    PQI A,B;
    rep(i,1,n){
        cin>>x;
        if(x&1) A.push(x);
        else B.push(x);
    }
    int ans1=A.top(),ans2=B.top();
    cout<<max(ans1,ans2)<<" ";
    n--;
    while(n--){
        int nx=0,ny=0;
        if(!A.empty()){
            nx=A.top();
            A.pop();
        }
        if(!B.empty()){
            ny=B.top();
            B.pop();
        }
        if(nx==0) ans2=0;
        if(ny==0) ans1=0;
        ans1+=ny;
        ans2+=nx;
        cout<<max(ans1,ans2)<<" ";
    }
}

B.数论谜城

不难发现,gcd(n,n+1)=1。

如果区间只有一个点,那就每次与已经得到的最大公因数做一次gcd;

区间一旦超过一个点,最大公因数只能是1。

代码:

void Rainstorm()
{
    cin>>n;
    int ans=0;
    bool g=true;
    while(n--){
        cin>>l>>r;
        if(l!=r){
            g=false;
        }
        else{
            if(ans==0) ans=l;
            else ans=gcd(ans,l);
        }
    }
    if(!g) cout<<1<<endl;
    else cout<<ans<<endl;
}

C.乘鲨破浪

比较有意思的一道题。

首先,最后一步一定是两个人坐船从A岸到B岸。 不难思考,我们肯定要先把不是船夫的送过去,所以第一步:把所有人分为两拨,一拨是船夫,一拨是乘客。我们先把乘客全部送过去,再考虑船夫的事。

很容易想到第一种不能全部过去的情况:有乘客不能被任意一名船夫带走,这时直接输出NO。 否则,我们通过船夫遍历所有乘客,把乘客交给跟他不冲突的船夫。

当我们把所有乘客送走,再考虑船夫的问题,假如船夫的情绪值是2 5 8 11,而冲突参数k3,很明显此时任意两名船夫都不能同船。所以在这种情况下,一定有人过不去B岸。

注意到,当有两名船夫不冲突的时候,他们可以把所有船夫送过去。比如冲突系数是3,而船夫的情感值分别是1 3 4 6 9 12 3*i...(i=1,2,3...),此时第一名船夫跟第二名船夫不冲突,假设这两名船夫是X跟Y,别的船夫是Zi,很容易发现可以通过先把一名船夫送过去的方式,让他把船送回来,继续下一轮运输,以此来达到送过去一名船夫的目的,具体为:

X Y (把Y送过去) A->B

X X (X自己回来) B->A

Zi Zi (把Zi送过去) A->B

Y Y (Y把船开回来) B->A

如此往复,即可把所有船夫送过去,直到最后一步X跟Y一起走。

n-m名乘客,船夫送一个过去以后,自己回来,共2(n-m)步,送所有船夫过去,除最后两名船夫为1步以外,其它每一名船夫都走4步,共4(m-2)+1步。共计2(n+m)-7步。

特殊的,当船夫只有一名时,需要检查他是否与别人冲突,如果有,那一定过不去,否则,共计2n-3步。

代码:

void Rainstorm()
{
    cin>>n>>m>>k;
    VI a(n+1);
    VI b(m+1);
    VI e[N];
    rep(i,1,n) cin>>a[i];
    rep(i,1,m) cin>>b[i];
    vector<bool>vis(n+1,false);
    if(m==1){
        rep(i,1,n){
            if(i==b[1]) continue;
            if(a[i]%a[b[1]]==k||a[b[1]]%a[i]==k){
                cout<<"NO"<<endl;
                return;
            }
        }
        cout<<"YES"<<endl;
        cout<<2*n-3<<endl;
        int cnt=0;
        rep(i,1,n){
            if(i==b[1]) continue;
            if(cnt==2*n-4){
                cout<<b[1]<<" "<<i<<endl;
                return;
            }
            cout<<b[1]<<" "<<i<<endl;
            cout<<b[1]<<" "<<b[1]<<endl;
            cnt+=2;
        }
        return;
    }
    rep(i,1,m) vis[b[i]]=true;
    rep(i,1,m){
        rep(j,1,n){
            if(!vis[j]&&a[b[i]]%a[j]!=k&&a[j]%a[b[i]]!=k&&b[i]!=j){
                vis[j]=true;
                e[b[i]].emplace_back(j);
            }
        }
    }
    rep(i,1,n){
        if(!vis[i]){
            cout<<"NO"<<endl;
            return;
        }
    }
    int cnt1=-1,cnt2=-1;
    rep(i,1,m){
        rep(j,1,m){
            if(i==j) continue;
            if(a[b[j]]%a[b[i]]!=k&&a[b[i]]%a[b[j]]!=k){
                cnt1=b[i];
                cnt2=b[j];
                vis[b[i]]=false;
                vis[b[j]]=false;
                break;
            }
        }
        if(cnt1!=-1) break;
    }
    if(cnt1==-1){
        cout<<"NO"<<endl;
        return;
    }
    cout<<"YES"<<endl;
    cout<<2*(n+m)-7<<endl;
    rep(i,1,m){
        for(auto x:e[b[i]]){
            cout<<b[i]<<" "<<x<<endl;
            cout<<b[i]<<" "<<b[i]<<endl;
        }
    }
    rep(i,1,m){
        if(vis[b[i]]){
            cout<<cnt1<<" "<<cnt2<<endl;
            cout<<cnt1<<" "<<cnt1<<endl;
            cout<<b[i]<<" "<<b[i]<<endl;
            cout<<cnt2<<" "<<cnt2<<endl;
        }
    }
    cout<<cnt1<<" "<<cnt2<<endl;
}

后面不会力,d貌似是用数位dp进行检查,用dfs进行划分,确实不会做喵

头文件

#include<bits/stdc++.h>
#define int long long
#define double long double
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dep(i,r,l) for(int i=r;i>=l;i--)
#define lowbit(x) ((x)&-(x))
#define pb push_back
#define fi first
#define se second
#define endl '\n'
#define all(x) x.begin()+1,x.end()
using namespace std;
using VI=vector<int>;
using VVI=vector<vector<int>>;
using PII=pair<int,int>;
using PQI=priority_queue<int>;
using MI=map<int,int>;
// Author:@RainStormZZ
const int MAX=0x3f3f3f3f3f3f3f3f;
const int INF=-0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int MOD=998244353;
const int N=2e5+9;
// const int fx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
// const int fx[8][2]={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};
// const int fx[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{2,-1},{1,2},{2,1}};
/*----------------------------global variable & function----------------------------*/

/*---------------------------------------code---------------------------------------*/
void Rainstorm()
{
    
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int _=1;
    // cin>>_;
    while(_--){
        Rainstorm();
    }
    return 0;
}

《那天下雨了》:

翘课的那一天

花落那一天

教室那间我已看见

消失的下雨天

我想再淋一遍

我应该对你唱着晴天