洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解
传送门
听说比赛的时候T4T4T4标程锅了???
WTF换我时间我要写T3啊
于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl。
T1 快速多项式变换(FPT)
题意:给两个整数表示m,f(m)m,f(m)m,f(m),要求你构造一个nnn次多项式f(x)f(x)f(x),nnn自己定大小,要求所有系数非负,最高项系数不为000。
思路:
直接mmm进制分解就完了。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int RLEN=1<<18|1;
inline char gc(){
static char buf[RLEN],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,RLEN,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef long long ll;
ll m,fm,mult;
int main(){
cin>>m>>fm;
vector<ll>ans;
ll tim=0;
mult=1;
while(fm/mult>=m)++tim,mult*=m;
while(1){
ans.push_back(fm/mult);
fm%=mult;
if(mult==1)break;
mult/=m;
}
cout<<ans.size()<<'\n';
for(ri i=ans.size()-1;~i;--i)cout<<ans[i]<<' ';
return 0;
}
T2 加特林轮盘赌
题意:nnn个人坐在一个圆桌上,轮流把加特林对着自己的头,扣动扳机一秒钟。中枪的自动退出,坚持到最后的就是胜利者,每个人在每回合中枪的概率是完全相同的P0P_0P0,给出P0P_0P0和nnn,询问kkk号长脖子鹿最终成为唯一幸存者的概率PkP_kPk。
思路:
定义状态fi,jf_{i,j}fi,j表示iii个人玩,算上当前这个人距离第kkk个人还有jjj回合成为赢家的概率。
我们可以推出几个显然的式子:
fi,1=(1−P0)∗fi,nf_{i,1}=(1-P_0)*f_{i,n}fi,1=(1−P0)∗fi,n
fi,2=P0fi−1,1+(1−P0)fi,1f_{i,2}=P_0f_{i-1,1}+(1-P_0)f_{i,1}fi,2=P0fi−1,1+(1−P0)fi,1
fi,3=P0fi−1,2+(1−P0)fi,2f_{i,3}=P_0f_{i-1,2}+(1-P_0)f_{i,2}fi,3=P0fi−1,2+(1−P0)fi,2
fi,4=P0fi−1,3+(1−P0)fi,3f_{i,4}=P_0f_{i-1,3}+(1-P_0)f_{i,3}fi,4=P0fi−1,3+(1−P0)fi,3
......\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ...... ......
fi,i−1=P0fi−1,i−2+(1−P0)fi,i−2f_{i,i-1}=P_0f_{i-1,i-2}+(1-P_0)f_{i,i-2}fi,i−1=P0fi−1,i−2+(1−P0)fi,i−2
fi,i=P0fi−1,i−1+(1−P0)fi,i−1f_{i,i}=P_0f_{i-1,i-1}+(1-P_0)f_{i,i-1}fi,i=P0fi−1,i−1+(1−P0)fi,i−1
然后发现这个转移式是带环的。
我们设fi,n=xf_{i,n}=xfi,n=x,那么把fi,jf_{i,j}fi,j都表示成Ax+BAx+BAx+B的形式,最后解出xxx即可。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int RLEN=1<<18|1;
inline char gc(){
static char buf[RLEN],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,RLEN,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=gc();
return ans;
}
const int N=10005;
long double f[2][N],p;
int n,k,tmp;
struct coe{
long double a,b;
coe(long double _a=0,long double _b=0):a(_a),b(_b){}
friend inline coe operator+(const coe&a,const coe&b){return coe(a.a+b.a,a.b+b.b);}
friend inline coe operator*(const coe&a,const long double&b){return coe(a.a*b,a.b*b);}
}g[N];
inline void solve(int pos){
g[1]=coe(1-p,0);
for(ri i=2;i<=pos;++i)g[i]=(coe){0,p*f[tmp^1][i-1]}+g[i-1]*(1-p);
double X=g[pos].b/(1-g[pos].a);
for(ri i=1;i<=pos;++i)f[tmp][i]=g[i].a*X+g[i].b;
}
int main(){
cin>>p>>n>>k;
if(p==0)return puts("0.0000000000"),0;
f[tmp=1][1]=1;
for(ri i=2;i<=n;++i)tmp^=1,solve(i);
printf("%.10Lf",f[tmp][k]);
return 0;
}
T3 东京夏日相会
题意:平面上面有nnn个圆,给出它们的圆心和半径,现在要你找出一个圆,使得它覆盖平面上所有的圆且其半径最小,要求输出圆心坐标和半径(保留两位小数)
思路:
好像可以模拟退火?
其实可以用一个多边形来拟合每个小圆,然后跑最小覆盖圆。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=2e5+5;
struct pot{
double x,y;
friend inline pot operator+(const pot&a,const pot&b){return (pot){a.x+b.x,a.y+b.y};}
friend inline pot operator-(const pot&a,const pot&b){return (pot){a.x-b.x,a.y-b.y};}
friend inline pot operator/(const pot&a,const double&b){return (pot){a.x/b,a.y/b};}
inline double mod(){return sqrt(x*x+y*y);}
inline double sqr()const{return x*x+y*y;}
}O,a[30000000];
int n=0,m;
const double pi=acos(-1.0);
inline double dist(const pot&a,const pot&b){return (a-b).mod();}
inline void add_point(double x,double y,double r){
if(!r){a[++n]=(pot){x,y};return;}
double det=max(360.0*acos(1-0.003/r)/pi,1.0);
for(register double ang,i=0;i<360;i+=det)ang=i*pi/180.0,a[++n]=(pot){x+r*cos(ang),y+r*sin(ang)};
}
inline void Set(const pot&a,const pot&b,const pot&c){
double a1=(a.x-b.x)*2,b1=(a.y-b.y)*2,c1=a.sqr()-b.sqr();
double a2=(a.x-c.x)*2,b2=(a.y-c.y)*2,c2=a.sqr()-c.sqr();
O=(pot){(c1*b2-c2*b1)/(a1*b2-a2*b1),(c1*a2-c2*a1)/(b1*a2-b2*a1)};
}
int main(){
scanf("%d",&m);
double x,y,r,R;
while(m--)scanf("%lf%lf%lf",&x,&y,&r),add_point(x,y,r);
random_shuffle(a+1,a+n+1);
O=a[1],R=0;
for(ri i=1;i<=n;++i)if(dist(a[i],O)>R){
O=a[i],R=0;
for(ri j=1;j<i;++j)if(dist(a[j],O)>R){
O=(a[i]+a[j])/2.0,R=dist(a[i],O);
for(ri k=1;k<j;++k)if(dist(a[k],O)>R)Set(a[i],a[j],a[k]),R=dist(O,a[i]);
}
}
printf("%.2lf %.2lf %.2lf",O.x,O.y,R);
return 0;
}
T4 第二代图灵机
题意:
有一条长度为nnn的纸带,每个位置有一个数字和一种颜色
有两种修改:
- 在纸带上的一格写数字.
- 在纸带上的一段区间着色.
有两种询问:
- 求[l,r][l,r][l,r]中包含所有(一共ccc种)颜色,数字和最小的子区间的数字和。
- 求[l,r][l,r][l,r]中没有重复颜色,数字和最大的子区间的数字和。
你需要为第二代图灵机编写算法,使他能通过所有的图灵试验。为保证试验的正确性,所有数据都是随机生成的。
思路:
注意到数据随机
直接上ODT+ODT+ODT+线段树维护区间最值+++树状数组维护区间和即可。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<1)+(ans<<3)+(ch^48),ch=getchar();
return ans;
}
const int N=1e5+5;
int n,m,c,a[N],b[N];
struct Node{
int l,r;
mutable int v;
Node(int l,int r=-1,int v=0):l(l),r(r),v(v){}
friend inline bool operator<(const Node&a,const Node&b){
return a.l<b.l;
}
};
set<Node>S;
typedef set<Node>::iterator It;
inline It split(int pos){
It it=S.lower_bound(pos);
if(it!=S.end()&&it->l==pos)return it;
--it;
if(pos>it->r)return S.end();
int l=it->l,r=it->r,v=it->v;
S.erase(it);
S.insert(Node(l,pos-1,v));
return S.insert(Node(pos,r,v)).first;
}
inline void assign(int l,int r,int v){
It R=split(r+1),L=split(l);
S.erase(L,R),S.insert(Node(l,r,v));
}
namespace Bit{
int bit[N];
inline int lowbit(const int&x){return x&-x;}
inline void update(int x,int v){for(ri i=x;i<=n;i+=lowbit(i))bit[i]+=v;}
inline int query(int x){int ret=0;for(ri i=x;i;i^=lowbit(i))ret+=bit[i];return ret;}
inline int query(int l,int r){return query(r)-query(l-1);}
}
namespace SGT{
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
int mn[N<<2],mx[N<<2];
inline void pushup(int p){mx[p]=max(mx[lc],mx[rc]),mn[p]=min(mn[lc],mn[rc]);}
inline void build(int p,int l,int r){
if(l==r){mx[p]=mn[p]=a[l];return;}
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline int query(int p,int l,int r,int ql,int qr,bool f){
if(ql<=l&&r<=qr)return f?mn[p]:mx[p];
if(qr<=mid)return query(lc,l,mid,ql,qr,f);
if(ql>mid)return query(rc,mid+1,r,ql,qr,f);
return f?min(query(lc,l,mid,ql,qr,f),query(rc,mid+1,r,ql,qr,f)):max(query(lc,l,mid,ql,qr,f),query(rc,mid+1,r,ql,qr,f));
}
inline void update(int p,int l,int r,int k){
if(l==r){mx[p]=mn[p]=a[l];return;}
k<=mid?update(lc,l,mid,k):update(rc,mid+1,r,k),pushup(p);
}
#undef lc
#undef rc
#undef mid
}
inline int query1(int l,int r){
static int vis[101],cnt=0;
if(c==1)return SGT::query(1,1,n,l,r,1);
It R=split(r+1),L=split(l);
int ret=-1;
for(ri i=1;i<=c;++i)vis[i]=0;
cnt=0;
It ll=L,rr=L,tmp=R;
--rr;
--tmp;
for(;ll!=R;){
while(rr!=tmp&&cnt!=c){
++rr;
++vis[rr->v];
if(vis[rr->v]==1)++cnt;
}
if(cnt^c)break;
while(cnt==c){
--vis[ll->v];
if(vis[ll->v]==0){
if(ret==-1)ret=Bit::query(ll->r,rr->l);
else ret=min(ret,Bit::query(ll->r,rr->l));
--cnt;
}
++ll;
}
}
return ret;
}
inline int query2(int l,int r){
static int vis[101];
It R=split(r+1),L=split(l);
int ret=SGT::query(1,1,n,l,r,0);
It ll=L,rr=L;
++rr;
for(ri pos;rr!=R;){
vis[ll->v]=pos=ll->r;
It tmp=ll;
while(rr!=R){
if(vis[rr->v]){
ret=max(ret,Bit::query(max(vis[rr->v],pos),rr->l-1));
ret=max(ret,Bit::query(max(pos,vis[rr->v]+1),rr->l));
if(rr->l!=rr->r)break;
pos=max(pos,vis[rr->v]+1);
while(tmp->r!=vis[rr->v]){if(vis[tmp->v]==tmp->r)vis[tmp->v]=0;++tmp;}
vis[rr->v]=rr->r;
++rr;
continue;
}
ret=max(ret,Bit::query(pos,rr->l));
if(rr->l!=rr->r)break;
vis[rr->v]=rr->r;
++rr;
}
for(It tt=ll;tt!=rr;++tt)vis[tt->v]=0;
ll=rr,++rr;
if(ll==R)break;
}
return ret;
}
int main(){
n=read(),m=read(),c=read();
for(ri i=1;i<=n;++i)a[i]=read(),Bit::update(i,a[i]);
S.insert(Node(0,0,0));
for(ri i=1;i<=n;++i)b[i]=read(),S.insert(Node(i,i,b[i]));
S.insert(Node(n+1,n+1,c+1));
SGT::build(1,1,n);
for(ri op,l,r,x,y;m;--m){
op=read();
switch(op){
case 1:{
x=read(),y=read();
Bit::update(x,y-a[x]),a[x]=y,SGT::update(1,1,n,x);
break;
}
case 2:{
l=read(),r=read();
assign(l,r,read());
break;
}
case 3:{
l=read(),r=read();
cout<<query1(l,r)<<'\n';
break;
}
case 4:{
l=read(),r=read();
cout<<query2(l,r)<<'\n';
break;
}
}
}
return 0;
}
洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解的更多相关文章
- 洛谷[LnOI2019]长脖子鹿省选模拟赛t1 -> 快速多项式变换
快速多项式 做法:刚拿到此题有点蒙,一开始真没想出来怎么做,于是试着去自己写几个例子. 自己枚举几种情况之后就基本看出来了,其实本题中 n 就是f(m)在m进制下的位数,每项的系数就是f(m)在m进制 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结
t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...
- [LnOI2019]长脖子鹿省选模拟赛 东京夏日相会
这里来一发需要开毒瘤优化,并且几率很小一遍过的模拟退火题解... 友情提醒:如果你很久很久没有过某一个点,您可以加上特判 可以像 P1337 [JSOI2004]平衡点 / 吊打XXX 那道题目一样 ...
- 长脖子鹿省选模拟赛 [LnOI2019SP]快速多项式变换(FPT)
本片题解设计两种解法 果然是签到题... 因为返回值问题T了好久... 第一眼:搜索大水题? 然后...竟然A了 #include<cstdio> #include<queue> ...
- 洛谷 - P5030 - 长脖子鹿放置 - 二分图最大独立集
https://www.luogu.org/problemnew/show/P5030 写的第一道黑色题,图建对了. 隐约觉得互相攻击要连边,规定从奇数行流向偶数行. 二分图最大独立集=二分图顶点总数 ...
- 长脖子鹿放置【洛谷P5030】二分图最大独立集变形题
题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则.(因为长脖子 ...
- P5030 长脖子鹿放置 最小割
$ \color{#0066ff}{ 题目描述 }$ 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没有中国象棋"别马腿& ...
- P5030 长脖子鹿放置
题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...
随机推荐
- 使用IntelliJ IDEA 配置Maven
创建一个本地仓库路径 配置本地仓库路径 配置maven环境变量 配置maven环境变量 打开命令输入 : mvn version,配置成功如下图所示: 在IntelliJ IDEA中配置maven f ...
- Android 获取View在屏幕中的位置【转】
Android 获取View在屏幕中的位置 https://blog.csdn.net/lonely_fireworks/article/details/7849643
- Install Oracle Tuxedo in silent mode
在我的工作中,Tuxedo通常是和PeopleSoft一起出现的. 下面总结不同版本Tuxedo静默(silent)安装的方法,方便提高我们部署系统的效率. Tuxedo 12.1.3 1. repo ...
- std::condition_variable::wait_until segment
原因是使用了 -static 改为 -static-libstdc++ -static-libgcc
- v8:: fatalProcessOutOfMemory
express项目,用于画图读写图片数据, pm2 作为进城守护. 生产环节报警:v8:: fatalProcessOutOfMemory,xxxx等,一时不知道什么原因. linux系统下使用如下命 ...
- Java框架spring 学习笔记(十一):aop相关概念
为什么要引入aop? 比如如下情景: 在父类的方法名称发送了变化,在子类调用的方法也需要变化,当工程规模越来越大的时候,维护起来相当不方便,于是就引入了横向切面aop. aop的相关概念: 连接点:类 ...
- 【系统监控】性能监测 vmstat,mpstat,iostat
一.系统整体性能监测工具:uptime [root@WebServer ~]# uptime (同w命令输出的第一行信息) 09:40:52 up 5 days, 57 min, 1 user, lo ...
- Docker registry垃圾回收
Docker registry垃圾回收 通过: docker run -p 5000:5000 -v /netdata/xxxx/registry:/var/lib/registry registry ...
- maven工程 添加本地jar依赖
和第三方平台对接的时候要用到对方提供的一个jar包,jar包怎么直接添加到pom文件的依赖中呢? jar包一般都是公共的,要上传到私服仓库.我们都是直接登录私服,操作仓库. 登录私服可以在项目的pom ...
- vim简单命令
保存文件:普通模式(在 :)后面 1.wq 2.q 3.!q 4.shirft+zz 直接退出vim 5.set nu 设置行号 行号移动: 1.shift+1;移动到该行末尾 2.shirft ...