给一段长度为n,每个位置上的数都不同的序列a[1..n]和q和问答,每个问答是(x, y, r)代表RMQ(a, x, y) = r, 要你给出最早的有矛盾的那个问答的编号。(此处 RMQ 指最小值)
毫无头绪的一题 看了题解实在是精妙
显然如果有矛盾的话显然只有两种情况
1最小值相同的多个问答一定要有交集(因为每种数字只有一个)
2最小值比较小的问答的交集 如果在最小值比较大 的并集内
因为答案满足单调性 所以可以用二分答案!!!
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ///////////////////////////////////// const int N=1e6+100; int t[N<<2],n,m,q,len[N<<2],col[N<<2]; void build(int l,int r,int pos) { len[pos]=r-l+1;col[pos]=0; if(l==r){t[pos]=0;return;} int m=(l+r)>>1; build(l,m,pos<<1); build(m+1,r,pos<<1|1); t[pos]=t[pos<<1]+t[pos<<1|1]; } void down(int pos) { if(!col[pos])return ; col[pos<<1]=col[pos<<1|1]=1;col[pos]=0; t[pos<<1]=len[pos<<1]; t[pos<<1|1]=len[pos<<1|1]; } void upsum(int L,int R,int l,int r,int pos) { if(L<=l&&r<=R){t[pos]=len[pos];col[pos]=1;return ;} int m=(l+r)>>1;down(pos); if(L<=m)upsum(L,R,l,m,pos<<1); if(R>m)upsum(L,R,m+1,r,pos<<1|1); t[pos]=t[pos<<1]+t[pos<<1|1]; } int qsum(int L,int R,int l,int r,int pos) { if(L<=l&&r<=R)return t[pos]; int m=(l+r)>>1,ans=0;down(pos); if(L<=m)ans+=qsum(L,R,l,m,pos<<1); if(R>m)ans+=qsum(L,R,m+1,r,pos<<1|1); return ans; } struct node { int L,R,v; }s[N],a[N]; bool check(int x) { build(1,n,1); rep(i,1,x)a[i]=s[i]; sort(a+1,a+1+x,[](node a,node b){return a.v>b.v;}); int pre=1,nl=a[1].L,nr=a[1].R,ul=a[1].L,ur=a[1].R; rep(i,2,x) { if(a[i].v==a[pre].v) { nl=max(nl,a[i].L); ul=min(ul,a[i].L); nr=min(nr,a[i].R); ur=max(ur,a[i].R); } else { if(nl>nr)return false; if(nr-nl+1==qsum(nl,nr,1,n,1))return false; upsum(ul,ur,1,n,1); pre=i; nl=ul=a[i].L; nr=ur=a[i].R; } } if(nl>nr)return false; if(nr-nl+1==qsum(nl,nr,1,n,1))return false; return true; } int main() { scanf("%d%d",&n,&m);rep(i,1,m)scanf("%d%d%d",&s[i].L,&s[i].R,&s[i].v); int L=1,R=m,ans=-1; while(L<=R) { int mid=(L+R)>>1; if(check(mid))ans=mid,L=mid+1; else R=mid-1; } if(ans==m)printf("0"); else printf("%d ",ans+1); return 0; }