传送门
首先我们大力转换坐标系。
然后我们做一遍扫描线求出矩形面积的交。
然后我们减去在外面的部分,可以发现一定是等腰三角形
在搞一个面积并就可以了
时间复杂度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]<y) add(k*2+1,mid,r,x,y,v);}update(k,p[l],p[r]);}ll ask(){return ans[1];}
}T;
struct calSqu{L l[N];int tot,n;ll x1[N],x2[N],y1[N],y2[N];ll calc(){T.clear();for (int i=1;i<=n;i++)T.p[i*2-1]=y1[i],T.p[i*2]=y2[i];sort(T.p+1,T.p+2*n+1);tot=1;for (int i=2;i<=2*n;i++)if (T.p[i]!=T.p[i-1])T.p[++tot]=T.p[i];for (int i=1;i<=n;i++){l[i*2-1]=(L){x1[i],y1[i],y2[i],1};l[i*2]=(L){x2[i],y1[i],y2[i],-1}; }sort(l+1,l+2*n+1);ll ans=0,la=0;for (int i=1;i<=2*n;i++){if (i!=1) ans+=la*(ll)(l[i].x-l[i-1].x);if (l[i].y1!=l[i].y2) T.add(1,1,tot,l[i].y1,l[i].y2,l[i].k);la=T.ask();}return ans;}
}Cal;
struct calTri{int n;Tri t[N],tmp;ll calc(){if (!n) return 0ll;sort(t+1,t+n+1);ll ans=t[1].sqr(); int x=1;for (int i=2;i<=n;i++){if (t[i].st>=t[x].st&&t[i].ed<=t[x].ed) continue;if (t[i].st>t[x].ed){ans+=t[i].sqr(); x=i; continue;}ans+=t[i].sqr();tmp=(Tri){t[i].st,t[x].ed};ans-=tmp.sqr();x=i;}return ans;}
}Tr;
int main(){scanf("%d%d%d",&n,&m,&k);for (int i=1;i<=k;i++)scanf("%lld%lld%lld",&s[i].x,&s[i].y,&s[i].r);Cal.n=k;for (int i=1;i<=k;i++){int tmp=s[i].r-((s[i].x+s[i].y+s[i].r)&1);Cal.x1[i]=(s[i].y+s[i].x-tmp)/2;Cal.y1[i]=(s[i].y-s[i].x-tmp)/2;Cal.x2[i]=(s[i].y+s[i].x+tmp)/2+1;Cal.y2[i]=(s[i].y-s[i].x+tmp)/2+1;}ll ans=Cal.calc();for (int i=1;i<=k;i++){int tmp=s[i].r-(!((s[i].x+s[i].y+s[i].r)&1));Cal.x1[i]=(s[i].y+s[i].x-tmp-1)/2;Cal.y1[i]=(s[i].y-s[i].x-tmp-1)/2;Cal.x2[i]=(s[i].y+s[i].x+tmp-1)/2+1;Cal.y2[i]=(s[i].y-s[i].x+tmp-1)/2+1;}ans+=Cal.calc();Tr.n=0;for (int i=1;i<=k;i++)if (s[i].r>=s[i].x){++Tr.n;Tr.t[Tr.n].st=s[i].y-(s[i].r-s[i].x);Tr.t[Tr.n].ed=s[i].y+(s[i].r-s[i].x);}ans-=Tr.calc();Tr.n=0;for (int i=1;i<=k;i++)if (s[i].r>=s[i].y){++Tr.n;Tr.t[Tr.n].st=s[i].x-(s[i].r-s[i].y);Tr.t[Tr.n].ed=s[i].x+(s[i].r-s[i].y);}ans-=Tr.calc();Tr.n=0;for (int i=1;i<=k;i++)if (s[i].r>=n+1-s[i].x){++Tr.n;Tr.t[Tr.n].st=s[i].y-(s[i].r-(n+1-s[i].x));Tr.t[Tr.n].ed=s[i].y+(s[i].r-(n+1-s[i].x));}ans-=Tr.calc();Tr.n=0;for (int i=1;i<=k;i++)if (s[i].r>=m+1-s[i].y){++Tr.n;Tr.t[Tr.n].st=s[i].x-(s[i].r-(m+1-s[i].y));Tr.t[Tr.n].ed=s[i].x+(s[i].r-(m+1-s[i].y));}ans-=Tr.calc();ll m1=0,m2=0,m3=0,m4=0;for (int i=1;i<=k;i++){if (s[i].r>=s[i].x+s[i].y) m1=max(m1,1+s[i].r-s[i].x-s[i].y);if (s[i].r>=s[i].x+(m+1-s[i].y)) m2=max(m2,1+s[i].r-s[i].x-(m+1-s[i].y));if (s[i].r>=(n+1-s[i].x)+s[i].y) m3=max(m3,1+s[i].r-(n+1-s[i].x)-s[i].y);if (s[i].r>=(n+1-s[i].x)+(m+1-s[i].y)) m4=max(m4,1+s[i].r-(n+1-s[i].x)-(m+1-s[i].y));}ans+=(m1*m1+m2*m2+m3*m3+m4*m4+m1+m2+m3+m4)/2;printf("%lld",ans);
}

