bzoj4378

本文详细解析了POI2015竞赛中的物流问题,涉及序列操作、正数选择及减一操作的可行性判断。通过高效的数据结构和算法实现,解决了大规模数据输入下的快速响应挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4378: [POI2015]Logistyka

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 518  Solved: 264
[Submit][Status][Discuss]

Description

维护一个长度为n的序列,一开始都是0,支持以下两种操作:
1.U k a 将序列中第k个数修改为a。
2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作。
每次询问独立,即每次询问不会对序列进行修改。

Input

第一行包含两个正整数n,m(1<=n,m<=1000000),分别表示序列长度和操作次数。
接下来m行为m个操作,其中1<=k,c<=n,0<=a<=10^9,1<=s<=10^9。

Output

包含若干行,对于每个Z询问,若可行,输出TAK,否则输出NIE。

Sample Input

3 8
U 1 5
U 2 7
Z 2 6
U 3 1
Z 2 6
U 2 2
Z 2 6
Z 2 1

Sample Output

NIE
TAK
NIE
TAK
#include<algorithm>
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int N=1000005;
struct node{
    int siz,sum;
    friend node operator + (node i,node j){
        return (node){i.siz+j.siz,i.sum+j.sum};
    }
}t[N];
int n,a[N],sor[N],k[N],c[N],m;
char ch[N][2];
void add(int i,node val){
    for (;i<=m+2;i+=(i&(-i)))
        t[i]=t[i]+val;
}
node query(int i){
    node sum=(node){0,0};
    for (;i;i-=(i&(-i)))
        sum=sum+t[i];
    return sum;
}
main (){
    scanf ("%lld%lld",&n,&m);
    add(1,(node){n,0});
    for (int i=1;i<=m;++i){
        scanf ("%s%lld%lld",ch[i],&k[i],&c[i]);
        sor[i]=c[i];
    }
    sort(sor+1,sor+m+1);
    for (int i=1;i<=m;++i){
        int t=lower_bound(sor+1,sor+m+1,c[i])-sor;
        if (ch[i][0]=='U'){
            add(a[k[i]]+1,(node){-1,-sor[a[k[i]]]});
            a[k[i]]=t;
            add(t+1,(node){1,c[i]});
        }
        else {
            node tmp=query(t+1);
            if ((n-tmp.siz)*c[i]+tmp.sum>=c[i]*k[i])puts("TAK");
            else puts("NIE");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值