94分求调WAon #2
查看原帖
94分求调WAon #2
667250
Xiphi楼主2024/10/19 22:35

答案 620,输出752.代码简单易懂,求调。

#include<bits/stdc++.h>
#define _for(i,x,y) for(int i=x;i<=y;++i)
#define _forp(i,x,y,z) for(int i=x;i<=y;i+=z)
#define _rep(i,x,y) for(int i=x;i<y;++i)
using namespace std;
#define int long long
int n,q;
struct node{
	int l,r,x;
}a[25005];
bool cmp(node x,node y){
	return x.x>y.x;
}
int f[1000005];
int lowbit(int x){return x&-x;}
int query(int x){
	int ans=0;
	while(x){
		ans=max(ans,f[x]);
		x-=lowbit(x);
	}
	return ans;
}
void change(int pos,int x){
	while(pos<=n){
		f[pos]=max(f[pos],x);
		pos+=lowbit(pos);
	}
}
bool check(int pos){
	memset(f,-1,sizeof f);
	vector<node> v;
	_for(i,1,pos){
		v.push_back(a[i]);
	}
	sort(v.begin(),v.end(),cmp);
	int r=0;
	// cout<<pos<<':'<<'\n';
	for(int i=0;i<v.size();i=r+1){
		int mnl=0x3f3f3f3f3f3f3f3f,mnr=0x3f3f3f3f3f3f3f3f,mxl=0,mxr=0;
		r=i;
		while(r<v.size()&&v[r].x==v[i].x){
			mnl=min(mnl,v[r].l);
			mxl=max(mxl,v[r].l);
			mnr=min(mnr,v[r].r);
			mxr=max(mxr,v[r].r);
			if(r==v.size()-1||v[r+1].x!=v[i].x) break;
			else r++;
		}
		if(mxl>mnr){
			return 0;
		}
		if(query(mxl)>=mnr) return 0;
		change(mnl,mxr);
	}
	return 1;
}
signed main(){
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    cin>>n>>q;
    _for(i,1,q){
    	cin>>a[i].l>>a[i].r>>a[i].x;
    }
    int l=1,r=q,res=0;
    while(l<=r){
    	int mid=l+r>>1;
    	// cout<<mid<<'\n';
    	if(check(mid)) res=mid,l=mid+1;
    	else r=mid-1;
    }
    cout<<(res==q?0:res+1);
	return 0;
}
2024/10/19 22:35
加载中...