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】的更多相关文章

  1. [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)

    (2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...

  2. 2017.11.8 Noip2017 考前模拟赛

    ----------------------------------T1---------------------------------- ——>足球联赛 题目描述 巴蜀中学新一季的足球联赛开 ...

  3. 2017.11.7 Noip2017 考前模拟赛

    ----------------------------------T1---------------------------------- ——>数学老师的报复 题目描述 11 班数学大佬 Y ...

  4. 【NOI P模拟赛】最短路(树形DP,树的直径)

    题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...

  5. 【NOIP考前模拟赛】纯数学方法推导——旅行者问题

    一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取. ...

  6. noi.acNOIP模拟赛5-count

    题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...

  7. 2018/3/13 noiρ[rəʊ]模拟赛 125分

    T1 60分暴力,水分也不会水,打表也不会打,正解是不可能写正解的,这辈子都写不出来正解的,虽然是zz题但是也拿不到分这样子. 正解:(啥?正解是sb组合数?这都他娘的想不到,真鸡儿丢人我自杀吧.) ...

  8. NOI.ac模拟赛20181021 ball sequence color

    T1 ball 可以发现每次推动球时,是将每个球的位置 −1-1−1 ,然后把最左边的球放到 P−1P-1P−1 处. 记个 −1-1−1 次数,再用set维护就好了. #include <bi ...

  9. 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 ...

随机推荐

  1. PHP phpexcel 导入时间/日期转换时间戳

    strtotime(gmdate('Y-m-d H:i',\PHPExcel_Shared_Date::ExcelToPHP($importtime))); /** * 判断字符串是否是日期格式 * ...

  2. Extjs设置或获取cookie

    设置cookie var myCookie = Ext.util.Cookie.set(‘YourCookieName’,'YourValue’); 读取cookie Ext.util.Cookie. ...

  3. awk 提取列

    awk '{OFS="";print(substr($0,1,6),substr($0,74,18),substr($0,15,3),substr($0,18,8))}' inpu ...

  4. 理解URI

    ---恢复内容开始--- 参考 https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E6%A0%87%E5%BF%97 ...

  5. JavaSE基础之矩阵运算

    JavaSE基础之矩阵运算 1.矩阵类:Matrix.java 包括矩阵的加.乘运算,行列式的求解,最大最小元素等 package cn.com.zfc.help; import java.text. ...

  6. Qt Quick快速入门之qml布局

    Qml里面布局主要有两种,锚点布局.Grid布局. 锚点布局使用anchors附件属性将一个元素的边定位到另一个元素的边,从而确定元素的位置和大小.下面是示例 import QtQuick 2.3 i ...

  7. dos系统下的游戏~ 不断更新中

    #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #incl ...

  8. opencv第二课 进行缩放图片~

    #include<stdio.h> #include<iostream> #include<opencv2\opencv.hpp> using namespace ...

  9. Oil Deposits 搜索 bfs 强联通

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  10. 在IIS上部署基于django WEB框架的python网站应用

    django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...