DP+容斥原理or补集转化?/KD-Tree


  唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗。。。

  还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾……

Round0 A

  要求问(1,2)->(n-1,m)  &  (2,1)->(n,m-1)的不相交路径条数,蒟蒻当时只想到了$N^3$的DP……即枚举当前的总步数,以及两个人分别横向走了几步。

  其实正解是(也只能是?)$O(N^2)$的!

  ans=calc{(1,2)->(n-1,m)}*calc{(2,1)->(n,m-1)} - calc{(1,2)->(n,m-1)}*calc{(2,1)->(n-1,m)}

  后面减去的那是啥呢?是两个人走到对方的目的地的总方案数……也就是两人路径交叉的方案数!将交叉的后半段交换一下,与两人走到各自的目的地,且路径发生交叉的方案一一对应!

  (还是容斥原理?)

  我比较傻逼,边界情况没有处理全2333……比如(n-1,m)和(n,m-1)走不到啊什么的……

 //Round0 A
#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)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,mod=1e9+;
/*******************template********************/
int n,m,a[N][N];
int f[N][N];
char s[N]; LL calc(int x1,int y1,int x2,int y2){
memset(f,,sizeof f);
f[x1][y1]=;
F(i,x1,x2) F(j,y1,y2){
if (a[i-][j]) (f[i][j]+=f[i-][j])%=mod;
if (a[i][j-]) (f[i][j]+=f[i][j-])%=mod;
}
return f[x2][y2];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
n=getint(); m=getint(); F(i,,n){
scanf("%s",s+);
F(j,,m) a[i][j]=s[j]=='';
}
// printf("%lld %lld %lld %lld\n",calc(1,2,n-1,m),calc(2,1,n,m-1),calc(1,2,n,m-1),calc(2,1,n-1,m));
if (a[][] && a[][] && a[n-][m] && a[n][m-])
printf("%lld\n",(calc(,,n-,m)*calc(,,n,m-)%mod-calc(,,n,m-)*calc(,,n-,m)%mod+mod)%mod);
else puts("");
return ;
}

Round1 B

  题意是求四维空间中的偏序最长链?。。。

  点数不多,排序以后暴力枚举每个点,求出在它之前出现的满足条件的点中,最大的DP值。

  

  记得做这场胡策的时候我刚学了KD-Tree = =

  然而我爆零了……

  为什么呢?不是估价了嘛……我把小于号写成大于号了……也就是说,我把可能成为ans的全部避!过!去!了!

  标算是搞完一个点以后进行修改,然而蒟蒻没有yy出来怎么修改……窝的做法是每算完一个点就把它插进去,然后重构啊之类的搞搞……(真是机(sha)智(bi)

 //Round 1 B
#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)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=1e5+,INF=1e9;
/*******************template********************/ int n,m,p[N],D,root;
struct node{
int d[],mx[],mn[],l,r,D,size,v,maxv;
int& operator [] (int x){return d[x];}
void read(){F(i,,) d[i]=getint();}
}t[N],t2[N],tmp; bool cmp(int x,int y){return t[x][D]<t[y][D];}
bool operator < (node a,node b){
F(i,,){
if (a[i]<b[i]) return ;
if (a[i]>b[i]) return ;
}
return ;
}
#define L t[o].l
#define R t[o].r
#define mid (l+r>>1) void Push_up(int o){
F(i,,){
t[o].mn[i]=min(t[o][i],min(t[L].mn[i],t[R].mn[i]));
t[o].mx[i]=max(t[o][i],max(t[L].mx[i],t[R].mx[i]));
}
t[o].maxv=max(t[o].v,max(t[L].maxv,t[R].maxv));
t[o].size=t[L].size+t[R].size+;
}
int build(int l,int r,int dir){
D=dir;
nth_element(p+l,p+mid,p+r+,cmp);
int o=p[mid];
t[o].D=dir;
L = l < mid ? build(l,mid-,(dir+)%) : ;
R = r > mid ? build(mid+,r,(dir+)%) : ;
Push_up(o);
return o;
} int cnt;
void dfs(int o){
if (!o) return;
p[++cnt]=o;
dfs(L); dfs(R);
}
void rebuild(int &o){
cnt=;
dfs(o);
o=build(,cnt,t[o].D);
} void Insert(int &o,int dir){
if (!o){
o=++m; t[o].D=dir;
t[o]=tmp;
F(i,,) t[o].mn[i]=t[o].mx[i]=t[o][i];
t[o].maxv=t[o].v; t[o].size=;
return;
}
if (t[o][dir]<tmp[dir]){
Insert(L,(dir+)%);
Push_up(o);
if (t[L].size>t[o].size*0.7) rebuild(o);
}else{
Insert(R,(dir+)%);
Push_up(o);
if (t[R].size>t[o].size*0.7) rebuild(o);
}
} int check(int o){
if (!o) return ;
int ans=;
F(i,,) if(t[o].mx[i]<=tmp[i]) ans++;
if (ans==) return ans;
ans=;
F(i,,) if (t[o].mn[i]>tmp[i]) ans=;
return ans;
}
int dis(node a,node b){
F(i,,) if (a[i]>b[i]) return ;
return a.v;
}
int ans;
void query(int o){
ans=max(dis(t[o],tmp),ans);
int dl=check(L),dr=check(R);
if (dl==) ans=max(ans,t[L].maxv);
else if (dl && ans<t[L].maxv) query(L);
if (dr==) ans=max(ans,t[R].maxv);
else if (dr && ans<t[R].maxv) query(R);
} int main(){
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
F(i,,) t[].mn[i]=INF,t[].mx[i]=-INF;
t[].maxv=-INF; n=getint();
F(i,,n) t2[i].read(),t2[i].v=;
sort(t2+,t2+n+);
/* t[m=1]=t2[1]; t[1].v=1;
F(i,2,n){
F(j,0,3) if (t2[i][j]!=t2[i-1][j]){ t[++m]=t2[i]; break;}
t[m].v++;
}
F(i,1,m) t2[i]=t[i];
n=m; m=0;
*/ int anss=;
F(i,,n){
ans=;
tmp=t2[i];
query(root);
t2[i].v+=ans;
// printf("%d ",t2[i].v);
tmp=t2[i];
anss=max(anss,t2[i].v);
Insert(root,);
}
// puts("");
printf("%d\n",anss);
return ;
}

