首页 > 其他分享 >ICPC2022 网络赛2 L

ICPC2022 网络赛2 L

时间:2022-09-26 11:47:42浏览次数:60  
标签:ICPC2022 cnt int text sum 网络 CP mathtt

L

给一个长度为\(n\)的字符串\(s\),它只包含I,C,P三种字符。有\(q\)个询问,每次问\(s[l:r]\)子串中有多少个子序列是ICPC。

\(n,q\leq 2\times 10^6\)

题解

硬算。固定I,P的位置后只需查询C的个数。

\[\sum_{s_i=\mathtt{I}}\sum_{s_j=\mathtt{P}}(\text{cnt}_C[j]-\text{cnt}_C[i])(\text{cnt}_C[r]-\text{cnt}_C[j]) \]

拆开为四项,单独计算。反复运用前缀和消去求和符号。

1

\[\sum_{s_i=\mathtt{I}}\sum_{s_j=\mathtt{P}}\text{cnt}_C[j]\text{cnt}_C[r]\\ =\text{cnt}_C[r]\sum_{s_i=\mathtt{I}}(\text{sum}_{\text{cnt}_CP}[r]-\text{sum}_{\text{cnt}_CP}[i])\\ =\text{cnt}_C[r](\text{cnt}_I[r]-\text{cnt}_I[l-1])\text{sum}_{\text{cnt}_CP[r]}\\ -\text{cnt}_C[r](\text{sum}_{\text{sum}_{\text{cnt}_CP}I}[r]-\text{sum}_{\text{sum}_{\text{cnt}_CP}I}[l-1]) \]

2

\[-\sum_{s_i=\mathtt{I}}\sum_{s_j=\mathtt{P}}\text{cnt}_C[j]^2\\ =-\sum_{s_i=\mathtt{I}}(\text{sum}_{(\text{cnt}_CP)^2}[r]-\text{sum}_{(\text{cnt}_CP)^2}[l-1])\\ =-(\text{cnt}_I[r]-\text{cnt}_I[l-1])\text{sum}_{(\text{cnt}_CP)^2}[r]\\ +\text{sum}_{\text{sum}_{(\text{cnt}_CP)^2}I}[r]-\text{sum}_{\text{sum}_{(\text{cnt}_CP)^2}I}[l-1] \]

3

\[-\sum_{s_i=\mathtt{I}}\sum_{s_j=\mathtt{P}}\text{cnt}_C[i]\text{cnt}_C[r]\\ =-\text{cnt}_C[r]\sum_{s_i=\mathtt{I}}\text{cnt}_C[i](\text{cnt}_P[r]-\text{cnt}_P[i])\\ =-\text{cnt}_C[r]\text{cnt}_P[r](\text{sum}_{\text{cnt}_CI}[r]-\text{sum}_{\text{cnt}_CI}[l-1])\\ +\text{cnt}_C[r](\text{sum}_{\text{cnt}_CI\times\text{cnt}_PI}[r]-\text{sum}_{\text{cnt}_CI\times\text{cnt}_PI}[l-1]) \]

4

\[\sum_{s_i=\mathtt{I}}\sum_{s_j=\mathtt{P}}\text{cnt}_C[i]\text{cnt}_C[j]\\ =\sum_{s_i=\mathtt{I}}\text{cnt}_C[i](\text{sum}_{\text{cnt}_CP}[r]-\text{sum}_{\text{cnt}_CP}[l-1])\\ =\text{sum}_{\text{cnt}_CP}[r](\text{sum}_{\text{cnt}_CI}[r]-\text{sum}_{\text{cnt}_CI}[l-1])\\ -(\text{sum}_{\text{cnt}_CI\times\text{sum}_{\text{cnt}_CP}I}[r]-\text{sum}_{\text{cnt}_CI\times\text{sum}_{\text{cnt}_CP}I}[l-1]) \]

列出公式后实现不困难。时间复杂度\(O(n+q)\)。

