bzoj1905: Soldier 士兵控制的棋盘

这篇博客介绍了如何通过坐标系转换和扫描线算法求解棋盘上矩形区域的交集,进一步计算等腰三角形面积,并讨论了时间复杂度为O(NlogN)的解决方案。
摘要由CSDN通过智能技术生成

传送门
首先我们大力转换坐标系。
然后我们做一遍扫描线求出矩形面积的交。
然后我们减去在外面的部分,可以发现一定是等腰三角形
在搞一个面积并就可以了
时间复杂度O(NlogN)

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 300030
#define ll long long 
using namespace std;
ll max(ll x,int y){
    return x>y?x:y;
}
struct Squ{ll x,y,r;}s[N];
struct L{
    ll x,y1,y2,k;
    friend bool operator <(L a,L b){
        return a.x<b.x;
    }
};
struct Tri{
    ll st,ed;
    ll sqr(){
        if ((ed-st+1)&1) return (ed-st+2)*((ed-st+1)/2+1)/2;
        return (ed-st+3)*((ed-st-1)/2+1)/2;
    }
    friend bool operator <(Tri a,Tri b){
        return a.st<b.st;
    }
};
int n,m,k;
struct segment{
    int tag[N*4],ans[N*4],p[N];
    void clear(){
        memset(tag,0,sizeof(tag));
        memset(ans,0,sizeof(ans));
    }
    void update(int k,ll l,ll r){
        if (tag[k]>0) ans[k]=r-l;
        else ans[k]=ans[k*2]+ans[k*2+1];
    }
    void add(int k,int l,int r,int x,int y,int v){
        int mid=(l+r)/2;
        if (x<=p[l]&&p[r]<=y) tag[k]+=v;
        else{
            if (x<p[mid]) add(k*2,l,mid,x,y,v);
            if (p[mid]<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值