ABC379(DEF)

D

题意:
操作1:种花
操作2:等待k天,已经种下的花长了k cm
操作3:将所有高度大于等于H的花收割,输出收割花的个数

思路:
队列,将先种的花以及种下的天数塞进队列,查询时当差值当前DAY-花种下的时间大于等于H出队并统计

void solve(){
    int q;cin>>q;
    priority_queue<int,vector<int>,greater<int>>qe;
    int day=0;
    while(q--){
        int opt;cin>>opt;
        if(opt==1){
            qe.push(day);
        }else if(opt==2){
            int t;cin>>t;day+=t;
        }else{
            int h;cin>>h;
            int now=day;
            int cnt=0;
            while(qe.size()){
                int dif=now-qe.top();
                if(dif>=h){
                    cnt++;
                    qe.pop();
                }else break;
            }
            cout<<cnt<<endl;
        }
    }

}

E

题意:
给定一个长度为n的字符串
定义f(i,j)=..略
求...
思路:
倒着看,发现当字符串为1234时,答案为:
4
3
34
2
23
234
1
12
123
1234
等于:
4+ (4+33) +(4+33+222) +(4+33+222+1111)
本来想着用python处理一下大整形的

n=int(input())
data=input()


ans,res,cnt=0,0,1
for i in reversed(data):
    res+=cnt*int(i)
    ans+=res
    cnt=cnt*10+1

print(ans)

不过应该是太大了RE+TLE
考虑模拟进位
将每一位的对答案每一位的贡献算一下,十进制进位即可

int a[maxn];
void solve(){
    int n;cin>>n;
    string s;cin>>s;s=" "+s;
    int sum=0;
    rep(i,1,n){
        sum+=i*(s[i]-'0');
    }
    rep(i,1,n){
        a[i]+=sum;
        sum-=(n-i+1)*(s[n-i+1]-'0');
    }
    int temp=1;
    for(int i=1;;i++){
        if(!a[i]){
            temp=i;break;
        }
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }
    for(int i=temp-1;i>=1;i--){
        cout<<a[i];
    }
    cout<<endl;
}

F

题意:
一个高度数组,如果i~j之间没有高于j的数,则称i可以看到j
现在给出(a,b),请你输出(b+1,b+2..n)中可以被a,b两者看到的元素数量
思路:
预处理出单调栈数组,即每个数左边第一个大于它的数的位置
显然只要 (b+1,b+2,....n)中的数左边第一个大于它的数的位置小于等于a,说明满足条件
不妨离线查询
将查询按右端点从大到小排序
从右往左将每个数的单调栈数组塞入树状数组统计即可

struct node{
    int l,r;
    int idx;
    bool operator<(const node&a)const{
        return r<a.r;
    }
};

int n;
int bit[maxn];
int lowbit(int x){return x&-x;}
void add(int p,int x){
    while(p<=n){
        bit[p]+=x;
        p+=lowbit(p);
    }
}

int query(int r){
    int res=0;
    while(r){
        res+=bit[r];
        r-=lowbit(r);
    }
    return res;
}

void solve(){
    int q;cin>>n>>q;
    vector<int>a(n+1);
    vector<int>hi(n+1);

    rep(i,1,n)cin>>a[i];
    stack<int>stk;
    for(int i=n;i>=1;i--){
        while(stk.size()&&a[stk.top()]<a[i]){
            hi[stk.top()]=i;
            stk.pop();
        }
        stk.push(i);
    }
    while(stk.size()){
        hi[stk.top()]=0;
        stk.pop();
    }

    vector<node>qr(q+1);
    rep(i,1,q){
        int l,r;cin>>l>>r;
        qr[i]=(node){l,r,i};
    }
    sort(qr.begin()+1,qr.end());
    int p=n;
    // rep(i,1,n){
        // debug(hi[i]);
    // }
    vector<int>ans(q+1);
    int cnt=0;
    for(int i=q;i>=1;i--){
        int L=qr[i].l;
        int R=qr[i].r;
        // L++;R++;
        while(p>R){
            if(!hi[p])cnt++;
            else{
                add(hi[p],1);
            }
            p--;
        }
        int idx=qr[i].idx;
        ans[idx]=query(L)+cnt;
        //[1,l-1]
    }

    rep(i,1,q){
        cout<<ans[i]<<endl;
    }
}
posted @ 2025-06-17 20:44  Marinaco  阅读(17)  评论(0)    收藏  举报
//雪花飘落效果