社区讨论
CDQ分治TLE10分求助
P3287[SCOI2014] 方伯伯的玉米田参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m2o3ag41
- 此快照首次捕获于
- 2024/10/25 10:04 去年
- 此快照最后确认于
- 2025/11/04 16:15 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e4+10,M=505,A=5005,inf=A+M;
struct segmenttree{
int root,pcnt;
struct node{
int mx,ls,rs;
}t[inf<<2];
int new_node(){
int p=++pcnt;t[p].ls=t[p].rs=t[p].mx=0;
return p;
}
void clear(){
root=pcnt=0;
}
void push_up(int p){
if(!t[p].ls)t[p].ls=new_node();
if(!t[p].rs)t[p].rs=new_node();
t[p].mx=max(t[t[p].ls].mx,t[t[p].rs].mx);
}
void modify(int l,int r,int x,int d,int &p){
if(!p)p=new_node();
if(l==r){t[p].mx=max(t[p].mx,d);return ;}
int mid=l+r>>1;
if(mid>=x)modify(l,mid,x,d,t[p].ls);
else modify(mid+1,r,x,d,t[p].rs);
push_up(p);
}
int query(int l,int r,int L,int R,int p){
if(!p)return 0;
if(l>=L&&r<=R)return t[p].mx;
int mid=l+r>>1,ret=0;
if(mid>=L)ret=max(ret,query(l,mid,L,R,t[p].ls));
if(mid<R)ret=max(ret,query(mid+1,r,L,R,t[p].rs));
return ret;
}
}s;
int n,m;
int cnt;
struct node{
int x,y,z,f,id;
/*
转移要求:
a.x<b.x
a.y<=b.y
a.z<=b.z
*/
}a[N*M];
bool cmpid(node a,node b){
return a.id<b.id;
}
bool cmpy(node a,node b){
return (a.y==b.y)?(a.id<b.id):(a.y<b.y);
}
void solve(int l,int r){
if(l>=r||a[l].x==a[r].x)return ;
int mi=a[l+r>>1].x;
int mid;
for(int i=l;i<=r;i++)if(a[i].x<=mi)mid=i;
solve(l,mid);
sort(a+l,a+r+1,cmpy);
s.clear();
for(int i=l;i<=r;i++){
if(a[i].id<=mid){
s.modify(0,inf,a[i].z,a[i].f,s.root);
}
else{
a[i].f=max(a[i].f,s.query(0,inf,0,a[i].z,s.root)+1);
}
}
sort(a+l,a+r+1,cmpid);
solve(mid+1,r);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int A;cin>>A;
for(int j=0;j<=m;j++){
cnt++;
a[cnt].x=i;
a[cnt].y=j;
a[cnt].z=A+j;
a[cnt].id=cnt;
a[cnt].f=1;
}
}
solve(1,cnt);
int ans=0;
for(int i=1;i<=cnt;i++)ans=max(ans,a[i].f);
cout<<ans<<"\n";
return 0;
}
就比暴力高了10分,其它全TLE了。
回复
共 0 条回复,欢迎继续交流。
正在加载回复...