社区讨论
我们终于知道了那天所见的TLE线段树的常数
P2824[HEOI2016/TJOI2016] 排序参与者 5已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi7p8awz
- 此快照首次捕获于
- 2025/11/21 01:22 4 个月前
- 此快照最后确认于
- 2025/11/21 01:22 4 个月前
我还吸了氧
我很纳闷,我是不是写的暴力。

CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
inline int read()
{
char c=getchar();int num=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
num=num*10+c-'0';
return num;
}
const int N=1e5+5;
int n,m,pos;
int a[N],b[N];
struct OPT
{
int opt,l,r;
}opt[N];
#define Root tree[root]
#define lson tree[root].ls
#define rson tree[root].rs
#define Lson tree[lson]
#define Rson tree[rson]
struct Tree
{
int ls,rs,len;
int val;bool tag;
}tree[N<<1];
int now_node,ROOT;
void build(int &root,int l,int r)
{
if(!root) root=++now_node;
Root.len=r-l+1;Root.tag=0;
if(l==r)
{
Root.val=b[l];
return;
}
int mid=(l+r)>>1;
build(lson,l,mid),build(rson,mid+1,r);
Root.val=Lson.val+Rson.val;
}
void pushdown(int root)
{
Lson.val=Root.val?Lson.len:0;
Rson.val=Root.val?Rson.len:0;
Lson.tag=Rson.tag=1;
Root.tag=0;
}
void modify(int root,int l,int r,int L,int R,int x)
{
if(L>R||r<L||l>R) return;
if(l==L&&R==r)
{
Root.val=x*Root.len;
Root.tag=1;
return;
}
if(Root.tag)
pushdown(root);
int mid=(l+r)>>1;
if(R<=mid)
modify(lson,l,mid,L,R,x);
else if(L>mid)
modify(rson,mid+1,r,L,R,x);
else
modify(lson,l,mid,L,mid,x),modify(rson,mid+1,r,mid+1,R,x);
Root.val=Lson.val+Rson.val;
}
int query(int root,int l,int r,int L,int R)
{
if(l==r)
return Root.val;
if(Root.tag)
pushdown(root);
int mid=(l+r)>>1;
if(R<=mid)
return query(lson,l,mid,L,R);
else if(L>mid)
return query(rson,mid+1,r,L,R);
else
return query(lson,l,mid,L,mid)+query(rson,mid+1,r,mid+1,R);
}
int check(int x)
{
for(int i=1;i<=n;++i)
b[i]=a[i]>=x?1:0;
build(ROOT,1,n);
for(int i=1,cnt;i<=m;++i)
{
cnt=query(ROOT,1,n,opt[i].l,opt[i].r);
if(opt[i].opt==0)
{
modify(ROOT,1,n,opt[i].l,opt[i].r-cnt,0);
modify(ROOT,1,n,opt[i].r-cnt+1,opt[i].r,1);
}
else
{
modify(ROOT,1,n,opt[i].l,opt[i].l+cnt-1,1);
modify(ROOT,1,n,opt[i].l+cnt,opt[i].r,0);
}
}
return query(ROOT,1,n,pos,pos);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1;i<=m;++i)
opt[i].opt=read(),opt[i].l=read(),opt[i].r=read();
pos=read();
int l=1,r=n,mid,ans;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
l=mid+1,ans=mid;
else
r=mid-1;
}
cout<<ans;
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...