社区讨论

线段树70pts求调

CF818ECard Game Again参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlkhuboq
此快照首次捕获于
2026/02/13 14:15
6 天前
此快照最后确认于
2026/02/16 11:50
3 天前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define N 100005
#define ls rt<<1
#define rs rt<<1|1
const int awa=-114514;
struct node{
    int l,r,mul;
}tree[N<<2];
int n,k,ans,a[N];
void push_up(int rt){ 
    tree[rt].mul=(tree[ls].mul*tree[rs].mul)%k;
    return;
}
void build(int rt,int x,int y){ 
    tree[rt].l=x,tree[rt].r=y;
    if(x==y){
        tree[rt].mul=a[x]%k;
        return;
    }
    int mid=(x+y)>>1;
    build(ls,x,mid);
    build(rs,mid+1,y);
    push_up(rt);
    return;
}
int query(int rt,int x,int y){
	if(x<=tree[rt].l&&y>=tree[rt].r) return tree[rt].mul%k;
	int ret=0,mid=(tree[rt].l+tree[rt].r)>>1;
	if(x<=mid) ret=query(ls,x,y);
	if(y>mid) ret=query(rs,x,y);
	return ret;
}
signed main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=n;i++)
	{
		int l=i,r=n,t=awa;
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(query(1,i,mid)==0){
				t=mid;
				r=mid-1;
			} 
			else l=mid+1;
		}
		if(t!=awa) ans+=n-t+1;
	}
	cout<<ans;
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...