2019银川现场赛补题

I. Base62

x,y,z = (input().split())
x = int(x)
y = int(y)
num = []
map = {}
for i in range(62):
    if i < 10:
        num.append(chr(i+48))
    elif i < 36:
        num.append(chr(i-10+65))
    else:
        num.append(chr(i-36+97))
    map[num[i]] = i
cnt = 0
ans = []
for i in z:
    t = map[i]
    cnt = cnt * x + t

while cnt > 0:
    ans.append(num[cnt % y])
    cnt = cnt // y
if len(ans) == 0:
    ans.append(0)
ans.reverse()
for i in ans:
    print(i,end = "")

G. Pot!!

#include <cstdio>
#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
#define P pair<int,int>
#define mk make_pair
const ll INF=1e18;
const int N=1e5+10;
ll a[N];
struct SegmentTree{
    int l,r;
    ll maxn;
    ll dat;
}t[N*4][4];
void build(int p,int l,int r,int i)
{
    t[p][i].l = l;
    t[p][i].r = r;
    t[p][i].dat = 0;
    if(t[p][i].l == t[p][i].r){t[p][i].maxn = 0;return ;}
    int mid = (l+r)/2;
    build(p*2,l,mid,i);
    build(p*2+1,mid+1,r,i);
    t[p][i].maxn = max(t[p*2][i].maxn,t[p*2+1][i].maxn);
}
void spread(int p,int i)
{
    if(t[p][i].dat)
    {
        t[p*2][i].maxn += t[p][i].dat;
        t[p*2+1][i].maxn += t[p][i].dat;
        t[p*2][i].dat += t[p][i].dat;
        t[p*2+1][i].dat += t[p][i].dat;
        t[p][i].dat = 0;
    }
}
void change(int p,int l,int r,ll v,int i)
{
    if(l <= t[p][i].l && t[p][i].r <= r)
    {
        t[p][i].dat += v;
        t[p][i].maxn += v;
        return ;
    }
    int mid = (t[p][i].l+t[p][i].r)/2;
    spread(p,i);
    if(l<=mid) change(p*2,l,r,v,i);
    if(r>mid) change(p*2+1,l,r,v,i);
    t[p][i].maxn = max(t[p*2][i].maxn,t[p*2+1][i].maxn);
}
ll ask(int p,int l,int r,int i)
{
    if(l<=t[p][i].l&&r>=t[p][i].r)
        return t[p][i].maxn;
    int mid = (t[p][i].l+t[p][i].r)/2;
    spread(p,i);
    ll maxn = 0;
    if(l<=mid) maxn = max(maxn,ask(p*2,l,r,i));
    if(r>mid) maxn = max(maxn,ask(p*2+1,l,r,i));
    return maxn;
}
vector<P>num[11];
void init()
{
    int map[10];
    map[2] = 0,map[3] = 1,map[5] = 2,map[7] = 3;
    for(int i=2;i<=10;i++){
        int x = i;
        for(int j=2;j<=x;j++){
            int sum = 0;
            while(x%j==0){
                sum++;
                x = x / j;
            }
            if(sum){
                num[i].push_back(mk(map[j],sum));
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    init();
    int n,q;
    cin >> n >> q;
    for(int i=0;i<4;i++){
        build(1,1,n,i);
    }
    while(q--){
        string s;
        cin >> s;
        if(s[1]=='U'){
            int l,r,x;
            cin >> l >> r >> x;
            for(int i=0;i<num[x].size();i++){
                change(1,l,r,num[x][i].second,num[x][i].first);
            }
        }
        else{
            int l,r;
            cin >> l >> r;
            int ans = 0;
            for(int i=0;i<4;i++){
                ans = max(ans*1LL,ask(1,l,r,i));
            }
            printf("ANSWER %d\n",ans);
        }
    }
    return 0;
}

K Largest Common Submatrix(悬线法)

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
#define ll long long
#define mk make_pair
#define P pair<int,int>
const int N = 1e3 + 10;
int a[N][N],up[N][N],lft[N][N],rgt[N][N],b[N][N];
int n,m,x;
//map<int,pair<int,int>>mp;
struct node{
    int first,second;
};
node mp[N*N];
int solve()
{
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            lft[i][j] = rgt[i][j] = j;
            up[i][j] = 1;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=2;j<=m;j++){
            if(mp[a[i][j]].first == mp[a[i][j-1]].first && mp[a[i][j]].second == mp[a[i][j-1]].second)
                lft[i][j] = lft[i][j-1];
        }
        for(int j=m-1;j>=1;j--){
            if(mp[a[i][j]].first == mp[a[i][j+1]].first && mp[a[i][j]].second == mp[a[i][j+1]].second)
                rgt[i][j] = rgt[i][j+1];
        }
    }
    int ans = 0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i>1 && mp[a[i][j]].first == mp[a[i-1][j]].first && mp[a[i][j]].second == mp[a[i-1][j]].second){
                up[i][j] = up[i-1][j] + 1;
                lft[i][j] = max(lft[i][j],lft[i-1][j]);
                rgt[i][j] = min(rgt[i][j],rgt[i-1][j]);
            }
            ans = max((rgt[i][j]-lft[i][j]+1)*up[i][j],ans);
        }
    }
    return ans;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            mp[a[i][j]].first = i;
            mp[a[i][j]].second = j;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&b[i][j]);
            mp[b[i][j]].first -= i;
            mp[b[i][j]].second -= j;
        }
    }
//    for(int i=1;i<=n;i++){
//        for(int j=1;j<=m;j++){
//            cout << mp[a[i][j]].first <<  ' ' << mp[a[i][j]].second << ' ';
//        }
//        cout << '\n';
//    }
    int ans = solve();
    printf("%d\n",ans);
    return 0;
}
//3 3
//1 2 3
//4 5 6
//9 7 9
//5 6 1
//7 9 3
//2 4 8
posted @ 2020-04-25 10:00  hh13579  阅读(250)  评论(0)    收藏  举报