constexpr int N=2e6+10;
char s[N];
int u[N], v[N];

int cnt_C[N], cnt_I[N], cnt_P[N];
int sum_cnt_C_P[N], sum_cnt_C_I[N], sum_cnt_C_P_2[N];
int sum_sum_cnt_C_P_I[N], sum_sum_cnt_C_P_2_I[N];
int sum_cnt_C_I_mul_cnt_P_I[N];
int sum_sum_cnt_C_P_I_mul_cnt_C_I[N];

int main(){
	int n=read<int>(), q=read<int>();
	scanf("%s", s+1);
	for(int i=1; i<=n; ++i){
		cnt_C[i]=cnt_C[i-1]+(s[i]=='C');
		
		cnt_I[i]=cnt_I[i-1]+(s[i]=='I');
		
		cnt_P[i]=cnt_P[i-1]+(s[i]=='P');
		
		sum_cnt_C_P[i]=sum_cnt_C_P[i-1];
		if(s[i]=='P') cadd(sum_cnt_C_P[i], cnt_C[i]);
		
		sum_cnt_C_I[i]=sum_cnt_C_I[i-1];
		if(s[i]=='I') cadd(sum_cnt_C_I[i], cnt_C[i]);
		
		sum_cnt_C_P_2[i]=sum_cnt_C_P_2[i-1];
		if(s[i]=='P') cadd(sum_cnt_C_P_2[i], mul(cnt_C[i], cnt_C[i]));
		
		sum_sum_cnt_C_P_I[i]=sum_sum_cnt_C_P_I[i-1];
		if(s[i]=='I') cadd(sum_sum_cnt_C_P_I[i], sum_cnt_C_P[i]);
		
		sum_sum_cnt_C_P_2_I[i]=sum_sum_cnt_C_P_2_I[i-1];
		if(s[i]=='I') cadd(sum_sum_cnt_C_P_2_I[i], sum_cnt_C_P_2[i]);
		
		sum_cnt_C_I_mul_cnt_P_I[i]=sum_cnt_C_I_mul_cnt_P_I[i-1];
		if(s[i]=='I') cadd(sum_cnt_C_I_mul_cnt_P_I[i], mul(cnt_C[i], cnt_P[i]));
			
		sum_sum_cnt_C_P_I_mul_cnt_C_I[i]=sum_sum_cnt_C_P_I_mul_cnt_C_I[i-1];
		if(s[i]=='I') cadd(sum_sum_cnt_C_P_I_mul_cnt_C_I[i], mul(sum_cnt_C_P[i], cnt_C[i]));
	}
	int64 x=read<int64>(), a=read<int64>(), b=read<int64>(), p=read<int64>();
	for(int i=1; i<=q; ++i){
		x=(a*x+b)%p;
		u[i]=x%n+1;
	}
	for(int i=1; i<=q; ++i){
		x=(a*x+b)%p;
		v[i]=x%n+1;
	}
	int ans=0;
	for(int i=1; i<=q; ++i){
		int l=u[i], r=v[i];
		if(l>r) swap(l, r);
		// cerr<<"l="<<l<<" r="<<r<<endl;
		// cnt_C_P*cnt_C_r
		cadd(ans, mul(cnt_C[r], mul(add(cnt_I[r], MOD-cnt_I[l-1]), sum_cnt_C_P[r])));
		cadd(ans, mul(cnt_C[r], add(MOD-sum_sum_cnt_C_P_I[r], sum_sum_cnt_C_P_I[l-1])));
		// -cnt_C_P^2
		cadd(ans, MOD-mul(add(cnt_I[r], MOD-cnt_I[l-1]), sum_cnt_C_P_2[r]));
		cadd(ans, add(sum_sum_cnt_C_P_2_I[r], MOD-sum_sum_cnt_C_P_2_I[l-1]));
		// -cnt_C_I*cnt_C_r
		cadd(ans, MOD-mul(cnt_C[r], mul(cnt_P[r], add(sum_cnt_C_I[r], MOD-sum_cnt_C_I[l-1]))));
		cadd(ans, mul(cnt_C[r], add(sum_cnt_C_I_mul_cnt_P_I[r], MOD-sum_cnt_C_I_mul_cnt_P_I[l-1])));
		// cnt_C_I*cnt_C_P
		cadd(ans, mul(sum_cnt_C_P[r], add(sum_cnt_C_I[r], MOD-sum_cnt_C_I[l-1])));
		cadd(ans, MOD-add(sum_sum_cnt_C_P_I_mul_cnt_C_I[r], MOD-sum_sum_cnt_C_P_I_mul_cnt_C_I[l-1]));
		/*for(int i=l; i<=r; ++i)if(s[i]=='I')
			for(int j=i+1; j<=r; ++j)if(s[j]=='P')
				cadd(ans, mul(add(cnt_C[j], MOD-cnt_C[i]), add(cnt_C[r], MOD-cnt_C[j])));*/
	}
	printf("%d\n", ans);
	return 0;
}

