1. 程式人生 > >ACM-ICPC 2015 BeiJing

ACM-ICPC 2015 BeiJing

比賽連線:ACM-ICPC 2015 BeiJing

本次比賽只寫了 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;
    }
}