FJWC2018
晚上水到8:40,感觉药丸。
把电脑带回寝室,大半夜敲键盘……
bzoj5254红绿灯
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define lc son[pos][0]
#define rc son[pos][1]
const int maxn=5e6+7;
ll n,Q,G,R,mod,d[maxn],h[maxn],p[maxn],f[maxn],TOT,tot;
int next[maxn]; char cc; ll ff;
template<typename T>void read(T& aa) {
aa=0;cc=getchar();ff=1;
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} int sum[maxn],son[maxn][2],ql,qr,qx;
void insert(int pos,int last,int l,int r) {
sum[pos]=sum[last]+1;
if(l==r) return;
int mid=(l+r)>>1;
if(qx<=mid) rc=son[last][1],insert(lc=++tot,son[last][0],l,mid);
else lc=son[last][0],insert(rc=++tot,son[last][1],mid+1,r);
} int q(int pos,int l,int r) {
if((!pos)||ql>qr) return 0;
if(l>=ql&&r<=qr) return sum[pos];
int mid=(l+r)>>1,rs=0;
if(ql<=mid) rs+=q(lc,l,mid);
if(qr>mid) rs+=q(rc,mid+1,r);
return rs;
} bool ok(ll a,int pos,int x) {//(t+a)%mod>=g,(t+a)%mod<mod
ll ld=(G+mod-a)%mod,rd=mod-a-1;
if(ld<=rd) {
ql=lower_bound(p+1,p+TOT+1,ld)-p;
qr=upper_bound(p+1,p+TOT+1,rd)-p-1;
return (q(x,1,TOT)-q(pos,1,TOT))==0;
}
else {
ql=1; qr=upper_bound(p+1,p+TOT+1,rd)-p-1;
if((q(x,1,TOT)-q(pos,1,TOT))>0) return 0;
ql=lower_bound(p+1,p+TOT+1,ld)-p; qr=TOT;//
if((q(x,1,TOT)-q(pos,1,TOT))>0) return 0;
}
return 1;
} bool check(int pos,int x) {//(0+t-h[pos])%mod>=g
ll a=(mod-h[pos]%mod)%mod;
return ok(a,pos,x);
} int get_next(int p) {
int l=p,r=n-1,mid;
if(check(p-1,r)) return n+1;
if(!check(p-1,l)) return l+1;
while(l<r-1) {
mid=(l+r)>>1;
if(check(p-1,mid)) l=mid;
else r=mid;
}
return l+2;
} int ef(ll a) {
int l=1,r=n-1,mid;
if(ok(a,0,r)) return n+1;
if(!ok(a,0,l)) return l+1;
while(l<r-1) {
mid=(l+r)>>1;
if(ok(a,0,mid)) l=mid;
else r=mid;
}
return l+2;
} ll get_ans(ll x) {
int pos=ef(x%mod);
x+=h[pos-1];
ll rs=x+f[pos];
if(pos!=n+1) rs+=(mod-x%mod);
return rs;
} int main() {
read(n); read(G); read(R); n++;
ll x,y;
mod=G+R;
For(i,1,n) read(d[i]),h[i]=h[i-1]+d[i];
For(i,1,n) p[i]=h[i]%mod;
sort(p+1,p+n+1);
TOT=unique(p+1,p+n+1)-(p+1);
tot=n;
For(i,1,n) {
qx=lower_bound(p+1,p+TOT+1,h[i]%mod)-p;
insert(i,i-1,1,TOT);
}
next[n]=n+1;
Rep(i,n,1) next[i]=get_next(i);
Rep(i,n,1) {
x=h[next[i]-1]-h[i-1];
f[i]=f[next[i]]+x;
if(next[i]!=n+1) f[i]+=(mod-x%mod);
}
read(Q);
For(i,1,Q) {
read(x);
printf("%lld\n",get_ans(x));
}
return 0;
}
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
const int maxn=500+3,maxt=250*499+3,maxT=1e4+7;
const ll mod=1e9+7;
ll Td,n[maxT],m[maxT],f[maxn][maxt],mi[maxn],inv[maxn],C[maxn][maxn],W; char cc; ll ff;
template<typename T>void read(T& aa) {
aa=0;cc=getchar();ff=1;
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} ll qp(ll x,ll k) {
ll rs=1;
while(k) {
if(k&1) rs=rs*x%mod;
k>>=1; x=x*x%mod;
}
return rs;
} ll get_C(ll n,ll m) {return mi[n]*inv[m]%mod*inv[n-m]%mod;}
inline void mo(ll& x) {if(x>=mod) x-=mod;}
ll pf(ll x){return x*x%mod;} ll solve(ll n,ll m) {
ll rs=0,x;
For(i,1,n) {//len=i
x=min(m,(ll)i*(i-1)/2);
rs+=C[n][i]*(n-i+1)%mod*mi[n-i]%mod*f[i][x]%mod;
mo(rs);
}
return rs;
} int main() {
read(Td);ll x;
For(i,1,Td) {
read(n[i]); read(m[i]);
W=max(W,n[i]);
}
mi[0]=1; For(i,1,W) mi[i]=mi[i-1]*i%mod;
inv[W]=qp(mi[W],mod-2);
Rep(i,W,1) inv[i-1]=inv[i]*i%mod;
f[0][0]=1;
// cerr<<clock()<<"\n";
For(i,0,W-1) {
x=i*(i-1)/2;
For(j,0,x) {
f[i][j]+=f[i][j-1]; f[i][j]%=mod;
//f[i+1][j+0~j+i] += f[i][j]
f[i+1][j]+=f[i][j];
f[i+1][j+i+1]+=mod-f[i][j];
}
}
x=W*(W-1)/2;
For(j,0,x) f[W][j]+=f[W][j-1],mo(f[W][j]);
// cerr<<clock()<<"\n";
//f[i][j]: perm of 1~i , inverse:j
For(i,0,W) {
x=i*(i-1)/2;
For(j,1,x) {
f[i][j]+=f[i][j-1]; mo(f[i][j]);
}
}
// cerr<<clock()<<"\n";
//f[i][j]: perm of 1~i , inverse:0~j
For(i,1,W) For(j,0,i) C[i][j]=pf(get_C(i,j));
For(i,1,W) mi[i]=pf(mi[i]);
For(i,1,Td)
printf("%lld\n",solve(n[i],m[i]));
return 0;
}
bzoj5256井井点点
###############
#.............#
#.###########.#
#.#.........#.#
#.#.#######.#.#
#.#.#.....#.#.#
#.#.#.###.#.#.#
#.#.#.#.#.#.#.#
#.#.#.###.#.#.#
#.#.#.....#.#.#
#.#.#######.#.#
#.#.........#.#
#.###########.#
#.............#
###############
若有多个合法中心位置,
而且还这么麻烦。

