【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 ...
随机推荐
- 001.YUM源服务端搭建
一 前期准备 1.1 地址规划 主机名 IP地址 备注 mirrors 172.24.8.71/24 yum服务器,与互联网同步 client 172.24.8.72/24 内部客户端 1.2 架构示 ...
- Python - 列表与字符串的互相转换
题目:请将text字符串中的数字取出,并输出成一个新的字符串 text = "aAsmr3 idd4bgs7Dlsf 9eAF" b = list(text) new_list = ...
- SpringMVC框架06——文件上传与下载
1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...
- 重读redux源码(一)
前言 对于react技术栈的前端同学来说,redux应该是相对熟悉的.其代码之精简和设计之巧妙,一直为大家所推崇.此外redux的注释简直完美,阅读起来比较省事.原本也是强行读了通源码,现在也忘得差不 ...
- JDBC之 自增长与事务
JDBC之 自增长与事务 1.自增长 有这样一个现象:数据库中有两个表格 学生表(学生姓名,所在班级),班级表(班级号(自增长的主键),班级人数). 现在我往班级表插入一条信息, 只提供班级人数,班级 ...
- 工具使用-----Jmeter的基础用法
//摘抄至http://www.cnblogs.com/TankXiao/p/4045439.html 以下是我自己录制的关于这篇文章的视频,有兴趣的可以下载哦 https://yunpan.cn/c ...
- bzoj1503 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
- 【转载】GetDeviceCaps()函数相关说明
CDC::GetDeviceCaps()物理长度与屏幕像素间的转换 作用:读取DC的一些打印区域信息,主要是像素和英寸方面的数据. 声明:GetDeviceCaps(int ) 使用例子://所有像素 ...
- Mac应用
App Store 安装: AnappyApp: 截图软件 Snap: Dock快捷键启动 izip Unarchiver: rar解压 Dr.Cleaner:内存清理.资源监控 下载安装: C ...
- 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 ...