| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求救今天网络赛 F 题(Farming)一直WA,找不到错了……谁能提供几组强力数组也好啊~~
方法:
1.以x坐标排序为扫描线,n个人也按照x坐标排序
2.每次,求相邻的两条扫描线之间的面积;
3.对于相邻的两条扫描线之间,用离散化y坐标的线段树确定矩形的高,两条扫描线之间的距离为宽
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 60000
#define M 30011
struct node{
int x1,x2,y1,y2;
int s;
};
int tree[N*5];
node p[M];
int x[3*M];
int y[3*M];
int n,m;
int pi[100];
long long ans;
int px,py;
bool cmp(node a,node b){
return a.x1 < b.x1 || (a.x1 == b.x1 && a.x2 < b.x2);
}
bool cmp1(int a,int b){
return a<b;
}
void insert(int l,int r,int s,int t,int k,int pos){
//cout<<y[l]<<" "<<y[r]<<" "<<s<<" "<<t<<endl;
if (tree[pos] >= k) return;
if (y[l] == s && y[r] == t && tree[pos] == -1) {
tree[pos] = k;
return;
}
if (r - l <= 1) {
tree[pos] = max(tree[pos],k);
return;
}
if (tree[pos] != 0){
tree[pos<<1] = tree[(pos<<1)+1] = tree[pos];
tree[pos] = 0;
}
int mid = (l+r)>>1;
if (t <= y[mid]) insert(l,mid,s,t,k,pos<<1);
else if (y[mid] <= s) insert(mid,r,s,t,k,(pos<<1)+1);
else{
insert(l,mid,s,y[mid],k,pos<<1);
insert(mid,r,y[mid],t,k,(pos<<1)+1);
}
}
long long getArea(int l,int r,int pos){
long long res = 0;
if (tree[pos] == -1) return 0;
else if (r - l == 1 || tree[pos] > 0) {
res = (long long)tree[pos]*(y[r]-y[l]);
}
else if (tree[pos] == 0){
int mid = (l+r)>>1;
res = getArea(l,mid,pos<<1)+getArea(mid,r,(pos<<1)+1);
}
return res;
}
int main(){
int T,index = 0;
scanf("%d",&T);
while (T--){
px = 0;
py = 0;
scanf("%d %d",&n,&m);
for (int i=1 ;i<=m ;++i) scanf("%d",pi+i);
for (int i=0 ;i<n ;++i) {
scanf("%d %d %d %d %d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2,&p[i].s);
x[px++] = p[i].x1; x[px++] = p[i].x2;
y[py++] = p[i].y1; y[py++] = p[i].y2;
}
ans = 0;
sort(p,p+n,cmp);
sort(x,x+px,cmp1);
sort(y,y+py,cmp1);
int l = x[0],r;
int j = 0;
--py;
for (int i=1 ;i<px; ++i){
r = x[i];
if (l == r) continue;
while (j < n && p[j].x2 <= l) ++j;
tree[1] = -1;
int w = r-l;
int d = j;
while (d < n && p[d].x1 <= l && r <= p[d].x2) {
//cout<<p[d].y1<<" "<<p[d].y2<<endl;
insert(0,py,p[d].y1,p[d].y2,pi[p[d].s],1);
++d;
}
long long tmp = getArea(0,py,1);
//cout<<tmp<<endl<<"end..."<<endl;
ans += tmp*w;
l = r;
}
printf("Case %d: %I64d\n",++index,ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator