題目描述
2050年,人類與外星人之間的戰爭已趨於白熱化。就在這時,人類發明出一種超級武器,這種武器能夠同時對相鄰的多個目標進行攻擊。凡是防禦力小於或等於這種武器攻擊力的外星人遭到它的攻擊,就會被消滅。然而,擁有超級武器是遠遠不夠的,人們還需要一個戰地統計系統時刻反饋外星人部隊的信息。這個艱鉅的任務落在你的身上。請你儘快設計出這樣一套系統。
這套系統需要具備能夠處理如下2類信息的能力:
1.外星人向[x1,x2]內的每個位置增援一支防禦力爲v的部隊。
2.人類使用超級武器對[x1,x2]內的所有位置進行一次攻擊力爲v的打擊。系統需要返回在這次攻擊中被消滅的外星人個數。
注:防禦力爲i的外星人部隊由i個外星人組成,其中第j個外星人的防禦力爲j。
輸入格式
從文件War.in第一行讀入n,m。其中n表示有n個位置,m表示有m條信息。
以下有m行,每行有4個整數k,x1,x2,v用來描述一條信息 。k表示這條信息屬於第k類。x1,x2,v爲相應信息的參數。k=1 or 2。
注:你可以認爲最初的所有位置都沒有外星人存在。
規模:0< n <= 1000; 0 < x1 <= x2 <= n; 0 < v <= 1000; 0 < m <= 2000
輸出格式
結果輸出到文件War.out。按順序輸出需要返回的信息。
樣例數據
樣例輸入
3 5
1 1 3 4
2 1 2 3
1 1 2 2
1 2 3 1
2 2 3 5
樣例輸出
6
9
題目分析
題目描述有點不清楚,其實是防禦力取最大的那個,因此可以轉爲矩形切割做
將每一個命令看做帶權線段,那麼就可以把帶權線段展開成二維
(l,r,v)->(l-1,0,r,v)
因此就可以矩形切割了
至於能不能線段樹,應該可以吧?懶得寫了
源代碼
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const int Get_Int() {
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
struct Square {
double x1,x2,y1,y2;
Square() {}
Square(double lx,double ly,double rx,double ry):x1(lx),y1(ly),x2(rx),y2(ry) {}
} ;
struct Cut_Square {
Square a[100005];
int sum;
int init() {
sum=0;
}
bool if_intersect(Square a,Square b) {
if(a.x1>=b.x2||a.y1>=b.y2||a.x2<=b.x1||a.y2<=b.y1)return false;
else return true;
}
void add(double x1,double y1,double x2,double y2) {
a[++sum]=Square(x1,y1,x2,y2);
}
void del(int index) {
a[index]=a[sum];
sum--;
}
double Xway_cut(int index,double x1,double y1,double x2,double y2) { //返回交集
double k1=max(x1,a[index].x1);
double k2=min(x2,a[index].x2);
if(a[index].x1<k1)add(a[index].x1,a[index].y1,k1,a[index].y2);
if(k2<a[index].x2)add(k2,a[index].y1,a[index].x2,a[index].y2);
return Yway_cut(index,k1,y1,k2,y2);
}
double Yway_cut(int index,double x1,double y1,double x2,double y2) {
double k1=max(y1,a[index].y1);
double k2=min(y2,a[index].y2);
if(a[index].y1<k1)add(x1,a[index].y1,x2,k1);
if(k2<a[index].y2)add(x1,k2,x2,a[index].y2);
return (x2-x1)*(k2-k1);
}
};
Cut_Square s;
int n,m;
int main() {
n=Get_Int();
m=Get_Int();
for(int i=1; i<=m; i++) {
int order=Get_Int(),x1=Get_Int(),x2=Get_Int(),v=Get_Int();
if(order==1)s.add(x1-1,0,x2,v);
else {
x1=x1-1;
int y1=0,y2=v;
int sum=0;
Square b(x1,y1,x2,y2);
for(int j=1; j<=s.sum; j++) {
if(!s.if_intersect(s.a[j],b))continue;
sum+=s.Xway_cut(j,x1,y1,x2,y2);
s.del(j);
j--;
}
printf("%d\n",sum);
}
}
return 0;
}