没想到铜牌题复杂度+自己手敲区间修改&区间查询(没学过)+打铁..
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct vv{
int t,x;
}w[N],c[N];
bool cmp(vv a,vv b)
{
if(a.t==b.t) return a.x>b.x;
else return a.t<b.t;
}
struct Tree{
int l,r,mx;
}tr[N<<2];
//线段树存当前节点的左右端点,以及左右端点的mx.
int lazy[N<<2];//存下延缓更新的区间最大值.
void pushup(int u)//利用子节点信息来更新父节点.
{
tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
}
void pushdown(int u)//利用父亲节点的懒标记给子节点赋值.
{
if(!lazy[u]) return;
tr[u<<1].mx=max(tr[u<<1].mx,lazy[u]);
lazy[u<<1]=max(lazy[u],lazy[u<<1]);
tr[u<<1|1].mx=max(tr[u<<1|1].mx,lazy[u]);
lazy[u<<1|1]=max(lazy[u],lazy[u<<1|1]);
lazy[u]=0;
}
void build(int u,int l,int r)
{
if(l==r)
{
tr[u].l=tr[u].r=l;
tr[u].mx=0;
return;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,int L,int R,int val)//在根节点为u管辖区间[l,r]的时候找[L,R]更新max.
{
int mid=(l+r)>>1;
if(L<=l&&R>=r) { tr[u].mx=max(tr[u].mx,val); lazy[u]=max(lazy[u],val);return; }
pushdown(u);
if(R<=mid) modify(u<<1,l,mid,L,R,val);
else if(L>=mid+1) modify(u<<1|1,mid+1,r,L,R,val);
else
{
modify(u<<1,l,mid,L,mid,val);
modify(u<<1|1,mid+1,r,mid+1,R,val);
}
pushup(u);
}
int query(int u,int l,int r,int L,int R)//在根节点为u管辖区间[l,r]的时候找[L,R]的max.
{
int mid=(l+r)>>1;
if(L<=l&&R>=r)
{
return tr[u].mx;
}
pushdown(u);
if(R<=mid) return query(u<<1,l,mid,L,R);
else if(L>=mid+1) return query(u<<1|1,mid+1,r,L,R);
else
{
int ans = 0;
ans=max(ans,query(u<<1,l,mid,L,mid));
ans=max(ans,query(u<<1|1,mid+1,r,mid+1,R));return ans;
}
}
int main()
{
int g=0,T;
scanf("%d",&T);
while(T--)
{
int n,m,id=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=4*m;i++) lazy[i]=0;
for(int i=1;i<=n;i++) scanf("%d%d",&w[i].t,&w[i].x);//小周期和权值.
sort(w+1,w+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(w[i].t!=w[i-1].t||i==1) c[++id].t=w[i].t,c[id].x=w[i].x;
}
build(1,1,m);
for(int i=1;i<=id;i++)
{
for(int j=1;j<=m;j+=(2*c[i].t))
{
modify(1,1,m,j,min(j+c[i].t-1,m),c[i].x);
}
}
printf("Case #%d: ",++g);
for(int i=1;i<=m;i++)
{
if(i!=m) printf("%d ",query(1,1,m,i,i));
else printf("%d",query(1,1,m,i,i));
}puts("");
}
return 0;
}

京公网安备 11010502036488号