【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)的更多相关文章

  1. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  2. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  3. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  4. 【ContestHunter】【弱省胡策】【Round3】(C)

    容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...

  5. 【ContestHunter】【弱省胡策】【Round2】

    官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...

  6. 【ContestHunter】【弱省胡策】【Round8】

    平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...

  7. 【ContestHunter】【弱省胡策】【Round7】

    Prufer序列+高精度+组合数学/DP+可持久化线段树 Magic 利用Prufer序列,我们考虑序列中每个点是第几个插进去的,再考虑环的连接方式,我们有$$ans=\sum_{K=3}^n N^{ ...

  8. 【ContestHunter】【弱省胡策】【Round6】

    KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...

  9. 【ContestHunter】【弱省胡策】【Round5】

    反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...

随机推荐

  1. 001.YUM源服务端搭建

    一 前期准备 1.1 地址规划 主机名 IP地址 备注 mirrors 172.24.8.71/24 yum服务器,与互联网同步 client 172.24.8.72/24 内部客户端 1.2 架构示 ...

  2. Python - 列表与字符串的互相转换

    题目:请将text字符串中的数字取出,并输出成一个新的字符串 text = "aAsmr3 idd4bgs7Dlsf 9eAF" b = list(text) new_list = ...

  3. SpringMVC框架06——文件上传与下载

    1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...

  4. 重读redux源码(一)

    前言 对于react技术栈的前端同学来说,redux应该是相对熟悉的.其代码之精简和设计之巧妙,一直为大家所推崇.此外redux的注释简直完美,阅读起来比较省事.原本也是强行读了通源码,现在也忘得差不 ...

  5. JDBC之 自增长与事务

    JDBC之 自增长与事务 1.自增长 有这样一个现象:数据库中有两个表格 学生表(学生姓名,所在班级),班级表(班级号(自增长的主键),班级人数). 现在我往班级表插入一条信息, 只提供班级人数,班级 ...

  6. 工具使用-----Jmeter的基础用法

    //摘抄至http://www.cnblogs.com/TankXiao/p/4045439.html 以下是我自己录制的关于这篇文章的视频,有兴趣的可以下载哦 https://yunpan.cn/c ...

  7. bzoj1503 郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...

  8. 【转载】GetDeviceCaps()函数相关说明

    CDC::GetDeviceCaps()物理长度与屏幕像素间的转换 作用:读取DC的一些打印区域信息,主要是像素和英寸方面的数据. 声明:GetDeviceCaps(int ) 使用例子://所有像素 ...

  9. Mac应用

    App Store 安装: AnappyApp:   截图软件 Snap:  Dock快捷键启动 izip Unarchiver: rar解压 Dr.Cleaner:内存清理.资源监控 下载安装: C ...

  10. CentOS 7解压安装PHP7.1.21

    下载php yum install -y wget wget http://cn2.php.net/distributions/php-7.1.21.tar.gz 解压 tar -zxvf php-7 ...