2021寒假训练(一)

题号 A B C D E F G H
AC     Ο  Ο  

 

 

 

A.T-shirt buying

#include<list>
#include<string.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<iomanip>
#include<cstdlib>
#include<stdexcept>
#include<fstream>
#include<iterator>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ll long long
#define int long long
const int maxn = 2e5 + 10;
const int inf = 0x3f3f3f3f;
const int Base = 131;
const ll INF = 1ll << 62;
//const double PI = acos(-1);
const double eps = 1e-7;
const int mod = 1e9 + 7;
#define PI acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define speed {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); }
#define wait while(1){}
#define debug cout<<"********"<<endl;

// inline int gcd(int a, int b) {
//     while (b ^= a ^= b ^= a %= b);
//     return a;
// }

inline ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); }

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) result = result * base % mod;
        power >>= 1;
        base = (base * base) % mod;
    }
    return result;
}

inline ll rd() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}


int n, m, price[maxn], front[maxn], back[maxn];

signed main() {
    n = rd();
    set<int>money[4];
    for (int i = 0; i < n; i++) {
        price[i] = rd();
    }
    for (int i = 0; i < n; i++) {
        front[i] = rd();
    }
    for (int i = 0; i < n; i++) {
        back[i] = rd();
        money[back[i]].insert(price[i]);
        money[front[i]].insert(price[i]);
    }
    m = rd();
    int pp = 0;
    for (int i = 0; i < m; i++) {
        int want = rd();
        if (money[want].empty()) {
            if (pp == 0) {
                pp = 1;
                printf("-1");
            }
            else {
                printf(" -1");
            }
        }
        else {
            set<int>::iterator it = money[want].begin();
            int x = *it;
            if (pp == 0) {
                pp = 1;
                printf("%lld", x);
            }
            else {
                printf(" %lld", x);
            }
            for (int j = 1; j <= 3; j++) {
                if (money[j].find(x) != money[j].end()) {
                    money[j].erase(x);
                }
            }
        }
    }
    //system("pause");
    return 0;
}
View Code

D.Roads in Berland

#include<list>
#include<string.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<iomanip>
#include<cstdlib>
#include<stdexcept>
#include<fstream>
#include<iterator>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ll long long
#define int long long
const int maxn = 2e5+10;
const int inf = 0x3f3f3f3f;
const int Base = 131;
const ll INF = 1ll << 62;
//const double PI = acos(-1);
const double eps = 1e-7;
const int mod = 1e9+7;
#define PI acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define speed {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); }
#define wait while(1){}
#define debug cout<<"********"<<endl;

// inline int gcd(int a, int b) {
//     while (b ^= a ^= b ^= a %= b);
//     return a;
// }

inline ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); }

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) result = result * base % mod;
        power >>= 1;
        base = (base * base) % mod;
    }
    return result;
}

inline ll rd() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

// freopen("C:/Users/ASUS/Desktop/Struct/in.txt", "r", stdin); //输入重定向,输入数据将从in.txt文件中读取 
// freopen("C:/Users/ASUS/Desktop/Struct/out.txt", "w", stdout); //输出重定向,输出数据将保存out.txt文件中 
// fclose(stdin);//关闭重定向输入
// fclose(stdout);//关闭重定向输出                                                                                                                                                                                                                                                                                                                                                                                              

int mp[310][310];

signed main(){
    int n = rd();
    int sum=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            mp[i][j]=rd(),sum+=mp[i][j];
    int k = rd();
    sum>>=1;


    while(k--){
        int u,v,w;
        u=rd(),v=rd(),w=rd();
        if(w>=mp[u][v]){
            printf("%lld ",sum);
            continue;
        }
        sum-=(mp[u][v]-w);
        mp[u][v]=mp[v][u]=w;

        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(mp[i][j]>mp[i][u]+mp[u][v]+mp[v][j]){
                    sum-=mp[i][j]-(mp[i][u]+mp[u][v]+mp[v][j]);
                    mp[i][j]=mp[i][u]+mp[u][v]+mp[v][j];
                    mp[j][i]=mp[i][u]+mp[u][v]+mp[v][j];
                }
            }
        }

        printf("%lld ",sum);
    }
    //system("pause");
    return 0;
}
View Code

