【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)
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)的更多相关文章
- 弱省胡策 Magic
弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...
- 【弱省胡策】Round #5 Count
[弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...
- luoguP3769 [CH弱省胡策R2]TATT
luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...
- 【ContestHunter】【弱省胡策】【Round3】(C)
容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...
- 【ContestHunter】【弱省胡策】【Round2】
官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...
- 【ContestHunter】【弱省胡策】【Round8】
平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...
- 【ContestHunter】【弱省胡策】【Round7】
Prufer序列+高精度+组合数学/DP+可持久化线段树 Magic 利用Prufer序列,我们考虑序列中每个点是第几个插进去的,再考虑环的连接方式,我们有$$ans=\sum_{K=3}^n N^{ ...
- 【ContestHunter】【弱省胡策】【Round6】
KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...
- 【ContestHunter】【弱省胡策】【Round5】
反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...
随机推荐
- mybatis3中@SelectProvider的使用技巧
mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要 ...
- BZOJ 2821作诗(Poetize) 分块
Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...
- 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem C. Contest 水题
Problem C. Contest 题目连接: http://codeforces.com/gym/100714 Description The second round of the annual ...
- ROS知识(23)——行为树Behavio Tree原理
机器人的复杂行为的控制结构CA(Contrl Architecture)通常使用有限状态机来实现,例如ROS提供的smach.行为树是另外一种实现机器人控制的方法,ROS下代表的开源库有pi_tree ...
- 使用 IntraWeb (16) - 基本控件之 TIWList、TIWListbox、TIWComboBox、TIWOrderedListbox
TIWList //列表; 它对应 Html 中的 OL.LI(某些选项下会用表格模拟); TIWListbox 和 TIWComboBox 则对应 Html 在的 Option TIWListbox ...
- Delphi 的链式代码
有了一系列的 Helper, Delphi 也可以使用链式代码了. //譬如要把 3.1415926 中的 141 提取为一个整数: var num: Integer; begin num := Pi ...
- OpenVPN相同证书不同客户端设置不同静态IP的问题
无解!只能老老实实的使用不同证书不同客户端实现设置不同的静态IP.OpenVPN设置静态IP是根据证书名设置的,不能是登录名,无效. 无解! 无解!
- Android开发之解决APP启动白屏或者黑屏闪现的问题
在做搜芽的过程中,发现那个外包人缘做的不行,由于启动的时候会停顿,然后白屏一会,联想到几个月前我在我的三僚企业通信软件里面拉起9K-Mail的时候也会黑屏,所以决定学习一下.解决一下.这不,万能的网络 ...
- AN2820 Driving bipolar stepper motors using a medium-density STM32F103xx microcontroller
AN2820 Driving bipolar stepper motors using a medium-density STM32F103xx microcontroller Introductio ...
- SQL 版本说明
http://www.cnblogs.com/SameZhao/p/6184924.html The ProductMajorVersion产品主版本号 如: 12为 SQL SERVER 2014 ...