【XJOI】【NOI考前模拟赛7】
DP+卡常数+高精度/ 计算几何+二分+判区间交/ 凸包
首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题。祝NOI2015圆满成功
同时膜拜碾压了蒟蒻的众神QAQ
填填填
我的DP比较逗比……(当时看到其他大神有更加优秀的做法)
f[i][j]表示前 i 个数,第一行填了 j 个的方案数,那么如果 i 并没有固定位置,f[i][j]=f[i-1][j]+f[i-1][j-1];即 i 这个数放在第一行或是第二行。。。(废话)
如果 i 固定的位置是第一行(1,y),那么f[i]中只有f[i][y]=f[i-1][y-1];(这个数一定放在第一行)
如果 i 固定的位置是第二行(2,y),那么f[i]中只有f[i][i-y]=f[i-1][i-y];(一定放在第二行)
这个DP是会爆空间的,但是我们发现f[i]只跟f[i-1]有关,所以滚动数组优化一下就好了……(我一开始还在蛋疼高精度的数组开不下)
我比较傻逼,不知道XJOI是不能用#ifndef ONLINE_JUDGE的,所以第一题没删文件操作……爆零滚粗了,删掉后是70分,两RE四TLE。
然后开始了漫漫卡常之路……比如高精从int压9位改成long long压17位,高精加的过程用指针实现(Orz Davidlee1999)
RE的那两个点是怎么回事呢?因为如果 i 固定的位置是第二行的时候,i-y可能会越界!(也就是无法得到一组合法解)那么这个时候我需要特判一下……
//XJOI test7 A
#include<ctime>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/ struct bint{
LL a[],l;
bint(){l=;memset(a,,sizeof a);}
LL& operator [] (int x){return a[x];}
}f[][N];
const LL Limit=100000000000000000LL;
void print(bint a){
printf("%lld",a[a.l]);
D(i,a.l-,) printf("%017lld",a[i]);
puts("");
}
bint operator + (bint a,bint &b){
LL *it1=a.a+,*it2=b.a+;
int l=max(a.l,b.l);
F(i,,l){
*it1+=*it2;
it1++; it2++;
}
it1=a.a+,it2=a.a+;
F(i,,l){
if (*it1>=Limit) *it1-=Limit,(*it2)++;
it1++; it2++;
}
if (a[l+]>) a.l=l+; else a.l=l;
return a;
}
int n,v[][N];
typedef pair<int,int> pii;
#define mp make_pair
#define fi first
#define se second
pii pos[N]; int main(){
// time_t start,end; start=clock();
n=getint();
F(i,,) F(j,,n){
v[i][j]=getint();
if (v[i][j]) pos[v[i][j]]=mp(i,j);
}
f[][].l=f[][][]=;
F(i,,*n){
int now=i&;
if (pos[i].fi==){
int j=pos[i].se;
f[now][j]=f[now^][j-];
}else if (pos[i].fi==){
int j=i-pos[i].se;
if (j<=){printf("0\n"); return ;}
f[now][j]=f[now^][j];
}else{
F(j,(i+)/,min(i,n)){
f[now][j]=f[now^][j-]+f[now^][j];
// f[now][j]=f[now][j]+f[now^1][j];
}
}
F(j,i/,min(i-,n)) f[now^][j]=bint();
}
print(f[][n]);
/* end=clock();
cout <<"start : "<<start<<endl;
cout <<"end : "<<end<<endl;
cout <<"time : "<<double(end-start)/CLOCKS_PER_SEC<<endl;
*/ return ;
}
线线线
计算几何QAQ
这题……倒是很容易想到可以二分这个dist,那么对于$S$中的每一个点,以它为圆心,dist为半径画一个圆,只要直线与这个圆的交集不为空那么这个圆就可以满足了……那么满足条件的直线所组成的明显是个扇形(只看一侧的话,因为是直线,两边加起来是对称的两个扇形)。
然而我并不会算扇形的交……(由此可见多么傻逼)
想到这里我就弃疗了……没有写……连暴力都不会……
然而其实并不用算扇形交= =因为这个直线不是过定点嘛,那么所谓扇形……其实就是极角对应的区间罢了!所以其实就是求区间交!找是否有一段被n个区间覆盖即可……注意由于是直线,所以反向的那一边穿过去也可以……所以一个$S$中的点应该是对应两个区间!(Orz zld神犇)
进入区间+1,离开区间-1,每个区间的左右端点都视为一个事件,排序一下,看是否某一时刻前缀和为n即可。
//XJOI test7 B
//Orz zld大爷
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
typedef long long LL;
const double eps=1e-,pi=acos(-);
#define sqr(x) ((x)*(x))
/******************tamplate*********************/ int n;
double tx,ty;
double a[N],dis[N];
typedef pair<double,int> pii;
#define mp make_pair
pii c[N*];
bool check(double d){
int s=,tot=;
F(i,,n)
if (dis[i]<=d) s++;
else{
double l=asin(d/dis[i]);
c[++tot]=mp(a[i]-l,);
c[++tot]=mp(a[i]+l,-);
if (a[i]>){
c[++tot]=mp(a[i]-pi-l,);
c[++tot]=mp(a[i]-pi+l,-);
}else{
c[++tot]=mp(a[i]+pi-l,);
c[++tot]=mp(a[i]+pi+l,-);
}
}
sort(c+,c+tot+);
F(i,,tot){
s+=c[i].second;
if (s==n) return ;
}
return ;
}
int main(){
// freopen("B.in","r",stdin);
n=getint(); tx=getint(); ty=getint();
double l=,r=;
F(i,,n){
double x=getint(),y=getint();
a[i]=atan2(x-tx,y-ty);
dis[i]=sqrt(sqr(x-tx)+sqr(y-ty));
r=max(dis[i],r);
}
while(r-l>eps){
double mid=(l+r)/;
if (check(mid)) r=mid;
else l=mid;
}
int ans=floor(l*);
printf("%d.%03d\n",ans/,ans%);
// printf("%.3f\n",l-0.0005);
return ;
}
凸凸凸
蒟蒻并不会啊……码了个暴力凸包,40分
正解好像是这样的……
矩形框内离上边界最近的点Up,下边界最近的点Down,左Left,右Right,这四个点一定在最终的凸包上……
所以只要预处理出来这四个点之间的凸壳,就可以快速回答询问了QAQ
这个好像是满足一个树形的结构?然而蒟蒻并不会写……sad
//XJOI test7 C
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/ struct Poi{
int x,y;
Poi(){}
Poi(int x,int y):x(x),y(y){}
void read(){x=getint(),y=getint();}
}p[N],a[N],st[N],O(,);
typedef Poi Vec;
bool operator < (const Poi &a,const Poi &b){return a.x<b.x ||(a.x==b.x && a.y<b.y);}
Vec operator - (Poi a,Poi b){return Vec(a.x-b.x,a.y-b.y);}
double Cross(const Poi &a,const Poi &b){return (double)a.x*b.y-(double)a.y*b.x;} int n,m,top,k; void solve(){
top=;
F(i,,m){
while(top> && Cross(st[top]-st[top-],a[i]-st[top-])<=) top--;
st[++top]=a[i];
}
int k=top;
D(i,m,){
while(top>k && Cross(st[top]-st[top-],a[i]-st[top-])<=) top--;
st[++top]=a[i];
}
double ans=0.0;
F(i,,top-) ans+=Cross(st[i]-O,st[i+]-O)/;
printf("%.1f\n",ans);
} int main(){
k=getint(); n=getint();
F(i,,n) p[i].read();
sort(p+,p+n+);
int q=getint();
F(i,,q){
m=;
int x1=getint(),x2=getint(),y1=getint(),y2=getint();
F(i,,n) if (p[i].x>=x1 && p[i].x<=x2 && p[i].y>=y1 && p[i].y<=y2)
a[++m]=p[i];
solve();
}
return ;
}
【XJOI】【NOI考前模拟赛7】的更多相关文章
- [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)
(2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...
- 2017.11.8 Noip2017 考前模拟赛
----------------------------------T1---------------------------------- ——>足球联赛 题目描述 巴蜀中学新一季的足球联赛开 ...
- 2017.11.7 Noip2017 考前模拟赛
----------------------------------T1---------------------------------- ——>数学老师的报复 题目描述 11 班数学大佬 Y ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- 【NOIP考前模拟赛】纯数学方法推导——旅行者问题
一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取. ...
- noi.acNOIP模拟赛5-count
题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...
- 2018/3/13 noiρ[rəʊ]模拟赛 125分
T1 60分暴力,水分也不会水,打表也不会打,正解是不可能写正解的,这辈子都写不出来正解的,虽然是zz题但是也拿不到分这样子. 正解:(啥?正解是sb组合数?这都他娘的想不到,真鸡儿丢人我自杀吧.) ...
- NOI.ac模拟赛20181021 ball sequence color
T1 ball 可以发现每次推动球时,是将每个球的位置 −1-1−1 ,然后把最左边的球放到 P−1P-1P−1 处. 记个 −1-1−1 次数,再用set维护就好了. #include <bi ...
- NOI.ac 模拟赛20181103 排队 翘课 运气大战
题解 排队 20% 1≤n≤20,1≤x,hi≤201\le n\le 20, 1\le x,h_i\le 201≤n≤20,1≤x,hi≤20 随便暴力 50% 1≤n≤2000,1≤x,hi≤1 ...
随机推荐
- 【BZOJ】1152: [CTSC2006]歌唱王国Singleland
题解 读错题了,是最后留下一个牛人首长歌颂他,和其他人没有关系,t就相当于数据组数 结论题,具体可看 https://www.zhihu.com/question/59895916/answer/19 ...
- 自动化CI构建工具
hudson/maven jenkins,bamboo, hudson
- java.lang.NoClassDefFoundError: javax/persistence/EntityListeners
在使用 Hibernate 进行数据库操作的时候,在启动 Tomcat 服务器后,Console 控制台可能会打印出这样的异常:java.lang.NoClassDefFoundError: java ...
- NHibernate 学习导航
http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html
- Java学习笔记之:Struts2.0 环境搭建
一.介绍 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 二 ...
- vmstat详解
一.前言 很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回顾一下L ...
- HTTP 的请求过程?
当点击一个链接时,浏览器首先找到站点的IP地址,这是通过DNS来实现的,在找到IP地址后就可以建立TCP连接了,连接建立后我们就可以发送请求了.但这个请求是什么样子的呢 ? 我们现在假设点击了一个从 ...
- 1015 Reversible Primes (20)(20 point(s))
problem A reversible prime in any number system is a prime whose "reverse" in that number ...
- springBoot application.properties 基础配置
# 文件编码 banner.charset= UTF-8 # 文件位置 banner.location= classpath:banner.txt # 日志配置 # 日志配置文件的位置. 例如对于Lo ...
- bzoj 4408: [Fjoi 2016]神秘数 数学 可持久化线段树 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=4299 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1 ...