【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 ...
 
随机推荐
- Ubuntu 18.04 下配置 HAXM 加速 Android模拟器
			
Ubuntu 18.04 下配置 HAXM 加速 Android模拟器 最近在vmware环境下搭建ubuntu18.04开发环境,开始发现总是运行android模拟器在console提示加载如下错误 ...
 - curl命令大全
			
curl 命令行工具的使用及命令参数说明 curl是一个开源的用于数据传输的命令行工具与库,它使用URL语法格式,支持众多传输协议,包括:HTTP.HTTPS.FTP.FTPS.GOPHER.TFTP ...
 - Spring拦截器和过滤器
			
什么是拦截器 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者 ...
 - 关于ImportError: libssl.so.10: cannot open shared object file: No such file or directory unable to load app 0 (mountpoint='') (callable not found or import error)
			
一.问题描述 在亚马逊云服务器使用Nginx+uwsgi部署django项目时,项目可以使用python manage.py runserver正常运行,uwsgi测试也没问题,Nginx也正常启动, ...
 - 我现所认知的SSH
			
实习了三个月,对着SSH有着一定的认识了,就以自已认识的大概思路写一篇文章吧,留给以后的自已,也恳请各位博友们如果看到我的认识有过错的地方能帮我指正过来! 我用到的资料 在写正文之前,先说说我这段时间 ...
 - MySQL数据库之存储过程与存储函数
			
1 引言 存储过程和存储函数类似于面向对象程序设计语言中的方法,可以简化代码,提高代码的重用性.本文主要介绍如何创建存储过程和存储函数,以及存储过程与函数的使用.修改.删除等操作. 2 存储过程与存储 ...
 - 【Ray Tracing in One Weekend 超详解】 光线追踪1-9 景深
			
今天我们来学最后一章 Chapter11:Defocus Blur Preface 散焦模糊 也称 景深 首先,我们来了解一下散焦模糊,我们在真实相机中散焦模糊的原因是因为它们需要一个大圈(而不仅仅是 ...
 - 循序渐进学.Net Core Web Api开发系列【6】:配置文件appsettings.json
			
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇描 ...
 - BZOJ2911 : [Poi1997]The Number of Symmetrical Choices
			
新建源汇S,T,根据题意可以建出一个DAG 设f[x][y]为从x走到y的回文路径的方案数,则 边界条件: f[x][x]=1 对于一条边x->y,若a[x]==a[y],则f[x][y]=1 ...
 - 如何快速将Linux文件系统迁移到Azure存储
			
概述 前一段时间一直在给一个客户将原先搭载在Linux(客户使用的是CentOS 7.0)上的NFS快速迁移到Azure存储上,并且为了保证数据完整性还需要另开一个存储做冷备,架构图如下: 通过Cli ...