QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#730393#9543. Good Partitions2366503423RE 112ms7988kbC++144.3kb2024-11-09 20:02:262024-11-09 20:02:26

Judging History

你现在查看的是最新测评结果

  • [2024-11-09 20:02:26]
  • 评测
  • 测评结果:RE
  • 用时:112ms
  • 内存:7988kb
  • [2024-11-09 20:02:26]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 23;
struct Node{
    int l, r;
    ll v, d;
}tr[maxn * 4];
ll a[maxn], b[maxn];
int yin[200005];
void pushup(Node &u, Node &l, Node &r)
{
    u.v = l.v + r.v;
    u.d = __gcd(l.d, r.d);
}
void pushup(int u)
{
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
    //printf("%d[%d,%d]=%d\n",u,tr[u].l,tr[u].r,tr[u].d);
}
void build(int u, int l, int r)
{
    if(l == r) tr[u] = {l, r, b[l], b[l]};
    else 
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}
ll query(int u, int l, int r)
{
    if(tr[u].l >= l && tr[u].r <= r) return tr[u].d;
    else 
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if(r <= mid) return query(u << 1, l, r);
        else if(l > mid) return query(u << 1 | 1, l, r);
        else return __gcd(query(u << 1, l, r), query(u << 1 | 1, l, r));
    }
}
ll query2(int u, int l, int r)
{
    if(tr[u].l >= l && tr[u].r <= r) return tr[u].v;
    else 
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if(r <= mid) return query2(u << 1, l, r);
        else if(l > mid) return query2(u << 1 | 1, l, r);
        else return query2(u << 1, l, r) + query2(u << 1 | 1, l, r);
    }
}
void modify(int u, int p, ll v)
{
    if(tr[u].l == tr[u].r && tr[u].l == p) tr[u].d += v, tr[u].v += v;
    else 
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if(p <= mid) modify(u << 1, p, v);
        else modify(u << 1 | 1, p, v);
        pushup(u);
    }
}
/*int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%lld", &a[i]), b[i] = a[i] - a[i - 1];
    build(1, 1, n);
    char op[4];
    ll op1 = 0, op2 = 0, op3 = 0;
    while(m--)
    {
        scanf("%s%lld%lld", op, &op1, &op2);
        if(*op == 'C') 
        {
            scanf("%lld", &op3);
            modify(1, op1, op3);
            if(op2 + 1 <= n) modify(1, op2 + 1, -op3);
        }
        else 
        {
            ll t = query2(1, 1, op1); //cout << t << endl;
            printf("%lld\n", abs( __gcd(t, query(1, op1 + 1, op2))));
        }
    }
}*/
int num(int n){ //\xb7\xb5\xbbص\xc4\xca\xc7\xd2\xf2\xd7\xd3\xd7\xdc\xca\xfd
    int count=2;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){
            if(i==sqrt(n) && n/i==i){ //\xc8\xe7\xb9\xfb\xc1\xbd\xd2\xf2\xd7\xd3\xcf\xe0ͬ\xa3\xac\xd4\xf2ֻ\xbc\xd31
                 count++;   
            }
            else count+=2;
        }
    }
    return count;
}
int main()
{
    for(int j=1;j<=200005;j++)
    {
        int sum=num(j);
        yin[j]=sum;
    }
    yin[1]=1;
    int t;cin>>t;
    while(t--)
    {
    	int n,q;
        cin>>n>>q;
        vector <int> w(n+1,0);
        for(int i=1;i<=n;i++) cin>>w[i];
        long long int xian=0;
        for(int i=1;i<n;i++)
        {
            if(w[i]>w[i+1]) a[i]=i;
            else a[i]=0;
            xian=__gcd(xian,a[i]);
        }
        a[n]=0;
        cout<<yin[xian]<<'\n';
        for(int i=1;i<=n;i++) b[i] = a[i] - a[i - 1];
        build(1,1,n);
        while(q--)
        {
            int index,x;cin>>index>>x;
            w[index]=x;
            int l,r,d;
            if(index>1)
            {
                if(w[index-1]>w[index])
                {
                	l=index-1;r=index-1;
                	d=index-1-a[index-1];a[index-1]=index-1;
                	modify(1, l, d);
            		if(r + 1 <= n) modify(1, r + 1, -d);
				}
				else
				{
					l=index-1;r=index-1;
                	d=0-a[index-1];a[index-1]=0;
                	modify(1, l, d);
            		if(r + 1 <= n) modify(1, r + 1, -d);
				}
            }
            if(index<n)
            {
            	 if(w[index]>w[index+1])
	            {
	                l=index;r=index;
	                d=index-a[index];a[index]=index;
	                modify(1, l, d);
	            	if(r + 1 <= n) modify(1, r + 1, -d);
	            }
	            else
	            {
	            	l=index;r=index;
	                d=0-a[index];a[index]=0;
	                modify(1, l, d);
	            	if(r + 1 <= n) modify(1, r + 1, -d);
				}
			}
            ll t = query2(1, 1, 1); //cout << t << endl;
            long long int zui=abs( __gcd(t, query(1, 1 + 1, n)));
            cout<<yin[zui]<<'\n';
        }
    }
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 112ms
memory: 7988kb

input:

1
5 2
4 3 2 6 1
2 5
3 5

output:

1
2
3

result:

ok 3 lines

Test #2:

score: -100
Runtime Error

input:

1
1 1
2000000000
1 1999999999

output:

0

result: