社区讨论
10分,但大样例全过,对拍没随到hack,救命!!
P9588「MXOI Round 2」队列参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lzasbrmn
- 此快照首次捕获于
- 2024/08/01 12:37 2 年前
- 此快照最后确认于
- 2024/08/01 14:39 2 年前
离线处理,靠前缀和,线段树和二分实现操作
我觉得用不着带修线段树所以没用
CPP#include<bits/stdc++.h>
#define ll long long
#define int long long
#define lc p<<1
#define rc p<<1|1
using namespace std;
const int N=2e5+7;
inline int read()
{
register int ret=0,w=1;
register char c=getchar();
while(!isdigit(c)) {
if(c=='-') w=-1;
c=getchar();
} while(isdigit(c)) {
ret=(ret<<1)+(ret<<3)+(c^48);
c=getchar();
} return ret*w;
}
ll a[N];
struct Tr{
int l,r,mx;
}tr[N<<2];
void push_up(int p)
{
tr[p].mx=max(tr[lc].mx,tr[rc].mx);
}
void build(int p,int l,int r)
{
tr[p].l=l,tr[p].r=r;
if(l==r) return tr[p].mx=a[l],void();
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
push_up(p);
}
int query(int p,int x,int y,int ans=0)
{
if(x<=tr[p].l&&y>=tr[p].r) return tr[p].mx;
int mid=(tr[p].l+tr[p].r)>>1;
if(x<=mid) ans=max(ans,query(lc,x,y));
if(y>mid) ans=max(ans,query(rc,x,y));
return ans;
}
struct node{
int opt,x;
}k[N];
int tzz=1,mazz,enzz;
int tnum=1,mx;
int q,cnt;
ll sum[N];
signed main()
{
int c=read();
q=read();
for(int i=1;i<=q;i++)
{
k[i].opt=read();
if(k[i].opt!=4) k[i].x=read();
if(k[i].opt==1) sum[++cnt]=sum[cnt-1]+k[i].x,a[cnt]=k[i].x;
}
if(cnt) build(1,1,cnt);
bool f=1;
for(int i=1;i<=q;i++)
{
if(k[i].opt==1)
{
f=0;
enzz++;
}
if(k[i].opt==2)
{
int len=a[tzz]-tnum+1;
if(k[i].x<len) tnum+=k[i].x;
else
{
k[i].x-=len;
k[i].x++;
if(k[i].x+sum[tzz]>sum[enzz])
{
f=1;
tnum=1,tzz=enzz+1;
continue;
}
int p=lower_bound(sum+tzz+1,sum+enzz+1,sum[tzz]+k[i].x)-sum;
tnum=k[i].x+sum[tzz]-sum[p-1];
tzz=p;
}
}
if(k[i].opt==3)
{
int len=a[tzz]-tnum+1;
if(k[i].x<=len) printf("%lld\n",tnum+k[i].x-1);
else
{
k[i].x-=len;
int p=lower_bound(sum+tzz+1,sum+enzz+1,sum[tzz]+k[i].x)-sum;
printf("%lld\n",k[i].x+sum[tzz]-sum[p-1]);
}
}
if(k[i].opt==4)
{
if(f) puts("0");
else printf("%lld\n",query(1,tzz,enzz));
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...