首页 > 其他分享 >GYM104363 2023 ccpc 黑龙江省赛 题解

GYM104363 2023 ccpc 黑龙江省赛 题解

时间:2023-05-18 23:44:56浏览次数:60  
标签:typedef int 题解 ccpc long mid GYM104363 define

比赛链接:https://codeforces.com/gym/104363

题解:
B

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 1e6 + 5;

int n,qu;
char s[maxn];

struct segm{
	int lf, ri;
	int s0, s1;
	int lazy;
}se[maxn << 2];

void pushup(int num){
	se[num].s0 = se[num << 1].s0 + se[num << 1 | 1].s0;
	se[num].s1 = se[num << 1].s1 + se[num << 1 | 1].s1;
	if(se[num << 1].ri == se[num << 1|1].lf && se[num << 1].ri == 0)
		se[num].s0 ++;
	if(se[num << 1].ri == se[num << 1|1].lf && se[num << 1].ri == 1)
		se[num].s1 ++;
	se[num].lf = se[num << 1].lf;
	se[num].ri = se[num << 1 | 1].ri;
	se[num].lazy = 0;
}

void build(int l,int r,int num){
	if(l == r){
		se[num].lf = se[num].ri = s[l] - '0';
		se[num].s0 = se[num].s1 = se[num].lazy = 0;
		return ;
	}
	int mid = l+r>>1;
	build(l,mid,num << 1);build(mid+1,r,num << 1|1);
	pushup(num);
}

void pushdown(int num){
	if(!se[num].lazy)return ;
	swap(se[num << 1].s0, se[num << 1].s1);
	se[num << 1].lazy ^= 1, se[num << 1].lf ^= 1, se[num << 1].ri ^= 1;
	swap(se[num << 1|1].s0, se[num << 1|1].s1);
	se[num << 1 | 1].lazy ^= 1, se[num << 1 | 1].lf ^= 1, se[num << 1 | 1].ri ^= 1;
	se[num].lazy = 0;
}

void update(int x,int y,int l,int r,int num){
	if(x <= l && r <= y){
		se[num].lazy ^= 1;
		se[num].lf ^= 1, se[num].ri ^= 1;
		swap(se[num].s0, se[num].s1);
		return ;
	}
	pushdown(num);
	int mid = l+r>>1;
	if(y <= mid){
		update(x,y,l,mid,num << 1);
	}
	else if(x > mid)update(x,y,mid+1,r,num << 1 | 1);
	else update(x,y,l,mid,num<<1),update(x,y,mid+1,r,num<<1|1);
	pushup(num);
}

segm operator + (segm a,segm b){
	segm c;
	c.s0 = a.s0 + b.s0;
	c.s1 = a.s1 + b.s1;
	if(a.ri == b.lf && a.ri == 0)
		c.s0 ++;
	if(a.ri == b.lf && a.ri == 1)
		c.s1 ++;
	c.lf = a.lf;
	c.ri = b.ri;
	return c;
}

segm query(int x,int y,int l,int r,int num){
	if(x <= l && r <= y)
		return se[num];
	pushdown(num);
	int mid = l+r>>1;
	if(y <= mid)return query(x,y,l,mid,num<<1);
	else if(x>mid)return query(x,y,mid+1,r,num<<1|1);
	segm q1 = query(x,y,l,mid,num<<1);
	segm q2 = query(x,y,mid+1,r,num<<1|1);
	return q1 + q2;
}

signed main(){
	scanf("%d%d",&n,&qu);
	scanf("%s",s + 1);
	build(1,n,1);

	while(qu --){
		char t[5];
		int l,r;
		scanf("%s",t+1);scanf("%d%d",&l,&r);
		if(t[1] == 'M'){
			update(l,r,1,n,1);
		}else{
			segm now = query(l,r,1,n,1);
			printf("%d\n",max(now.s0,now.s1) + 1);
		}
	}

	return 0;
}

I

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f;

int n,m;
double dp[5005][5005];

signed main(){
	scanf("%d%d",&n,&m);
	double p = n/m+1;p /= n;
	double q = n/m;q /= n;
	int nump = n%m, numq = m - n%m;
	// cout << nump << ' ' << numq << '\n';

	dp[0][0] = 0;
	for(int i=0;i<=nump;i++)
		for(int j=0;j<=numq;j++)if(i+j){
			double bs = p*i + q*j;
			// printf("? %f %f %f\n",bs,p,q);
			dp[i][j] = (i ? p*i / bs * dp[i-1][j] : 0) + 
				(j ? q*j / bs * dp[i][j-1] : 0) + 1. / bs;
		}
	printf("%.8f\n",dp[nump][numq]);

	return 0;
}

