扫描线一边扫一边算期望,细节比较多。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define PLI pair<LL, int>
#define PLL pair<LL, LL>
#define ull unsigned long long
using namespace std; const int N = 4e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; int n, m, tot, X[N], cntx, Y[N], cnty, zero[N], zero2[N], people, people2;
double val[N], val2[N], sum[N], fact[N], fact2[N], ret, ans; struct qus {
int y, x1, x2, op;
} a[N];
struct Point {
int x, y;
double p[];
} b[N]; struct Bit {
int a[N];
void modify(int x, int v) {
for(int i = x; i < N; i+=i&-i)
a[i] += v;
}
int sum(int x) {
int ans = ;
for(int i = x; i; i-=i&-i)
ans += a[i];
return ans;
}
} bit; vector<Point> point[N];
vector<PII> in[N], out[N]; inline void changed(int x, double p) {
if(zero[x] > ) return;
if(p < eps) fact[x] = val[x];
else fact[x] /= p;
}
inline void changem(int x, double p) {
fact[x] *= p;
}
inline void changed2(int y, double p) {
if(zero2[y] > ) return;
if(p < eps) fact2[y] = val2[y];
else fact2[y] /= p;
}
inline void changem2(int x, double p) {
fact2[x] *= p;
} int main() {
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
a[++tot] = qus{y1, x1, x2, };
a[++tot] = qus{y2, x1, x2, -};
X[++cntx] = x1; X[++cntx] = x2;
Y[++cnty] = y1; Y[++cnty] = y2;
}
for(int i = ; i <= m; i++) {
scanf("%d%d%lf%lf", &b[i].x, &b[i].y, &b[i].p[], &b[i].p[]);
b[i].p[]/=, b[i].p[] /= , b[i].p[] = - b[i].p[] - b[i].p[];
X[++cntx] = b[i].x; Y[++cnty] = b[i].y;
}
sort(X+, X++cntx); sort(Y+, Y++cnty);
cntx = unique(X+, X++cntx)-X-;
cnty = unique(Y+, Y++cnty)-Y-;
for(int i = ; i <= cntx; i++) val[i] = 1.0;
for(int i = ; i <= cnty; i++) val2[i] = 1.0;
for(int i = ; i <= tot; i++) {
a[i].y = lower_bound(Y+, Y++cnty, a[i].y)-Y;
a[i].x1 = lower_bound(X+, X++cntx, a[i].x1)-X;
a[i].x2 = lower_bound(X+, X++cntx, a[i].x2)-X;
if(a[i].op == ) in[a[i].y].push_back(mk(a[i].x1, a[i].x2));
else out[a[i].y].push_back(mk(a[i].x1, a[i].x2));
}
for(int i = ; i <= m; i++) {
b[i].x = lower_bound(X+, X++cntx, b[i].x)-X;
b[i].y = lower_bound(Y+, Y++cnty, b[i].y)-Y;
if(-b[i].p[] > eps) val[b[i].x] *= (-b[i].p[]);
else zero[b[i].x]++;
if(-b[i].p[] > eps) val2[b[i].y] *= (-b[i].p[]);
else zero2[b[i].y]++;
point[b[i].y].push_back(b[i]);
} for(int i = ; i <= cntx; i++) {
if(zero[i]) fact[i] = ;
else fact[i] = val[i];
sum[i] = sum[i-] + fact[i];
}
for(int i = ; i <= cnty; i++) {
if(zero2[i]) fact2[i] = ;
else fact2[i] = val2[i];
}
for(int i = ; i <= cnty; i++) {
ans += (Y[i]-Y[i-]-)*(people-ret);
for(PII sgm : in[i]) {
people += sgm.se-sgm.fi+;
people2 += X[sgm.se]-X[sgm.fi]+-(sgm.se-sgm.fi+);
ret += sum[sgm.se] - sum[sgm.fi-];
bit.modify(sgm.fi, );
bit.modify(sgm.se+, -);
}
double res1 = ret, res2 = ;
for(Point p : point[i]) {
if(!bit.sum(p.x)) continue;
res1 -= fact[p.x];
changed(p.x, -p.p[]);
changed2(p.y, -p.p[]);
res2 += fact[p.x]*fact2[p.y]*p.p[];
changem(p.x, -p.p[]);
changem2(p.y, -p.p[]);
}
ans += people - (fact2[i]*res1 + res2) + people2*(-fact2[i]);
for(PII sgm : out[i]) {
people -= sgm.se-sgm.fi+;
people2 -= X[sgm.se]-X[sgm.fi]+-(sgm.se-sgm.fi+);
ret -= sum[sgm.se] - sum[sgm.fi-];
bit.modify(sgm.fi, -);
bit.modify(sgm.se+, );
}
}
printf("%.12f\n", ans);
return ;
} /*
*/

