求解30分

P1496 火烧赤壁


by Freddie @ 2017-09-26 13:09:32


我想说几句: 曹操没事计算钻入火海的船的长度干嘛??? 气疯了么??? 还有,为什么非要找我计算呢??? 为啥不找万能的小明???
by 6QWQ6 @ 2017-11-23 19:35:19


同求
by o_cean @ 2018-07-06 23:25:29


```cpp #include <bits/stdc++.h> #define R register using namespace std; const int maxn=1e5+7; template <typename T> void inline read(T &x){ x=0;int f=1;char ch=getchar();if(ch==EOF) return ; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();} x*=f; } template <typename T> void inline write(T x){ if(x<0) x=-x,putchar('-'); if(x>9) write(x/10); putchar(x%10+'0'); } typedef long long ll; struct node{ ll l,r; bool operator<(node const x)const { return l<x.l; } }p[maxn]; ll cnt=0; int main(){ int n;read(n); for(int i=1;i<=n;i++){ read(p[i].l);read(p[i].r); } sort(p+1,p+1+n); for(int i=1;i<=n;i++){ if(p[i+1].l<p[i].r){ p[i+1].l=p[i].r; } if(p[i].l>p[i].r) continue; cnt+=p[i].r-p[i].l; } cout<<cnt; return 0; } /* 3 -1 1 5 11 2 9 */ ```
by o_cean @ 2018-07-06 23:26:16


同求 ``` #include<bits/stdc++.h> using namespace std; struct Node { int l,r; }a[20010]; bool cmp(Node a,Node b) { if(a.l==b.l) { return a.r<b.r; } return a.l<b.l; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].l>>a[i].r; } sort(a+1,a+n+1,cmp); long long l=a[1].l,r=a[1].r,ans=0; for(int i=2;i<=n;i++) { if(a[i].l>r) { ans+=r-l; l=a[i].l; r=a[i].r; } else { r=a[i].r; } } ans+=r-l; cout<<ans<<endl; } ```
by partychicken @ 2018-07-13 10:50:01


同求 ```pascal var n,i,sum:longint; a,b:array[1..100000] of longint; procedure kuai(t,w:longint); var tt,ww,x,h:longint; begin tt:=t;ww:=w; x:=a[(t+w) div 2]; while t<=w do begin while a[t]<x do t:=t+1; while a[w]>x do w:=w-1; if t<=w then begin h:=a[t];a[t]:=a[w];a[w]:=h; h:=b[t];b[t]:=b[w];b[w]:=h; t:=t+1; w:=w-1; end; end; if t<ww then kuai(t,ww); if tt<w then kuai(tt,w); end; begin readln(n); for i:=1 to n do begin readln(a[i],b[i]); end; kuai(1,n); sum:=b[1]-a[1]; for i:=2 to n do begin if (a[i]>=a[i-1]) and (b[i]<=b[i-1]) then continue else if (a[i]<b[i-1]) and (b[i]>b[i-1]) then a[i]:=b[i-1]+1; sum:=sum+b[i]-a[i]; end; writeln(sum); end. ```
by 宇宙穿梭 @ 2018-08-14 10:49:54


因为前一个区间的右端点可能并不是最靠右的, 比如 [1,10],[2,3],[4,11]. 这样的话你并不会去选[2,3],但是你的第三个区间不能和它比较。 ```cpp #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct cym{ int l,r; }e[20010]; long long n,ans; int cmp(const cym &x,const cym &y) { if(x.l!=y.l) return x.l<y.l; return x.r<y.r; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&e[i].l,&e[i].r); if(e[i].r<e[i].l)swap(e[i].l,e[i].r); } sort(e+1,e+1+n,cmp); for(int i=1;i<=n;i++) { if(i==1) { ans+=e[i].r-e[i].l; continue; } if(e[i].l<e[i-1].r)e[i].l=e[i-1].r; if(e[i].l>=e[i].r)continue; ans+=e[i].r-e[i].l; } printf("%lld",ans); }//30 ``` ``` #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct cym{ int l,r; }e[20010]; long long n,ans,_end; int cmp(const cym &x,const cym &y) { if(x.l!=y.l) return x.l<y.l; return x.r<y.r; } int main() { scanf("%lld",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&e[i].l,&e[i].r); if(e[i].r<e[i].l)swap(e[i].l,e[i].r); } sort(e+1,e+1+n,cmp); for(int i=1;i<=n;i++) { if(i==1) { ans+=e[i].r-e[i].l; _end=e[i].r; continue; } if(e[i].r<=_end)continue; if(e[i].l<_end)e[i].l=_end; if(e[i].l>=e[i].r)continue; ans+=e[i].r-e[i].l; _end=e[i].r; } printf("%lld",ans); }//ac ```
by _ZZH @ 2018-09-21 17:16:06


|