E.String LCM

#include<list>
#include<string.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<iomanip>
#include<cstdlib>
#include<stdexcept>
#include<fstream>
#include<iterator>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ll long long
#define int long long
const int maxn = 1e2+10;
const int inf = 0x3f3f3f3f;
const int Base = 131;
const ll INF = 1ll << 62;
//const double PI = acos(-1);
const double eps = 1e-7;
const int mod = 1e9+7;
#define PI acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define speed {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); }
#define wait while(1){}
#define debug cout<<"********"<<endl;

// inline int gcd(int a, int b) {
//     while (b ^= a ^= b ^= a %= b);
//     return a;
// }

inline ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); }

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) result = result * base % mod;
        power >>= 1;
        base = (base * base) % mod;
    }
    return result;
}

inline ll rd() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

// freopen("C:/Users/ASUS/Desktop/Struct/in.txt", "r", stdin); //输入重定向,输入数据将从in.txt文件中读取 
// freopen("C:/Users/ASUS/Desktop/Struct/out.txt", "w", stdout); //输出重定向,输出数据将保存out.txt文件中 
// fclose(stdin);//关闭重定向输入
// fclose(stdout);//关闭重定向输出                                                                                                                                                                                                                                                                                                                                                                                              


char x[4000010];
signed main(){
    int T;
    T=rd();
    while(T--){
        string s;
        string ss;
        cin>>s>>ss;
        if(s.size()>ss.size()){
            string tmp=s;
            s=ss;
            ss=tmp;
        } 
        int f=0;
        for(int i=1;i<=ss.size();i++){
            int nlen=s.size()*i;
            if(nlen%ss.size()!=0)continue;
            int ff=1;
            for(int j=0;j<nlen;j++){
                x[j]=s[j%s.size()];
                if(x[j]!=ss[j%ss.size()]){
                    ff=0;
                    break;
                }
            }
            if(ff==1){
                f=i;
                break;
            }
        }

        // printf("*%d\n",f);
        // for(int i=0;i<f*s.size();i++)
        //     printf("%c",x[i]);
        // printf("\n");


        if(f==0)printf("-1\n");
        else{
            for(int i=0;i<f;i++){
                cout<<s;
            }
            cout<<endl;
        }

    }


    //system("pause");
    return 0;
}
View Code

F.No More Inversions

#include<list>
#include<string.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<iomanip>
#include<cstdlib>
#include<stdexcept>
#include<fstream>
#include<iterator>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ll long long
#define int long long
const int maxn = 2e5+10;
const int inf = 0x3f3f3f3f;
const int Base = 131;
const ll INF = 1ll << 62;
//const double PI = acos(-1);
const double eps = 1e-7;
const int mod = 1e9+7;
#define PI acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define speed {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); }
#define wait while(1){}
#define debug cout<<"********"<<endl;

// inline int gcd(int a, int b) {
//     while (b ^= a ^= b ^= a %= b);
//     return a;
// }

inline ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); }

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) result = result * base % mod;
        power >>= 1;
        base = (base * base) % mod;
    }
    return result;
}

inline ll rd() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

// freopen("C:/Users/ASUS/Desktop/Struct/in.txt", "r", stdin); //输入重定向,输入数据将从in.txt文件中读取 
// freopen("C:/Users/ASUS/Desktop/Struct/out.txt", "w", stdout); //输出重定向,输出数据将保存out.txt文件中 
// fclose(stdin);//关闭重定向输入
// fclose(stdout);//关闭重定向输出                                                                                                                                                                                                                                                                                                                                                                                              