考场上输入看错了,不然能很早过题。

std

std

这种方法就不用手推那么多公式了。

标签:ICPC2022,cnt,int,text,sum,网络,CP,mathtt
From: https://www.cnblogs.com/autoint/p/16730206.html

相关文章

  • 网络安全笔记(Nineteen Days)
    NineteenDays虚拟局域网VLAN一、虚拟局域网VLAN1、目的划分广播域,不用广播域是不能够进行通信的,如果想要进行通信,这时候需要借助路由增强网络的安全性简化了......
  • IVI车载信息娱乐系统的网络安全注意事项
    当今新车购买者的重点更多地集中在“智能座舱生态系统体验”上,而不是动力和油耗等传统功能。汽车行业已将全连接车载信息娱乐(IVI)系统所提供的触摸屏显示器、语音命令和......
  • 卷积神经网络
    1.神经网络    对于一个分类任务,用机器学习方法可以做,具体步骤是首先要明确特征和标签,把这个特征标签数据放到机器学习算法里训练,然后保存模型,预测分类准确性。......
  • Linux网络调试
    ifconfig-配置网络接口ip-显示/操作路由、网络设备、接口和隧道(tunnels)iproute...pingtraceroutedignetstat-打印网络连接,路由表,接口统计,伪装连接和多播成......
  • Wireshark网络分析笔记
    Wireshark简介Wireshark是使用最广泛的一款「开源抓包软件」,常用来检测网络问题、攻击溯源、或者分析底层通信机制。它使用WinPCAP作为接口,直接与网卡进行数据报文交换。......
  • 【博学谷学习记录】超强总结,用心分享|Java基础分享-TCP/IP 网络模型有哪几层?
    目录1.应用层2.传输层3.网络层4.网络接口层5.总结TCP/IP网络模型有哪几层?问大家,为什么要有TCP/IP网络模型?对于同一台设备上的进程间通信,有很多种方式,比如有管道......
  • K8s 网络插件 Calico 报错:Number of node(s) with BGP peering established = 0
    问题现象calico对应的Pod启动失败,报错:Numberofnode(s)withBGPpeeringestablished=0问题分析Calico提供了IP自动检测的方法,默认是使用第一个有效网卡上......
  • 【笔记】计算机网络(第6版)-链路层
    0重要内容点对点信道(PPP协议);广播信道(CSMA/CD协议)数据链路层基本问题:封装成帧、透明传输、差错检测1点对点信道的数据链路层数据链路层基本问题:封装成帧、透明传输......
  • Java网络编程
    网络通信三要素分别是IP地址、端口号和协议IP地址操作类—InetAddress名称说明publicstaticInetAddressgetLocalHost()返回本主机的地址对象publicsta......
  • 神经网络----为什么使用向量化
    我们在处理大数据的时候,尽量避免使用for循环,那样会将低速度importnumpyasnpimporttimea=np.random.rand(1000000)b=np.random.rand(1000000)tic=time.ti......