FJWC2018的更多相关文章
- [Bzoj5254][Fjwc2018]红绿灯(线段树)
5254: [Fjwc2018]红绿灯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 31 Solved: 24[Submit][Status][D ...
- [FJWC2018]全排列
题解: 考虑长度为k的时候的贡献 即取出一些元素然后给他们排个顺序然后问你有多少排法 假设排法为ans 那么应该就是$C(n,k)*C(n,k)*(n-k)!*(n-k)!*(n-k+1)*ans$ ...
- BZOJ5254 : [Fjwc2018]红绿灯
显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...
- BZOJ5254 FJWC2018红绿灯(线段树)
注意到一旦在某个路口被红灯逼停,剩下要走的时间是固定的.容易想到预处理出在每个路口被逼停后到达终点的最短时间,这样对于每个询问求出其最早在哪个路口停下就可以了.对于预处理,从下一个要停的路口倒推即可. ...
- [FJWC2018]全排列 DP
题面 题面 题解 (表示第一段文字导致我在考场上没看懂题--因为我以为这个定义是定义在整个排列上的,所以相似 = 相同.结果其实是可以应用在一个区间上--) 首先我们发现,2个区间相似,其实就是离散化 ...
- BZOJ 5254 [Fjwc2018]红绿灯 (线段树)
题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...
- 【FJWC2018】最大真因数
题面 Description 一个合数的真因数是指这个数不包括其本身的所有因数, 例如 6 的正因数有1, 2, 3, 6,其中真因数有 1, 2, 3. 一个合数的最大真因数则是这个数的所有真因数中 ...
随机推荐
- sql调优的总结
sql调优的总结 列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等 建立单列索引 根据需要建立多列联合索引 当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低 ...
- 深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)[转]
从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock). ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念.前面的章节中一直在 ...
- jeecms 配置可以低级别用户流程
使用管理员admin登录后台,进入用户—>管理员(本站)à添加,填写用户名.密码等信息,如下图: 需要注意几个权限控制的问题: 1, 等级,值越大等级越高,等级高的管理员可以审核等级低的管理员 ...
- redis学习笔记06-主从复制和哨兵机制
1.主从复制 为了保证线上业务的持续运行,防止主节点因宕机而重启数据恢复消耗太长时间,通常会准备一个备用节点,备份主节点的数据,当主节点出问题时立马顶上.这种机制就叫做主从复制.在了解redis的主从 ...
- c#日期时间截取
时间格式化CodeDateTime dt = DateTime.Now;Label11.Text = dt.ToString();2005-11-5 13:21:25Label12.Text = dt ...
- TZOJ 5963 Increasing Sequences(线性DP)
描述 Given a string of digits, insert commas to create a sequence of strictly increasing numbers so as ...
- CF 529B Group Photo 2 (online mirror version)
传送门 解题思路 这道题要用到贪心的思路,首先要枚举一个h的最大值,之后check.如果这个东西的w[i]与h[i]都大于枚举的值就直接return false,如果w[i]比这个值小,h[i]比这个 ...
- socket.io的基本使用
服务端: 1.监听客户端连接: io.on("connection",socket=>{ }); 不分组数据传输:传输对象为当前socket 2.1给该socket所有客户端 ...
- ThinkPHP中实现微信支付(jsapi支付)流程
https://blog.csdn.net/sinat_35861727/article/details/72783988 之前写过一篇文章讲了 PHP实现微信支付(jsapi支付)流程 ,详见文章: ...
- Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码
前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...