signed main(){
    int T;
    T=rd();
    while(T--){
        int n,k;
        n=rd();
        k=rd();
        if(n==k){
            for(int i=1;i<=k;i++)printf("%lld ",i);
            printf("\n");
        }else if(2*k-1==n){
            for(int i=k;i>=1;i--)printf("%lld ",i);
            printf("\n");
        }else{
            for(int i=1;i<2*k-n;i++)printf("%lld ",i);
            for(int i=k;i>=2*k-n;i--)printf("%lld ",i);
            printf("\n");
        }
    }
    //system("pause");
    return 0;
}
View Code

 G.Program

#include <string.h>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdexcept>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ll long long
#define int long long
const int maxn = 2e5 + 10;
const int inf = 0x3f3f3f3f;
const int Base = 131;
const ll INF = 1ll << 62;
// const double PI = acos(-1);
const double eps = 1e-7;
const int mod = 1e9 + 7;
#define PI acos(-1)
#define mem(a, b) memset(a, b, sizeof(a))
#define speed                        \
    {                                \
        ios::sync_with_stdio(false); \
        cin.tie(0);                  \
        cout.tie(0);                 \
    }
#define wait  \
    while (1) \
    {         \
    }
#define debug cout << "********" << endl;

// inline int gcd(int a, int b) {
//     while (b ^= a ^= b ^= a %= b);
//     return a;
// }

inline ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }

long long fastPower(long long base, long long power)
{
    long long result = 1;
    while (power > 0)
    {
        if (power & 1)
            result = result * base % mod;
        power >>= 1;
        base = (base * base) % mod;
    }
    return result;
}

inline ll rd()
{
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
        s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

// freopen("C:/Users/ASUS/Desktop/Struct/in.txt", "r", stdin);
// //输入重定向,输入数据将从in.txt文件中读取
// freopen("C:/Users/ASUS/Desktop/Struct/out.txt", "w", stdout);
// //输出重定向,输出数据将保存out.txt文件中 fclose(stdin);//关闭重定向输入
// fclose(stdout);//关闭重定向输出

//最大值是+1加上去的,最小值是-1减下去的,所以最大值减去最小值+1就是出现过的不同数数量
//所以维护一个中间出现值得最大值前缀和和最小值前缀和就能求解

char s[maxn];
int pre[maxn];
int preMax[maxn],preMin[maxn];
int sufMax[maxn],sufMin[maxn];

signed main(){
    int T = rd();
    while(T--){
        int n = rd();
        int m = rd();
        scanf("%s",s+1);
        int p = 0ll;
        pre[0] = 0ll;
        preMax[0] = 0ll;
        preMin[0] = 0ll;
        for(int i = 1; i <= n; i++){
            if(s[i]=='-')p--;
            else p++;

            if(p > preMax[i-1])preMax[i] = p;
            else preMax[i] = preMax[i-1];
            if(p < preMin[i-1])preMin[i] = p;
            else preMin[i] = preMin[i-1];

            pre[i] = p;

        }

        p=0ll;
        sufMax[n+1] = 0ll;
        sufMin[n+1] = 0ll;
        for(int i = n; i >= 1; i--){
            if(s[i] == '-')p=-1;
            else p=1;
            if(p + sufMax[i+1] > 0ll)sufMax[i] = p + sufMax[i+1];
            else sufMax[i] = 0ll;
            if(p + sufMin[i+1] < 0ll)sufMin[i] = p + sufMin[i+1];
            else sufMin[i] = 0ll;
        } 

        while(m--){
            int l = rd();
            int r = rd();
            int Max = max(max(0ll,preMax[l-1]),sufMax[r+1] + pre[l-1]);
            int Min = min(min(0ll,preMin[l-1]),sufMin[r+1] + pre[l-1]);
            printf("%lld\n",Max - Min + 1);
        }
    }
    
    //system("pause");
    return 0;
}
View Code

 

posted @ 2021-01-20 23:08  濡苏  阅读(28)  评论(0)    收藏  举报