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. 利用 gdb 探究main(int argc, char *argv[]){} 中的char *argv[]

    在 Linux 系统中编写小程序 代码如下 编译并采用gdb调试  在调试之前设置三个参数   a   bb   ccc 输入 start 执行代码到 return 0; 从这里可以看到 argc = ...

  2. 《编写可维护的javascript》读书笔记(上)

    最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...

  3. 【Ray Tracing in One Weekend 超详解】 光线追踪1-10

    <Ray Tracing in One Weekend>完结篇 最近课程上机实验,封面图渲染时间也超长,所以写东西就落下了,见谅 这篇之后,我会继续<Ray Tracing The ...

  4. oracle批量插入優化方案

    今天聽DBA説如果從一個表批量查詢出一批數據之後批量插入另外一張表的優化方案: 1)不寫歸檔日誌: 2)採用獨佔 關於insert /*+ append */我們需要注意以下三點: a.非歸檔模式下, ...

  5. EditText 数字范围 检查string 是不是数字

    public static boolean isNumeric00(String str){ try{ Integer.parseInt(str); return true; }catch(Numbe ...

  6. BZOJ.3990.[SDOI2015]排序(DFS)

    题目链接 操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\). 我们从小到大枚举所有选择.若当前为第\(i\)个,如果有一段长度为\(2^i ...

  7. [POI2013]Polaryzacja

    [POI2013]Polaryzacja 题目大意: 给定一棵\(n(n\le250000)\)个点的树,可以对每条边定向成一个有向图,这张有向图的可达点对数为树上有路径从\(u\)到达\(v\)的点 ...

  8. CentOS 7 yum 安装mysql5.6

    到mysql社区安装当前可用包 Centos  7  命令 # rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noar ...

  9. Linux学习笔记02—磁盘分区

    下面介绍四种最常见的分区方式: (1)    最简单的分区方案. SWAP分区:即交换分区,建议大小是物理内存的1-2倍. /分区:建议大小在6GB以上. 使用以上的分区方案,所有的数据都在/分区上, ...

  10. CentOS下KVM配置NAT网络(网络地址转换模式)

    KVM虚拟机Nat方式上网: # 查看当前活跃的网络 virsh net-list # 查看该网络的详细配置 virsh net-dumpxml default 客户机的XML配置文件中interfa ...