loj#534. 「LibreOJ Round #6」花团

不难发现他在线是假的。

时间段立刻可以想到线段树分治,做法显然了。注意下时间点和时间段的转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
 
#define ll long long
 
using namespace std;
int rd() {
    int f=1,sum=0; char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) {sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return sum*f;
}
ll lrd() {
    ll f=1,sum=0; char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) {sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return sum*f;
}
void pr(int x) {
    if(x<0) {putchar('-');x=-x;}
    if(x>9) pr(x/10);
    putchar(x%10+'0');
}
void lpr(ll x) {
    if(x<0) {putchar('-');x=-x;}
    if(x>9) lpr(x/10);
    putchar(x%10+'0');
}
/*
线段树分治是时间段! 0~1 一个时间段
*/
#define ls (cur<<1)
#define rs (ls|1)
#define max(A,B) (A>B?A:B)
#define il inline
 
const int N=(int)(1.5e4+5);
struct node {
    int v,w;
};
basic_string<node>T[N<<2];
ll f[40][N],nm,ans;
int sum[N<<2],n,m,TT;
 
void update(int cur,int l,int r,int cl,int cr,int v,int w) {
    if(cl<=l&&r<=cr) {
        T[cur]+=((node){v,w}); ++sum[cur]; return ;
    }
    int mid=(l+r)>>1;
    if(cl<=mid) update(ls,l,mid,cl,cr,v,w);
    if(cr>mid) update(rs,mid+1,r,cl,cr,v,w);
    sum[cur]=sum[ls]+sum[rs];
}
 
void solve(int cur,int l,int r,int dep) {
    for(int i=0;i<T[cur].size();i++) {
        for(int j=m;j>=T[cur][i].v;j--) f[dep][j]=max(f[dep][j],f[dep][j-T[cur][i].v]+T[cur][i].w);
    }
    if(l==r) {
        int op=rd(),x,y,z;
        if(op==1) {
            x=rd(); y=rd(); z=rd();
            x-=TT*ans; y-=TT*ans; z-=TT*ans;
            update(1,1,n,l+1,z,x,y);
        } else {
            x=rd(); x-=TT*ans;
            if(f[dep][x]<0) {
                puts("0 0"); ans=0;
            } else {
                printf("1 %lld\n",f[dep][x]); ans=(f[dep][x]^1);
            }
        }
        return ;
    }
    int mid=(l+r)>>1;
    for(int i=0;i<=m;i++) f[dep+1][i]=f[dep][i];
    solve(ls,l,mid,dep+1);
    for(int i=1;i<=m;i++) f[dep+1][i]=f[dep][i];
    solve(rs,mid+1,r,dep+1);
}
 
 
int main() {
    //freopen("bag.5.1.in","r",stdin); freopen("bag.5.1.out","w",stdout);
    n=rd(); m=rd(); TT=rd();
    for(int i=1;i<=m;i++) f[0][i]=-1ll*(2e18);
    solve(1,1,n,0);
    return 0;
}

  


__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/15170871.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示