bzoj1905: Soldier 士兵控制的棋盘相关推荐

  1. Python:士兵与枪(类的使用)

    # 士兵突击 # 士兵许有一把 AK47 # 士兵可以开火 # 枪能够发射 子弹 # 枪装填装填子弹 -- 增加子弹数量class Soldier:"""士兵" ...

  2. CSS3: 画围棋及棋盘

    前言 渐变的灵活运结合其他一些CSS3的特性的运用画出的简易版围棋 效果图 实现代码 <!DOCTYPE html> <html lang="en">< ...

  3. java 同步包_Java并发程序设计(四)JDK并发包之同步控制

    JDK并发包之同步控制 一.重入锁 重入锁使用java.util.concurrent.locks.ReentrantLock来实现.示例代码如下: public class TryReentrant ...

  4. Java并发程序设计(四)JDK并发包之同步控制

    JDK并发包之同步控制 一.重入锁 重入锁使用java.util.concurrent.locks.ReentrantLock来实现.示例代码如下: public class TryReentrant ...

  5. Java高并发程序设计入门

    转自:http://blog.csdn.net/johnstrive/article/details/50667557 说在前面 本文绝大部分参考<JAVA高并发程序设计>,类似读书笔记和 ...

  6. 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2

    Season 1, Episode 7: Riots, Drills and the Devil: Part 2 -Pope: Belick, get those guys in line guy: ...

  7. Java面向对象编程题

    目录 1.面向对象练习:设计小狗类 2.封装百分制分数 3.打印图形 4.设计士兵类 5.编写一个关于星期几的枚举WeekDay要求:枚举值:MON,TUE,WED,THR,FRI,SAT,SUN该枚 ...

  8. 【英语词组】恋恋不忘Day6-3

    a big deal Let's not forget sports--in male-dominated corporate America,it's still a big deal. 让我们不要 ...

  9. Python——极客战记codecombat关卡代码

    不到万不得已,请各位不要走这条捷径噢,毕竟思路比代码本身更重要. 成果不易,转载请注明出处,谢谢. 文章目录 kithgard地牢 地牢 深藏的宝石 幽灵守卫 真实姓名 高举之剑 焰中舞动 KITHM ...

最新文章

  1. 第十六届智能车竞赛赛道电磁线圈铺设方法
  2. Google的TensorFlow,微软CNTK, Amazon 的MxNet,Facebook 的Caffe2, PyTorch,国内百度的PaddlePaddle...
  3. bootanimation文件名_Android开机logo制作
  4. C++ STL 线性容器的用法
  5. linux+守护进程+php,【转载】Linux 守护进程的编程方法
  6. MySQL Shell副本集和MGR快速搭建详解
  7. git提交报异常,fatal: The remote end hung up unexpectedly
  8. 文件服务器代码大全,文件服务器 代码
  9. AI模型的大一统!多模态领域乱杀的十二边形战士
  10. JSP中文乱码问题终极解决方案(下)
  11. Springboot集成urule
  12. 工作中 pyspark的小知识点
  13. linux 匿名 聊天工具,最火的几个匿名聊天app,你知道几个
  14. python3计算md5_python 计算文件的md5值实例
  15. VUI设计--一些自己认为的原则
  16. 超低排放行业标准发布!
  17. win7蓝牙怎么连接_蓝牙车载MP3播放器和手机蓝牙连接以后怎么不响呢?
  18. 我们真的需要5G吗?
  19. python 实现聊天室
  20. 读书计划 现在开始……

热门文章

  1. YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别)
  2. 无线信道参数估计算法
  3. java多线程运行结果写入文件错误java.io.IOException: Stream closed
  4. Python3网络爬虫:腾讯新闻App的广告数据抓取
  5. 手机里的照片导入计算机的方法,如何把iphone照片导入电脑 四种方法分享【图文】...
  6. OA/CRM/ERP 权限管理系统设计 - bg.work办公开源实现
  7. Mysql碎片恢复_mysql数据库碎片整理
  8. 悲观的人更容易获得好的感觉
  9. 解决电脑无法进入休眠/睡眠状态,而仅关闭屏幕的问题
  10. 新春特辑 | 智慧城市专题合辑 报告下载