一张长度为n的纸带,我们可以从左至右编号为0-n(纸带最左端标号为
0)。现在有m次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带
的长度是多少。
第一行两个数字你,m如题意所述。
接下来一行m个整数代表每次折叠的位置。
一行一个整数代表答案。
5 2
3 5
2
树上有只鸟。
对于60%的数据,n,m≤3000。
对于100%的数据,n≤10^18 ,m≤3000。
对于60%的数据可以用并查集来做
每次把折叠后小的一段去掉
再把去掉的一段上的点与保留的一段上的点对应起来
用 并茶几 建立关系
对于100%的数据 先把m次操作存起来离线处理
每次操作后,将去掉的那一段的点直接修改成当前
还在纸条上的点
例如
长度为8的点从5这里折叠,
显然去掉6-8的段 那么将之后操作中的6-8的数字改为2-4
对应修改就可以
这里修改的数字都是m次操作中要折叠的地方
用数组记录一下就可以了
#include
#include
#include
using namespace std;
unsigned long long n,p[3010],start,end;
int m;
int main()
{
freopen("he.in","r",stdin);
freopen("he.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>p[i];
start=0;
end=n;
for(int i=1;i<=m;i++)
if((p[i]-start)>=(end-p[i]))
{
n=n-(end-p[i]);
end=p[i];
for(int j=i+1;j<=m;j++)
if(p[j]>end)
p[j]=p[i]-(p[j]-p[i]);
}
else if((p[i]-start)<(end-p[i]))
{
n=n-(p[i]-start);
start=p[i];
for(int j=i+1;j<=m;j++)
if(p[j]cout<return 0;
}
给你M,S,L,R求满足L≤ (S×x) mod M≤R最小的正整数想x。
第一行一个数T代表数据组数。
接下来T行每行四个数代表该组数据的M,S,L,R。
对于每组数据,输出一行代表答案。如果不存在解,输出“−1” 。
1
5 4 2 3
2
叫南小鸟。
对于30%的数据,保证有解且答案不超过10^6 。
另外20%的数据,L==R。
对于100%的数据,1≤T≤100,0≤M,S,L,R≤ 10^9 。
正在手敲中...................................
n个人坐成一圈,其中第n个人拿着一个球。每次每个人会以一定的概率向
左边的人和右边的人传球。当所有人都拿到过球之后,最后一个拿到球的人即为
胜者。求第n个人获胜的概率。 (所有人按照编号逆时针坐成一圈)
第一行一个数T代表数据组数。
对于每组数据,第一行两个整数n,k如题意所述。
接下来每行一个实数p代表该人将球传给右边的人的概率。
对于每组数据,一行一个实数代表答案,保留9位小数。
1
5 1
0.10
0.20
0.30
0.40
0.50
0.007692308
然后鸟是我的。
对于20%的数据,n≤3。
对于70%的数据,T,n≤10。
对于100%的数据,T≤10000,1≤n≤100。
这题我做的是一脸懵逼,听得也是一脸懵逼
zhw大神说的是等比数列推式子,一脸懵逼
还说可以把传球的人的左右两边直到
最后拿到球的人的中间的人合并成一个人(0.0)我都惊呆了
分求出求出两部分的概率
其实我也不太会,有神犇看出错误请指点
#include
#define LDB long double
#define DB double
using namespace std;
const int N=1000+10;
int T,n,k,pre[N],next[N];
LDB p[N],q[N];
void deal(int b){
int a=pre[b],c=next[b];
LDB pa=p[a],pb=p[b],pc=p[c];
p[a]=pa*pb/(1-pa*(1-pb));
q[a]=1-p[a];
q[c]=(1-pc)*(1-pb)/(1-pb*(1-pc));
p[c]=1-q[c];
next[a]=c;pre[c]=a;
}
LDB solve(){
if(n<=2) return 1;
if(n<=3) return k==1?p[1]:q[2];
for(int i=1;i<=n;i++) pre[i]=i-1,next[i]=i+1;
pre[1]=n;next[n]=1;
if(k==1){
for(int i=2;i1;i++) deal(i);
return p[1];
}
if(k==n-1){
for(int i=2;i1;i++) deal(i);
return q[n-1];
}
for(int i=2;i1;i++) if(i!=k) deal(i);
deal(k);
return q[k]*p[1]+p[k]*q[n-1];
}
DB v;
#define name "it"
int main(){
freopen(name".in","r",stdin);
freopen(name".out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lf",&v);
p[i]=v;
q[i]=1-v;
}
printf("%.9lf\n",(DB)solve());
}
fclose(stdin);
fclose(stdout);
return 0;
}