ACM-ICPC 2015 BeiJing
阿新 • • 發佈:2018-11-07
本次比賽只寫了 A G 然後 I題隨後補
A
有一個正方形土地,上面有若干塊綠洲。讓你以x0為界限劃一條豎線,要求左邊綠洲面積>=右邊綠洲面積且兩者面積最接近。另外要求左邊的土地總面積最大。求x0
二分 or 掃描線
// 二分 #include<bits/stdc++.h> using namespace std; #define maxn 100010 #define LL long long struct ac{ LL x,y,l,h; }a[maxn]; LL n;bool cmp(ac q,ac w){ return q.x<w.x; } LL work(LL mid){ LL ans=0; for(LL j=0;j<n;j++){ if(a[j].l+a[j].x<=mid){ ans+=a[j].l*a[j].h; } else if(a[j].x<=mid&&(a[j].x+a[j].l)>=mid){ ans+=(mid-a[j].x)*a[j].h; }else return ans; } return ans; } int main(){ LL t; cin>>t; while(t--){ LL r,sum=0; cin>>r>>n; for(LL j=0;j<n;j++){ cin>>a[j].x>>a[j].y>>a[j].l>>a[j].h; if(a[j].x+a[j].l>=r){ a[j].l=r-a[j].x; } sum+=a[j].l*a[j].h; } //cout<<sum<<endl; sort(a,a+n,cmp); LL ll=1,rr=r+1,ans; while(ll<rr){ LL mid=(ll+rr)/2; ans=0; LL ans=work(mid); if(ans*2<sum){ ll=mid+1; }else rr=mid; } //cout<<ll<<" "<<rr<<endl; ans=work(ll); while(work(ll)<=ans&&ll<=r){ ll++; } cout<<ll-1<<endl; } } // 掃描線 #include<bits/stdc++.h> using namespace std; #define maxn 1000010 #define LL long long LL a[maxn]; int main(){ LL t; cin>>t; while(t--){ LL n,r,sum=0; cin>>r>>n; memset(a,0,sizeof(a)); for(LL j=0;j<n;j++){ LL x,y,z,zz; cin>>x>>y>>z>>zz; for(LL k=x+1;k<=x+z;k++){ a[k]+=zz; } sum+=(min(r,x+z)-x)*zz; } LL ans=0,j; for(j=1;j<r&&ans*2<sum;j++){ ans+=a[j]; //cout<<ans<<" "<<j<<endl; } while(a[j]==0&&j<=r){ j++; } cout<<j-1<<endl; } }
G
給你四個矩形 選出來三個看是否可以組成新的矩陣
資料很小直接全排列暴力列舉
#include<bits/stdc++.h> using namespace std; struct ac{ int x,y; }a[10]; int b[10]; bool work(){ bool i=0; int w=a[b[0]].x; int h=a[b[0]].y; int ww=a[b[1]].x; int hh=a[b[1]].y; int www=a[b[2]].x; int hhh=a[b[2]].y; if(w==ww){ h+=hh; i=1; }else if(w==hh){ h+=ww; i=1; }else if(h==ww){ w+=hh; i=1; }else if(h==hh){ w+=ww; i=1; } if(i==0) return 0; i=0; if(www==w){ i=1; }else if(w==hhh){ i=1; }else if(h==www){ i=1; }else if(h==hhh){ i=1; } if(i) return 1; else return 0; } int main(){ int t; cin>>t; while(t--){ for(int j=0;j<4;j++){ cin>>a[j].x>>a[j].y; b[j]=j; } bool fa=0; do{ if(work()){ fa=1; break; } }while(next_permutation(b,b+4)); if(fa){ cout<<"Yes"<<endl; }else cout<<"No"<<endl; } }