xinyu04

导航

AtCoder Beginner Contest 247 C D E题解

https://atcoder.jp/contests/abc247/tasks/abc247_c

递归即可解决:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<string>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
typedef long long ll;
using namespace std;
typedef unsigned long long int ull;
#define maxn 200005
#define ms(x) memset(x,0,sizeof(x))
#define Inf 0x7fffffff
#define inf 0x3f3f3f3f
const int mod = 1e9 + 7;
#define pi acos(-1.0)
#define pii pair<int,int>
#define eps 1e-5
#define pll pair<ll,ll>
#define lson 2*x
#define rson 2*x+1

long long  qupower(int a, int b) {
    long long  ans = 1;
    while (b) {
        if (b & 1)ans = ans * a;
        b >>= 1;
        a = a * a;
    }
    return ans;
}

inline int read() {
    int an = 0, x = 1; char c = getchar();
    while (c > '9' || c < '0') {
        if (c == '-') {
            x = -1; 
        }
        c = getchar();
    }
    while (c >= '0'&&c <= '9') {
        an = an * 10 + c - '0'; c = getchar();
    }
    return an * x;
}

const int N = 65540;
int a[N];

void sol(int x){
    if(x==1){printf("1 ");return;}
    sol(x-1);
    printf("%d ",x);
    sol(x-1);
}

int main(){
    //ios::sync_with_stdio(false);
    int n; n = read();
    sol(n);
}

https://atcoder.jp/contests/abc247/tasks/abc247_d

不能用queue来模拟,复杂度过不去。我们只需要记录每一段的位置(前缀和维护),以及该段的value。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<string>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
typedef long long ll;
using namespace std;
typedef unsigned long long int ull;
#define maxn 200005
#define ms(x) memset(x,0,sizeof(x))
#define Inf 0x7fffffff
#define inf 0x3f3f3f3f
const int mod = 1e9 + 7;
#define pi acos(-1.0)
#define pii pair<int,int>
#define eps 1e-5
#define pll pair<ll,ll>
#define lson 2*x
#define rson 2*x+1

long long  qupower(int a, int b) {
    long long  ans = 1;
    while (b) {
        if (b & 1)ans = ans * a;
        b >>= 1;
        a = a * a;
    }
    return ans;
}

inline int read() {
    int an = 0, x = 1; char c = getchar();
    while (c > '9' || c < '0') {
        if (c == '-') {
            x = -1; 
        }
        c = getchar();
    }
    while (c >= '0'&&c <= '9') {
        an = an * 10 + c - '0'; c = getchar();
    }
    return an * x;
}

int Q;
//queue<ll> q;
ll ans = 0;
const int N = 2e5+5;
ll v[N],pos[N];
ll cnt=1;
ll cur_p = 1;
ll real_p = 0;


int main(){
    //ios::sync_with_stdio(false);
    Q = read();
    while(Q--){
        int q; q = read();
        if(q==1){
            ll x,c; scanf("%lld %lld", &x,&c);
            pos[cnt] = pos[cnt-1]+c;
            v[cnt] = x;
            cnt+=1;
        }
        else{
            ll c; scanf("%lld", &c);
            ll next_p = real_p+c;
            //cout<<"next pos:"<<next_p<<endl;
            ans=0;
            for(;cur_p<cnt;cur_p++){
                if(pos[cur_p]<=next_p){
                    ans+= ll(v[cur_p]*(pos[cur_p]-real_p));
                    real_p = pos[cur_p];
                }
                else{
                    ans+= ll(v[cur_p]*(next_p-real_p));
                    real_p = next_p;
                    break;
                }

            }
            
            //cout<<real_p<<endl;
            printf("%lld\n", ans);
        }
    }
}

https://atcoder.jp/contests/abc247/tasks/abc247_e

给定一个序列,以及两个数 X,Y. 问有多少子序列(连续的)满足:该序列的最小值为Y,最大值为X。

注意到的一点是:如果有一个数字不满足条件,即 a>X or a<Y,此时包含该数字的序列都不满足,所以我们可以根据不满足条件的数字来分割成小串。现在问题回到了如何对于满足条件的序列来统计数量。

我们使用双指针 L,R. 开始的时候移动右指针 R。当找到最小值和最大值时,即可break来统计数量。具体来说,如果区间 [ L, W ]满足条件,那么区间 [ L, i ],W< i < R都满足条件。最后移动左指针。

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<string>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
typedef long long ll;
using namespace std;
typedef unsigned long long int ull;
#define maxn 200005
#define ms(x) memset(x,0,sizeof(x))
#define Inf 0x7fffffff
#define inf 0x3f3f3f3f
const int mod = 1e9 + 7;
#define pi acos(-1.0)
#define pii pair<int,int>
#define eps 1e-5
#define pll pair<ll,ll>
#define lson 2*x
#define rson 2*x+1

long long  qupower(int a, int b) {
    long long  ans = 1;
    while (b) {
        if (b & 1)ans = ans * a;
        b >>= 1;
        a = a * a;
    }
    return ans;
}

inline int read() {
    int an = 0, x = 1; char c = getchar();
    while (c > '9' || c < '0') {
        if (c == '-') {
            x = -1; 
        }
        c = getchar();
    }
    while (c >= '0'&&c <= '9') {
        an = an * 10 + c - '0'; c = getchar();
    }
    return an * x;
}

const int N = 2e5 + 5;
int a[N];
int X,Y;
int n;
ll res=0;

ll cal(vector<int> &vec){
    ll ans=0;
    int l = 0, r = vec.size()-1;
    int lp=l,rp=l;
    int cnt_max=0, cnt_min = 0;
    //int len = r-l+1;
    while(lp<=r){
        while(rp<=r && (cnt_max==0 || cnt_min==0)){
            if(vec[rp]==X)cnt_max+=1;
            if(vec[rp]==Y)cnt_min+=1;
            rp+=1;
        }
        if(cnt_max>0 && cnt_min>0){
            ans = ans+ll(r-rp+2);
        }
        if(vec[lp]==X)cnt_max-=1;
        if(vec[lp]==Y)cnt_min-=1;
        lp+=1;
    }
    return ans;
}

void sol(){
    int i=0;
    int st=0,ed=0;
    while(i<n){
        // split to subproblem
        vector<int> vec;
        while(i<n && a[i]<=X && a[i]>=Y){vec.push_back(a[i]);i+=1;}
        if(vec.size()>0){
            res+= cal(vec);
        }
        else i+=1;
        
    }
}


int main(){
    //ios::sync_with_stdio(false);
    n = read();
    X = read(); Y = read();
    for(int i=0;i<n;i++) a[i] = read();
    sol();
    printf("%lld\n", res);
}

 

posted on 2022-04-26 01:31  Blackzxy  阅读(54)  评论(0编辑  收藏  举报