【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 ...
随机推荐
- js的等值比较规则
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness ES2015中有四种 ...
- 第一个web程序(ServletRequest , ServletResponse)
一.ServletRequest 1.获取参数的方法(四种) > String getParameter(String name): 根据请求参数的名字, 返回参数值. 若请求参数有多个值(例如 ...
- ubuntu16.04 更换源
1.备份 sudo cp /etc/apt/source.list /etc/apt/source.list.bak 2.打开/etc/apt/source.list,并删除所有内容 sudo ged ...
- TCP、UDP、HTTP、SOCKET之间的区别与联系
IP:网络层协议: TCP和UDP:传输层协议: HTTP:应用层协议: SOCKET:TCP/IP网络的API. TCP/IP代表传输控制协议/网际协议,指的是一系列协议. TCP和UDP使用IP协 ...
- 【解决】 64位笔记本丢失 MSVCR110.dll win10 phpstudy2017
启动程序报错如下: 无法启动此程序,因为计算机中丢失MSVCR110.dll.尝试重新安装该程序以解决此问题. 应该很容易就搜索到,缺少这样的dll文件,是没有安装Visual C++ Redistr ...
- ASP.NET MVC 提高运行速度的几种性能优化方法
主要介绍ASP.NETMVC 应用提速的六种方法,因为没有人喜欢等待,所以介绍几种常用的优化方法. 大家可能会遇到排队等待,遇到红灯要等待,开个网页要等待,等等等. 理所当然,没有人喜欢等待网页慢吞吞 ...
- HTML 模板继承
网站模板的设计,一般的,我们做网站有一些通用的部分,比如 导航,底部,访问统计代码等.合理的规划模板往往会减少工作量,同时也使得罗乱.难以阅读的静态页面布局变得优雅. 假设,我们的网站主页面除了正文是 ...
- Python进阶篇:Python简单爬虫
目录 前言 要解决的问题 设计方案 代码说明 小结 前言 前一段一直在打基础,已经学习了变量,流程控制,循环,函数这几块的知识点,就想通过写写小程序来实践一下,来加深知识点的记忆和理解.首先考虑的就是 ...
- BZOJ 5059: 前鬼后鬼的守护 可并堆 左偏树 数学
https://www.lydsy.com/JudgeOnline/problem.php?id=5059 题意:将原序列{ai}改为一个递增序列{ai1}并且使得abs(ai-ai1)的和最小. 如 ...
- Easy File Sharing Web Server 6.9远程溢出漏洞
from struct import pack import socket,sys import os host="192.168.109.129" port=80 junk0 = ...