1. 程式人生 > 資訊 >騰訊 START 雲遊戲開始收費:會員 251 元/年,僅《英雄聯盟》等部分遊戲支援高幀率

騰訊 START 雲遊戲開始收費:會員 251 元/年,僅《英雄聯盟》等部分遊戲支援高幀率

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const ll N=1e5+11,M=2e5+11,Tree_Sz=2e6+11;
 5 ll n,xx[N][2],yy[N][2];
 6 ll num,b[M],Seg;
 7 
 8 inline ll re_ad() {
 9     char ch=getchar(); ll x=0,f=1;
10     while(ch<'0' || ch>'9') { if(ch=='-') f=-1;ch=getchar(); }
11 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 12 return x*f; 13 } 14 15 struct Segment { 16 ll x,y,ht,v; 17 inline bool operator < (const Segment &B) const { 18 return ht<B.ht; 19 } 20 }seg[M]; 21 22 inline void addseg(ll ht,ll x,ll y,ll v) {
23 seg[++Seg]=(Segment){x,y,ht,v}; 24 } 25 26 struct SegmentTree { 27 struct Node { 28 ll cnt,sum,val; 29 }t[Tree_Sz]; 30 inline void Pushup(ll d,ll l,ll r) { 31 if(t[d].cnt>=1) t[d].sum=t[d].val; 32 else t[d].sum=t[d<<1].sum+t[d<<1|1].sum; 33 }
34 void build(ll d,ll l,ll r) { 35 if(l==r) { 36 t[d].val=b[r+1]-b[l]; 37 return ; 38 } 39 ll mid=(l+r)>>1; 40 build(d<<1,l,mid); 41 build(d<<1|1,mid+1,r); 42 t[d].val=t[d<<1].val+t[d<<1|1].val; 43 } 44 inline void Build() { 45 build(1,1,num-1); 46 } 47 void modify(ll d,ll l,ll r,ll x,ll y,ll z) { 48 if(x<=b[l] && b[r+1]<=y) { 49 t[d].cnt+=z,Pushup(d,l,r); 50 return ; 51 } 52 ll mid=(l+r)>>1; 53 if(x<=b[mid]) modify(d<<1,l,mid,x,y,z); 54 if(y>b[mid+1]) modify(d<<1|1,mid+1,r,x,y,z); 55 Pushup(d,l,r); 56 } 57 inline void Modify(ll x,ll y,ll z) { 58 modify(1,1,num-1,x,y,z); 59 } 60 inline ll Query() { 61 return t[1].sum; 62 } 63 void search(ll d,ll l,ll r) { 64 printf("%lld %lld %lld %lld %lld %lld\n",d,l,r,t[d].val,t[d].cnt,t[d].sum); 65 if(l==r) return ; 66 ll mid=(l+r)>>1; 67 search(d<<1,l,mid),search(d<<1|1,mid+1,r); 68 } 69 }st; 70 71 int main() 72 { 73 n=re_ad(); 74 for(ll i=1;i<=n;++i) xx[i][0]=re_ad(),yy[i][0]=re_ad(),xx[i][1]=re_ad(),yy[i][1]=re_ad(); 75 for(ll i=1;i<=n;++i) b[i*2-1]=xx[i][0],b[i*2]=xx[i][1]; 76 sort(b+1,b+n*2+1); 77 num=unique(b+1,b+n*2+1)-b-1; 78 // for(int i=1;i<=n;++i) xx[i][0]=lower_bound(b+1,b+num+1,xx[i][0])-b,xx[i][1]=lower_bound(b+1,b+num+1,xx[i][1])-b; 79 st.Build(); 80 for(int i=1;i<=n;++i) addseg(yy[i][0],xx[i][0],xx[i][1],1),addseg(yy[i][1],xx[i][0],xx[i][1],-1); 81 // for(ll i=1;i<=n*2;++i) printf("%lld %lld %lld %lld\n",seg[i].x,seg[i].y,seg[i].ht,seg[i].v); puts(""); 82 sort(seg+1,seg+n*2+1); 83 // for(ll i=1;i<=n*2;++i) printf("%lld %lld %lld %lld\n",seg[i].x,seg[i].y,seg[i].ht,seg[i].v); puts(""); 84 ll ans=0; 85 for(ll i=1;i<=n*2-1;++i) { 86 st.Modify(seg[i].x,seg[i].y,seg[i].v); 87 ans+=(seg[i+1].ht-seg[i].ht)*st.Query(); 88 // printf("%lld %lld %lld %lld\n",seg[i].x,seg[i].y,seg[i].ht,seg[i].v); 89 // printf("%lld %lld %lld %lld\n",seg[i].ht,seg[i+1].ht,st.Query(),ans); 90 // st.search(1,1,num-1); 91 // puts(""); 92 } 93 printf("%lld\n",ans); 94 return 0; 95 }