2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest B - Bring Your Own Bombs 离散化+扫描线+计算期望的更多相关文章

  1. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  2. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  3. 2016 NEERC, Moscow Subregional Contest K. Knights of the Old Republic(Kruskal思想)

    2016 NEERC, Moscow Subregional Contest K. Knights of the Old Republic 题意:有一张图,第i个点被占领需要ai个兵,而每个兵传送至该 ...

  4. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  5. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem D. Distance 迪杰斯特拉

    Problem D. Distance 题目连接: http://codeforces.com/gym/100714 Description In a large city a cellular ne ...

  6. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem C. Contest 水题

    Problem C. Contest 题目连接: http://codeforces.com/gym/100714 Description The second round of the annual ...

  7. 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest Problem L. Lazy Coordinator

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229511 时间限制:1s 空间限制:512MB 题目大意: 给定一个n 随后跟着2n行输入 ...

  8. Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结

    第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...

  9. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

随机推荐

  1. html5 +css3 点击后水波纹扩散效果 兼容移动端

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. android获取APP 包名和activity

    1.连接设备并启动被测试app应用 2.打开cmd窗口 3.windows获取包名和activity    adb shell dumpsys activity |find "mFocuse ...

  3. Python练习-生成器-一个生成器被坑的体无完肤

    代码如下,尽可能独立阅读: # 编辑者:闫龙 from urllib.request import urlopen #导入一个包,这就是egon留的一个坑 def get(url):#这是为了保证题目 ...

  4. Linux服务-配置Nginx反向代理

    任务目标:实现基于轮询的方式调度三台web,并验证结果:实现基于权重的方式调度三台web,并验证结果:实现基于hash的方式调用三台web,并验证结果 由于刚刚做了nfs设置,为了提现实验结果,我在w ...

  5. 二次开发中cad字体的总结

    目前手头一个项目,关于制图统一平台的,特别研究了CAD中的字体,总结出来,给需要的朋友,希望少走弯路.1.cad2008中,netload之后,输入注册的命令,提示未知命令解决:将引用中CAD两个dl ...

  6. A - ACM Computer Factory(网络流)

    题目链接:https://cn.vjudge.net/contest/68128#problem/A 反思:注意拆点,否则的话节点就没用了,还有注意源点和汇点的赋值. AC代码: #include&l ...

  7. 2016.5.16——leetcode:Rotate Array,Factorial Trailing Zeroe

    Rotate Array 本题目收获: 题目: Rotate an array of n elements to the right by k steps. For example, with n = ...

  8. linux快速复制大量小文件方法 nc+tar【转】

    1,在需要对大量小文件进行移动或复制时,用cp.mv都会显得很没有效率,可以用tar先压缩再解压缩的方式.  2,在网络环境中传输时,可以再结合nc命令,通过管道和tcp端口进行传输.  nc和tar ...

  9. 19 Error handling and Go go语言错误处理

    Error handling and Go go语言错误处理 12 July 2011 Introduction If you have written any Go code you have pr ...

  10. style一张图--openlayers