首页 > 其他分享 >Codeforces 1696G - Fishingprince Plays With Array Again

Codeforces 1696G - Fishingprince Plays With Array Again

时间:2023-07-20 13:01:53浏览次数:37  
标签:Again Plays int max Codeforces ge dfrac const

初读题目可以发现一些性质:

  • 每次操作会使整个序列的和减少至多 \(X+Y\),因此 \(ans\ge\dfrac{\sum a_i}{X+Y}\)。
  • 对于两个不相邻位置 \(a_i,a_j(|i-j|>1)\),每次操作最多使它们的和减少 \(\max(X,Y)\)。

然后你发现两个限制可以结合在一起使用,稍加思考可以得到一个比较普适的结论:

  • 对于任意序列 \(d\),如果满足 \(d_i\in\{0,\dfrac{1}{X+Y},\dfrac{1}{\max(X,Y)}\}\),且 \(\forall d_i=\dfrac{1}{\max(X,Y)}\},d_{i-1}=d_{i+1}=0\),那么有 \(ans\ge\sum\limits_{i=1}^na_id_i\)。

这样的下界是否就一定能取到呢?答案是肯定的。证明需要线性规划对偶,这里不再赘述。

使用线段树维护矩阵乘法可以快速求解答案。

const int MAXN=2e5;
const double INF=1e18;
int n,qu,X,Y,a[MAXN+5];
struct mat{
	double a[3][3];
	mat(){for(int i=0;i<3;i++)for(int j=0;j<3;j++)a[i][j]=-INF;}
	friend mat operator *(const mat &X,const mat &Y){
		mat ret;
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)
			chkmax(ret.a[i][j],X.a[i][k]+Y.a[k][j]);
		return ret;
	}
}trs;
struct node{int l,r;mat v;}s[MAXN*4+5];
void build(int k,int l,int r){
	s[k].l=l;s[k].r=r;
	if(l==r){
		s[k].v.a[0][0]=0;s[k].v.a[1][1]=1.0*a[l]/(X+Y);
		s[k].v.a[2][2]=1.0*a[l]/Y;return;
	}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
	s[k].v=s[k<<1].v*trs*s[k<<1|1].v;
}
void modify(int k,int p,int v){
	if(s[k].l==s[k].r){
		s[k].v.a[0][0]=0;s[k].v.a[1][1]=1.0*v/(X+Y);
		s[k].v.a[2][2]=1.0*v/Y;return;
	}int mid=s[k].l+s[k].r>>1;
	if(p<=mid)modify(k<<1,p,v);else modify(k<<1|1,p,v);
	s[k].v=s[k<<1].v*trs*s[k<<1|1].v;
}
mat query(int k,int l,int r){
	if(l<=s[k].l&&s[k].r<=r)return s[k].v;int mid=s[k].l+s[k].r>>1;
	if(r<=mid)return query(k<<1,l,r);else if(l>mid)return query(k<<1|1,l,r);
	else return query(k<<1,l,mid)*trs*query(k<<1|1,mid+1,r);
}
int main(){
	scanf("%d%d%d%d",&n,&qu,&X,&Y);if(X>Y)swap(X,Y);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=0;i<3;i++)for(int j=0;j<3;j++)if((i!=2&&j!=2)||i==0||j==0)trs.a[i][j]=0;
	build(1,1,n);
	while(qu--){
		int opt;scanf("%d",&opt);
		if(opt==1){
			int p,v;scanf("%d%d",&p,&v);
			modify(1,p,v);
		}else{
			int l,r;scanf("%d%d",&l,&r);mat tt=query(1,l,r);double mx=-INF;
			for(int i=0;i<3;i++)for(int j=0;j<3;j++)chkmax(mx,tt.a[i][j]);
			printf("%.10lf\n",mx);
		}
	}
	return 0;
}

标签:Again,Plays,int,max,Codeforces,ge,dfrac,const
From: https://www.cnblogs.com/tzcwk/p/Codeforces-1696G.html

相关文章

  • Codeforces 1446F - Line Distance
    感觉这种类似于让你找第\(k\)大距离的计算几何题其实都挺套路的。二分一个答案\(t\),然后思考一下什么样的点对满足原点到它们的连线的距离\(\let\)。以原点为圆心\(t\)为半径画个圆,然后分情况讨论:如果\((x_i,y_i)\)或\((x_j,y_j)\)在圆内,那么必然符合条件。如果\(......
  • Codeforces 1621H - Trains and Airplanes
    这能3500?对于一组在\(u\)上的询问,考虑每种线路\(x\),假设\(1\tou\)路径上线路\(x\)的长度为\(len\),那么不难发现收罚款的次数只有两种可能:\(\lfloor\dfrac{len}{T}\rfloor\)或者\(\lfloor\dfrac{len}{T}\rfloor+1\),且对于一个\(v\)满足\(z_u=z_v\)且\(v\)在\(u......
  • Educational Codeforces Round 151
    AB略C(简)将密码\(P\)与\(S\)进行匹配,按顺序决定\(P_i\),为了避免\(P\)成为\(S\)的子串,每次贪心地选择当前匹配位置最靠后的。若出现匹配不上则“YES”。D有点意思。从基础的情况入手:设\(\{s_i\}\)为\(\{a_i\}\)的前缀和,弄出\(\{s_i\}\)的图像,让我们考虑第一个......
  • Codeforces Round 885 (Div. 2)
    Preface打的就是依托答辩居然也能上分,看来手稳还是重要的说D题半场开香槟以为随便写,然后没想到怎么处理这个局部没有三分性的函数,直接GG后面听学长一说其实分成四种函数分别求最值即可直接恍然大悟,只能说还是太菜太菜而且F好像是个蓝桥杯的某个题的弱化版,我说比赛的时候怎么那......
  • Codeforces Round 882 div.2 A
    Smiling&Weeping----总有人间一两风,填我十万八千梦A.TheManwhobecameaGodtimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutput Kars istiredand......
  • Codeforces Round 885
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1848。我现在手里有三套题要补呃呃这套是两天前补的了,所以简单写写。太好玩辣,多校!A考虑一个2x2的矩阵,若小波奇和她的辣妹朋友位于对角线上就会被辣妹朋友堵在墙角,若相邻则永远抓不到。发现移......
  • Codeforces Round #885 (Div. 2) A-D
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn,m,k;cin>>n>>m>>k;intx,y;cin>>x>>y;boolok=1;for(inti=1;i<=k;i++)......
  • Codeforces Round 885 (Div. 2)
    A.VikaandHerFriends枚举所有的点,判断是否存在点与Vika的距离和其他k个人的距离的奇偶性不同。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=998244353;voidsolve(){intn,m,k,sx,sy;cin>>n>>m>>k>......
  • CodeForces 1848E Vika and Stone Skipping
    洛谷传送门CF传送门感觉比这场的F简单。发现我们要进行\(x\)不断乘一些数然后求答案的操作,猜测答案与\(x\)的因数有关。如果你对数字比较敏感,不难发现答案就是\(x\)的奇因子个数。官方题解的证明:设\(x=f+(f-1)+\cdots+(f-(c-1))\),由等差数列求和公......
  • Codeforces Round 885 (Div. 2) A-D
    A.VikaandHerFriends题意:有一个n*m大小的矩阵,vika在点(a,b),她的k个朋友在分别(xi,yi),所有人每分钟都可以上下左右走一格,每一分钟vika先走,她的朋友后走,不能不走,问vika能否躲过朋友。Solution结论题,只要有一个朋友和她的距离是奇数,那么她肯定会被追上。voidsolve(){ int......