80分的离散差分wa第二个点求助

P2434 [SDOI2005] 区间

```cpp #include<bits/stdc++.h> using namespace std; struct line{ int w,lr; int operator < (const line&t)const{ return w<t.w||(w==t.w&&!lr); } }seg[(50000<<1)+10]; int n,cnt,l=0,k=0; int main(){ cin>>n; for(int i=1;i<=n;i++){ int x,y; cin>>x>>y; seg[++l]=(line){x,0}; seg[++l]=(line){y,1}; }sort(seg+1,seg+(n<<1)+1); cnt=seg[1].w; for(int i=1;i<=(n<<1);i++){ if(seg[i].lr) {--k;if(!k){cout<<cnt<<' '<<seg[i].w<<endl;cnt=0;}} else{ if(!cnt) cnt=seg[i].w; k++; } } return 0; }``` 这样就可以AC,但是完全看不出这两种处理方式有什么不同,每次输出都是建立在上个坐标包含的所有端点都处理过了的基础上的啊。。。。
by xeonz1 @ 2018-09-28 23:43:36


```cpp #include<bits/stdc++.h> using namespace std; struct line{ int w,lr; int operator < (const line&t)const{ return w<t.w||(w==t.w&&!lr); } }seg[(50000<<1)+10]; int n,cnt,l=0,k=0;; int main(){ cin>>n; for(int i=1;i<=n;i++){ int x,y; cin>>x>>y; seg[++l]=(line){x,0}; seg[++l]=(line){y,1}; }sort(seg+1,seg+(n<<1)+1); cnt=seg[1].w; for(int i=1;i<=(n<<1);i++){ if(seg[i].lr) --k; else{ if(!k&&i!=1) { cout<<cnt<<' '<<seg[i-1].w<<endl; cnt=seg[i].w; }k++; } }cout<<cnt<<' '<<seg[(n<<1)].w; return 0; }``` 放错代码。。
by xeonz1 @ 2018-09-28 23:45:25


明白哪里错了 扫描顺序没定好
by xeonz1 @ 2018-09-29 19:58:48


不是你的问题,第二个点是个**,它出现了$a=b$的情况.
by kyEEcccccc @ 2020-02-21 13:56:20


|