【FCS NOI2018】福建省冬摸鱼笔记 day3
第三天。
计算几何,讲师:叶芃(péng)。
dalao们日常不记笔记。@ghostfly233说他都知道了,就盼着自适应辛普森积分。
我计算几何基础不好……然而还是没怎么讲实现,感觉没听什么东西进去。
不过还是记了一些公式。
同时@ghostfly233在后面打农药。
然后讲到了有关圆的东西。讲完了,下课了。辛普森有兴趣的同学回去自己看看吧。
辛普森:???
@ghostfly233非常难受。
中午划水。
下午有一题和早上的有关。
T1半平面交+面积,简单题,我半平面交写错了,只有80。
T2神秘图论结论+神秘数学/神秘DP,那个结论第一天就接触过了,然而我不知道放那儿有啥用,于是不会做,其实再证一个结论就简单状压DP了。
T3毒瘤分治啥的,没想法,搞了个最坏\(O(n^2)\)的RMQ,结果70分???@qrc和我差不多,只有30分,因为他预处理\(O(n^2)\),233333。数据出水了。
150分比较舒服。
【T1】
题面:求一个凸包内部,随机取点P,使得P与给定一边组成的三角形,比P与其他边组成的三角形面积都要小,取到这样的点P的概率。
题解:一看就是半平面交再算面积,算出给定边和其他边的那条直线(使得P在直线一侧,三角形更小),交一交就好了。
难点在于如何求出直线,其实推推式子就没问题,第二个是半平面交,我写挂了,幸好不是什么严重错误,于是80分。
#include<cstdio>
#include<cmath>
#include<algorithm>
#define db double
using namespace std;
const db eps=1e-10;
struct vec{db x,y;vec(db x=0,db y=0):x(x),y(y){}};
inline vec operator+(vec x,vec y){return vec(x.x+y.x,x.y+y.y);}
inline vec operator-(vec x,vec y){return vec(x.x-y.x,x.y-y.y);}
inline vec operator*(db x,vec y){return vec(x*y.x,x*y.y);}
inline vec operator*(vec x,db y){return vec(y*x.x,y*x.y);}
inline db operator *(vec x,vec y){return x.x*y.y-x.y*y.x;}
inline db mod(vec x){return sqrt(x.x*x.x+x.y*x.y);}
inline bool zero(db x){if(x<=eps&x>=-eps)return 1;return 0;}
struct line{vec p,v;line(vec p=vec(0,0),vec v=vec(0,0)):p(p),v(v){}};
inline bool cmp(line x,line y){return atan2(x.v.y,-x.v.x)<atan2(y.v.y,-y.v.x);}
void print(vec x){printf("(%lf, %lf)",x.x,x.y);}
void print(line x){print(x.p);printf(" -> ");print(x.v);puts("");}
inline vec jiao(line x,line y){
return x.p+((((y.p-x.p)*y.v)/(x.v*y.v))*x.v);
}
inline line clac(line x,line y){
if(zero(x.v*y.v)) return line(y.p+((x.p-y.p)*(mod(x.v)/(mod(x.v)+mod(y.v)))),x.v-y.v);
return line(jiao(x,y),x.v-y.v);
}
inline bool left(line x,vec y){
return (x.v*(y-x.p))>-eps;
}
int n,cnt; db ans1,ans2;
vec dots[100001];
line edge[100001];
line edg2[200001];
line que[200001];int l=1,r=0;
int main(){
freopen("convex.in","r",stdin);
freopen("convex.out","w",stdout);
/* while(1){
line p1,p2;
line v;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p1.p.x,&p1.p.y,&p1.v.x,&p1.v.y,&p2.p.x,&p2.p.y,&p2.v.x,&p2.v.y);
print(p1); print(p2);
v=clac(p1,p2);
print(v);
}*/
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lf%lf",&dots[i].x,&dots[i].y);
//======
ans1+=dots[n]*dots[1];
for(int i=1;i<n;++i) ans1+=dots[i]*dots[i+1];
ans1/=2; ans1=abs(ans1);
//======
for(int i=1;i<n;++i) edge[i]=line(dots[i],dots[i+1]-dots[i]);
edge[n]=line(dots[n],dots[1]-dots[n]);
edg2[++cnt]=line(dots[1],dots[n]-dots[1]);
for(int i=2;i<=n;++i) edg2[++cnt]=line(dots[i],dots[i-1]-dots[i]);
for(int i=2;i<=n;++i) edg2[++cnt]=clac(edge[1],edge[i]);
sort(edg2+1,edg2+cnt+1,cmp);
//======
// puts("======");
// for(int i=1;i<=cnt;++i) print(edg2[i]);
// puts("======");
//======
que[++r]=edg2[1]; que[++r]=edg2[2];
for(int i=3;i<=cnt;++i){
// puts("######");
// for(int j=l;j<=r;++j) print(que[j]);
// puts("######");
while(l<=r-1&&left(edg2[i],jiao(que[r],que[r-1]))) --r;
while(l<=r-1&&left(edg2[i],jiao(que[l],que[l+1]))) ++l;
if(zero(que[r].v*edg2[i].v)){
if(l<=r-1&&left(edg2[i],jiao(que[r],que[r-1]))) --r;
else continue;
}
que[++r]=edg2[i];
}
while(l<=r-1&&left(edg2[l],jiao(que[r],que[r-1]))) --r;
//======
// puts("======");
// for(int i=l;i<=r;++i) print(que[i]);
// puts("======");
//======
if(l==r-1) ans2=0;
else{
ans2+=jiao(que[l],que[l+1])*jiao(que[l],que[r]);
ans2+=jiao(que[r],que[l])*jiao(que[r],que[r-1]);
for(int i=l+1;i<=r-1;++i) ans2+=jiao(que[i],que[i+1])*jiao(que[i],que[i-1]);
ans2/=2; ans2=abs(ans2);
}
//======
printf("%.4f",ans2/ans1);
return 0;
}
【T2】
题意:给定一个二分图G={V=X+Y,E},每个点有价值,求有多少个V的子集S的价值大于等于给定的t,并且S可以被原图G中的一个匹配覆盖。\(|X|,|Y|\leq 20\)
题解:Hall定理:对于一个二分图G={X+Y,E},那么存在一个能覆盖X的匹配当且仅当对于任意一个X的子集,从它引边到Y后,Y被覆盖的点的数量大于等于这个子集的点的数量。
那么,还要证明一个结论:对于二分图G={X+Y,E},如果X的子集P能被一个G的匹配MP覆盖,Y的子集Q能被一个G的匹配MQ覆盖,那么G必有一个匹配能覆盖P+Q。
为什么呢?如果P中的一个点通过MP到达Y的点不在Q中,那这条边就可以选取,因为P没有另一个点通过MP能到达同一个点;反之,如果在Q中,那这个点再通过MQ到达X,重复这个过程,最后会形成一条链或一个环,在链中的话我们隔着取边,不论长度为奇数或偶数都可以取到,如果是一个环,那么必须是一个偶环,因为是二分图,所以我们仍然隔着取边就好了。
那么我们要做的是:①处理X,Y中的每个子集是否有匹配能覆盖它,②把可以的按照价值排序,③双指针扫一遍。
①可以用状压DP解决。
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,t,s,num[1048576],A[1048576],B[1048576],vA[1048576],vB[1048576],sA[1048576],sB[1048576],cA,cB;
bool fA[1048576],fB[1048576];
long long ans;
int main(){
freopen("match.in","r",stdin);
freopen("match.out","w",stdout);
scanf("%d%d",&n,&m); s=n>m?n:m;
for(int i=1;i<1<<s;++i) num[i]=num[i-(i&-i)]+1;
char ch;
for(int i=0;i<n;++i) for(int j=0;j<m;++j)
ch=getchar(), ch=='1'?A[1<<i]|=1<<j,B[1<<j]|=1<<i:ch!='0'?--j:0;
for(int i=0;i<1<<n;++i) A[i]=A[i&-i]|A[i-(i&-i)];
for(int i=0;i<1<<m;++i) B[i]=B[i&-i]|B[i-(i&-i)];
for(int i=0;i<n;++i) scanf("%d",vA+(1<<i));
for(int i=0;i<m;++i) scanf("%d",vB+(1<<i));
for(int i=0;i<1<<n;++i) vA[i]=vA[i&-i]+vA[i-(i&-i)];
for(int i=0;i<1<<m;++i) vB[i]=vB[i&-i]+vB[i-(i&-i)];
for(int i=0;i<1<<n;++i){
if(num[A[i]]<num[i]) continue;
fA[i]=1;
for(int j=0;j<n;++j) if(i>>j&1)
fA[i]&=fA[i^1<<j];
fA[i]?sA[cA++]=vA[i]:0;
} sort(sA,sA+cA);
for(int i=0;i<1<<m;++i){
if(num[B[i]]<num[i]) continue;
fB[i]=1;
for(int j=0;j<n;++j) if(i>>j&1)
fB[i]&=fB[i^1<<j];
fB[i]?sB[cB++]=vB[i]:0;
} sort(sB,sB+cB);
scanf("%d",&t);
for(int i=0,j=cB;i<cA;++i){
while(j>0&&sA[i]+sB[j-1]>=t) --j;
ans+=cB-j;
}
printf("%lld",ans);
return 0;
}
【FCS NOI2018】福建省冬摸鱼笔记 day3的更多相关文章
- 【FCS NOI2018】福建省冬摸鱼笔记 day1
省冬的第一天. 带了本子,笔,一本<算法导论>就去了.惊讶于为什么同学不带本子记笔记. 他们说:“都学过了.”,果然这才是巨神吧. 第一天:数论,讲师:zzx 前几页的课件挺水,瞎记了点笔 ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1
记录一下day6发生的事情吧. 7:30 到达附中求索碑,被人膜,掉RP. 7:50 进考场,6楼的最后一排的最左边的位置,世界上最角落的地方,没有任何想法. 发现电脑时间和别人不一样,赶快调了一下. ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day2
第二天. 同学还是不带本子记笔记.dalao. 第二天:图论,讲师:@ExfJoe 全程划水,前面都讲水算法[虽然我可能已经忘记了]什么最短路,Tarjan,最小生成树,2SAT,差分约束啥的,我现在 ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day5
第五天,也是讲课的最后一天. 数据结构专题,讲师:杨志灿 他的blog我似乎找不到了……以前肯定是在百度博客里面.但是现在百度博客消失了. PPT做的很有感觉,说了很多实用的技巧. 我觉得其实是收获最 ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day4
第四天. 动态规划专题,讲师:闫神 讲了一些DP优化技巧,然而思想难度好大啊……根本没想到能优化那地步,连DP方程都没有呢. 不过有几题我还是想明白了. 讲了单调队列,决策单调性,四边形不等式,斜率优 ...
- Hash 日常摸鱼笔记
本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...
- 可持久化Treap 赛前摸鱼笔记
1.基本结构 随机化工具 unsigned int SEED = 19260817; //+1s inline int Rand(){ SEED=SEED*1103515245+12345; retu ...
- [摸鱼]cdq分治 && 学习笔记
待我玩会游戏整理下思绪(分明是想摸鱼 cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法 对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态 ...
- 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程
下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的 ...
随机推荐
- JVM学习笔记(一):Java内存区域
由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(. ...
- Java变量初始化之后的默认值问题
1) 局部变量初始化(局部变量:函数.语句中的变量,只在所属区域内有效)局部变量声明后,Java虚拟机不会自动给它初始化为默认值.因此对于局部变量,必须经过显示的初始化,才能使用它.如果使用一个没有被 ...
- 测试人员如何"提问"
本文打算谈谈QA如何高质量的“提问” 写这些的初衷其实比较简单,作为一个测试老鸟,加入了一些很有质量的测试圈子,也在不同的公司带过不少新人,常常会碰到低效率的“提问”,主要表现如下: 1.问题 ...
- [LOJ3052] [十二省联考 2019] 春节十二响
题目链接 LOJ:https://loj.ac/problem/3052 洛谷:https://www.luogu.org/problemnew/show/P5290 BZOJ:https://www ...
- 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告
P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...
- 【bzoj4199】【Noi2015】品酒大会
题解 SA+并查集 把ht按大小倒序加入,并查集合并维护答案的变化: SAM 翻转串,求出SAM的parent树就是后缀树,两个串的最长公共后缀是他们lca的len值: 考率一个节点x,那么它子树里的 ...
- .Net并行编程系列之三:创建带时间限制(Timeout)的异步任务并取得异步任务的结果
尝试创建基于MVVM三层架构的异步任务: 场景:View层触发ViewModel层的动作请求,ViewModel层异步的从Model层查询数据,当数据返回或者请求超时时正确更新ViewModel层数据 ...
- golang 中 sync包的 WaitGroup
golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 ...
- 路径名导致的异常:javax.imageio.IIOException: Can't read input file!
背景: 写了一个测试程序,目的是读取本地的图片,为其打上水印图片.在使用过程中总会遇到:javax.imageio.IIOException: Can't read input file!的错误,最开 ...
- IOS数组的排序和筛选
1.排序 [self.tableItems sortUsingComparator:^NSComparisonResult(GPBTeacherBrief* obj1, GPBTeacherBrief ...