2019 商湯筆試-城市項目

#include <iostream>
#include <algorithm>
using namespace std;
struct Node
{
    long long t;
    long long w;

} node[1000100];

bool cmp(Node a, Node b)
{
    return a.t<b.t;


}
int main()
{
    int n,m;
    int d;
    while(cin>>n>>m)
    {
        for(int i=0; i<n; i++)
        {
            cin>>node[i].t>>node[i].w;
        }
        sort(node,node+n,cmp);
        for(int i=n-2; i>=0; i--)
        {
            node[i].w=max(node[i].w,node[i+1].w);
        }
        for(int i=0; i<m; i++)
        {
            cin>>d;
            int l=0,r=n;
            int mid;
            if(d>node[n-1].t)
            {
                cout<<-1<<endl;
                continue;
            }

            while(l<r)
            {
                mid=(l+r)/2;
                if(node[mid].t>=d)
                {
                    r=mid;
                }
                else
                {

                    l=mid+1;
                }
                //cout<<l<<"--"<<r<<endl;
            }

            cout<<node[l].w<<endl;




        }


    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

typedef long long ll;

// 用二維vector來表示矩陣
typedef vector<ll> vec;
typedef vector<vec> mat;

// 模
const int M = 1000000007;

// 計算 A*B
mat mul(mat& A, mat& B)
{
    mat C(A.size(), vec(B[0].size()));
    for ( int i = 0 ; i < A.size() ; ++ i )
    {
        for ( int k = 0 ; k < B.size() ; ++ k )
        {
            for ( int j = 0 ; j < B[0].size() ; ++ j )
            {
                C[i][j] = (C[i][j]+A[i][k]*B[k][j]%M)%M;
            }
        }
    }
    return C;
}

// 計算 A^B
mat pow(mat A, ll n)
{
    mat B(A.size(), vec(A.size()));
    for ( int i = 0 ; i < A.size() ; ++ i )
    {
        B[i][i] = 1;
    }
    while ( n > 0 )
    {
        if ( n & 1 ) B = mul(B, A);
        A = mul(A, A);
        n >>= 1;
    }
    return B;
}

int main()
{
    long long n,a,b,c,f;
    long long f0,f1,f2;
    mat A(6, vec(6));
    while(cin>>n>>a>>b>>c>>f)
    {
        f0=f;
        f1=a*f+32768;
        f2=a*f1+b*f0+6+32767;
        if(n ==0)
        {
            cout<<f0<<endl;
            continue;
        }
        if(n==1){
            cout<<f1<<endl;
            continue;
        }
        if(n==2){
            cout<<f2<<endl;
            continue;
        }

        for ( int i = 0 ; i < 6 ; ++ i )
        {
            for ( int j = 0 ; j < 6 ; ++ j )
            {
                A[i][j] = 0;
            }
        }
        A[0][0] = a;
        A[0][1] = b;
        A[0][2] = c;
        A[0][3] = 2;
        A[0][4] = 3;
        A[0][5] = 32768;
        A[1][0] = 1;
        A[2][1] = 1;
        A[3][3] = 1;
        A[3][4] = 2;
        A[3][5] = 1;
        A[4][4] = 1;
        A[4][5] = 1;
        A[5][5] = 1;
        A = pow(A, n-2);
        ll ans = 0;
        ans+=(f2*A[0][0]+f1*A[0][1]+f0*A[0][2]+4*A[0][3]+2*A[0][4]+A[0][5])%M;
        printf( "%lld\n", ans );

    }



 

    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章