QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#730393 | #9543. Good Partitions | 2366503423 | RE | 112ms | 7988kb | C++14 | 4.3kb | 2024-11-09 20:02:26 | 2024-11-09 20:02:26 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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