标签:typedef,int,题解,ccpc,long,mid,GYM104363,define
From: https://www.cnblogs.com/SkyRainWind/p/17413642.html

相关文章

  • ASC8题解
    B:考虑用\(D(n,r)\)表示在\(r\)维空间中有\(n\)个超平面最多形成多少个区域,感觉不是很好做,考虑一下怎么递推。根据在二三维的经验,我们可以得到以下递推式:\(D(n,r)=D(n-1,r)+D(n-1,r-1)\),实际意义就是原来已经有了\(n-1\)个然后再加入一个之后,会与前面的\(n-1\)个超平面在\(r\)维......
  • Html中使用jquery通过Ajax请求WebService接口以及跨域问题解决
    场景VS2019新建WebService/Web服务/asmx并通过IIS实现发布和调用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130743584在上面实现发布WebService的基础上,怎样在html中通过jquery对接口发起请求和解析数据。注:博客:https://blog.csdn.net/badao_liumang_qiz......
  • abc269_f Numbered Checker 题解
    NumberedChecker题意有一个\(n\timesm\)的方格矩阵,左上角是\((1,1)\),右下角是\((n,m)\),每个方格中都有一个整数,其中\((x,y)\)中的数字为:如果\(x+y\)是奇数,则\((x,y)\)中的数字为\(0\)。否则,\((x,y)\)中的数字为\((x-1)\timesm+y\)。有\(Q\)组询问,每组......
  • CSP-J2022试题题解
    1.乘方原题:https://www.luogu.com.cn/problem/P8813代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintXN=1e9;lla,b,ans=1;intmain(){ cin>>a>>b; for(inti=1;i<=b;i++){ ans*=a; if(ans>XN){ cout......
  • abc270_f Transportation 题解
    Transportation题意有\(n\)个城市,你可以执行以下操作若干次:选择一个没有建机场的城市\(i\),花费\(x_i\)建一个机场。选择一个没有建港口的城市\(i\),花费\(y_i\)建一个港口。还有\(m\)条没有修建的道路,第\(i\)条道路双向连接\(a_i\)和\(b_i\),修建这条道路需要......
  • CF1077E Thematic Contests 题解
    ThematicContests题意有\(n\)个问题,每个问题有一个分类\(a_i\)。现在要举办一些比赛,要求:一场比赛中所有题目的分类相同。所有比赛的分类是互不相同的。第一场比赛的题目数量任意,但从第二场开始,每一场比赛的题目数量都必须是前一场的两倍。求所有比赛的题目数量之和的......
  • 2023 湖北ccpc
    F.InverseManacher题意:给定回文半径数组,构造回文串(只包含a,b)分析:题目保证一定合法,我们考虑每个'|'位置上的回文半径如果r=1:说明前一个位置与后一个位置上的字符不同如果r>1:说明前一段位置与后一段位置回文,则要保证前后位置上的字符相同实现:#include<bits/std......
  • abc235_d Multiply and Rotate 题解
    MultiplyandRotate题意给定两个整数\(a\)和\(n\),有一个整数\(x\),初始值为\(1\),有两种操作:将\(x\)变成\(x\timesa\)。在\(x>10\)且\(x\)不是十的倍数的情况下可以执行此操作:将\(x\)当成一个字符串,将其循环右移一次。求最少执行多少次操作能把\(x\)变......
  • P8786 李白打酒加强版 题解
    李白打酒加强版题目大意一开始酒显里有\(2\)斗酒,每遇到一次店就会把酒显里的酒数量(单位:斗)乘\(2\),每遇到一次花就把酒显里的酒喝掉\(1\)斗。这一路上一共遇到店\(n\)次,遇到花\(m\)次,且最后一次遇到的是花,酒显里没有一斗酒了。计算这一路上遇到店和花的顺序总共有......
  • YACS 2023年5月月赛 甲组 T1 子集和(六) 题解
    YACS老师说这是道分治,但就不告诉我怎么做,我硬是用线段树卡了过去...特别解气的是把AC图片发了过去(我就是在YACS上的编程课)莫队好了说点正经的,看到是谁谁谁的倍数就能想到DP,状态设计也很水啦!设f[i]为当前考虑到的区间内,子集和%k=i的数量。新加入一个元素时,循环0~......