hdu 3544 Farming(掃描線)

來源:互聯網
上載者:User

題意:有N塊農田,每塊農田中種一種作物,每種作物都有一個價格,當在同一地區內種植了兩種不同的作物時,作物價格大的生存下來,作物價格小的死亡。求最後的所有作物的能買的總錢數。

       將作物的價格轉化為高,問題就變成了求長方體體積的並了,用法跟hdu 3642 Get The Treasure很類似。

#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <map>using namespace std;#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define MID(a,b) (a+((b-a)>>1))typedef long long LL;const int N=60005;struct CUBE{int x1,y1,z1;int x2,y2,z2;CUBE(){}CUBE(int a,int b,int c,int d,int e){x1=a; y1=b; z1=0;x2=c; y2=d; z2=e;}}cube[N];struct Line{int x,y1,y2,flag;Line(){}Line(int a,int b,int c,int d){ x=a; y1=b; y2=c; flag=d; }bool operator<(const Line &b)const{ return x<b.x; }};struct node{int lft,rht;int len[2],flag;int mid(){return MID(lft,rht);}};int price[10],n,m;vector<int> y,z;vector<Line> line;map<int,int> H;struct Segtree{node tree[N*4];void calu(int ind){if(tree[ind].flag>=1) tree[ind].len[1]=tree[ind].len[0];else{if(tree[ind].lft+1==tree[ind].rht) tree[ind].len[1]=0;else tree[ind].len[1]=tree[LL(ind)].len[1]+tree[RR(ind)].len[1];}}void build(int lft,int rht,int ind){tree[ind].lft=lft;tree[ind].rht=rht;tree[ind].flag=0;tree[ind].len[1]=0;tree[ind].len[0]=y[rht]-y[lft];if(lft+1!=rht){int mid=tree[ind].mid();build(lft,mid,LL(ind));build(mid,rht,RR(ind));}}void updata(int st,int ed,int ind,int valu){int lft=tree[ind].lft,rht=tree[ind].rht;if(st<=lft&&rht<=ed) tree[ind].flag+=valu;else {int mid=tree[ind].mid();if(st<mid) updata(st,ed,LL(ind),valu);if(ed>mid) updata(st,ed,RR(ind),valu);}calu(ind);}}seg;int main(){int t,t_cnt=0;scanf("%d",&t);while(t--){y.clear(); z.clear(); H.clear(); line.clear();scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) scanf("%d",&price[i]);for(int i=0;i<n;i++){int x1,y1,x2,y2,z2;scanf("%d%d",&x1,&y1);scanf("%d%d%d",&x2,&y2,&z2);z2=price[z2];y.push_back(y1); y.push_back(y2);z.push_back(z2);cube[i]=CUBE(x1,y1,x2,y2,z2);}z.push_back(0);sort(y.begin(),y.end());sort(z.begin(),z.end());y.erase(unique(y.begin(),y.end()),y.end());z.erase(unique(z.begin(),z.end()),z.end());for(int i=0;i<(int)y.size();i++) H[y[i]]=i;LL res=0;seg.build(0,(int)y.size()-1,1);for(int i=0;i<(int)z.size()-1;i++){line.clear();for(int j=0;j<n;j++){if(cube[j].z1<=z[i]&&cube[j].z2>=z[i+1]){line.push_back(Line(cube[j].x1,cube[j].y1,cube[j].y2,1));line.push_back(Line(cube[j].x2,cube[j].y1,cube[j].y2,-1));}}sort(line.begin(),line.end());for(int j=0;j<(int)line.size();j++){if(j!=0) res+=(LL)(z[i+1]-z[i])*(line[j].x-line[j-1].x)*seg.tree[1].len[1];seg.updata(H[line[j].y1],H[line[j].y2],1,line[j].flag);}}printf("Case %d: %I64d\n",++t_cnt,res);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.