QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#730687 | #9543. Good Partitions | gates_orz | WA | 257ms | 11512kb | C++20 | 4.3kb | 2024-11-09 21:03:54 | 2024-11-09 21:03:54 |
Judging History
answer
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long LL;
//#define int LL
#define inl inline
const int N = 3e5 + 10;
const int M = N * 2;
//const int mod=998244353;
const int mod = 1000000007;
const double eps = 1e-8;
//const int mod=1e9+7;
typedef pair<int, int> PII;
//const int INF=0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
void become_faster() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
#define lc u<<1
#define rc u<<1|1
struct Node {
int l,r;
int g;
};
Node tr[N*4];
int sa[N];
void push_up(int u) {
tr[u].g=__gcd(tr[lc].g,tr[rc].g);
}
void build(int u,int l,int r) {
tr[u]={l,r};
if(l==r)return;
int mid=(l+r)/2;
build(lc,l,mid),build(rc,mid+1,r);
}
void modify(int u,int k,int x) {
if(tr[u].l==tr[u].r) {
tr[u].g=x;
return;
}
else {
int mid=(tr[u].l+tr[u].r)/2;
if(k<=mid)modify(lc,k,x);
else modify(rc,k,x);
push_up(u);
}
}
int query(int u,int l,int r) {
if(tr[u].l>=l&&tr[u].r<=r) {
return tr[u].g;
}
else {
int mid=(tr[u].l+tr[u].r)/2;
int res=0;
if(l<=mid)res=__gcd(res,query(lc,l,r));
if(r>mid)res=__gcd(res,query(rc,l,r));
return res;
}
}
int find_first_num(int u,int l,int r) {
if(tr[u].l>r||tr[u].r<l)return -1;
if(tr[u].l>=l&&tr[u].r<=r&&!tr[u].g)return -1;
if(tr[u].l==tr[u].r)return tr[u].l;
int res=-1;
res=find_first_num(lc,l,r);
if(res==-1)res=find_first_num(rc,l,r);
return res;
}
int find_last_num(int u,int l,int r) {
if(tr[u].l>r||tr[u].r<l)return -1;
if(tr[u].l>=l&&tr[u].r<=r&&!tr[u].g)return -1;
if(tr[u].l==tr[u].r)return tr[u].l;
int res=-1;
res=find_last_num(rc,l,r);
if(res==-1)res=find_last_num(lc,l,r);
return res;
}
int f[N];
void init() {
for(int i=1;i<=200000;i++) {
for(int j=1;j*j<=i;j++) {
if(i%j==0) {
f[i]++;
if(i%(i/j)==0&&j!=i/j)f[i]++;
}
}
}
/*for(int i=1;i<=200000;i++) {
if(f[i]==160) {
cout<<"i="<<i<<"\n";
}
}*/
}
void solve() {
cin>>n>>m;
f[0]=n;
for(int i=1;i<=n;i++) {
cin>>sa[i];
}
build(1,1,n);
int last=1;
for(int i=1;i<=n;i++) {
if(sa[i]<sa[i-1]) {
modify(1,i,i-last);
last=i;
}
}
auto debug=[&]() {
cerr << "debug: " << "\n";
for (int i = 1; i <= n; i++) {
cerr << query(1, i, i) << " ";
}
cerr << "\n";
};
//debug();
int res=query(1,1,n);
//if(res==0)res=n;
//cout<<"f: "<<f[res]<<"\n";
//cout<<"res="<<res<<"\n";
cout<<f[res]<<"\n";
while(m--) {
int p,x;
cin>>p>>x;
sa[p]=x;
if(sa[p]>=sa[p-1]) {
modify(1,p,0);
//if(p+1<=n&&sa[p+1]>=sa[p])modify(1,p+1,0);
if(p+1<=n&&sa[p+1]<sa[p])modify(1,p+1,1);
int p1=find_last_num(1,1,p);
if(p1==-1)p1=1;
if(p+1<=n) {
int p2=find_first_num(1,p+1,n);
if(p2!=-1)modify(1,p2,p2-p1);
}
if(p+2<=n&&sa[p+1]<sa[p]) {
p1=find_first_num(1,p+2,n);
modify(1,p1,p1-(p+1));
}
}
else {
//if(p+1<=n&&sa[p+1]>=sa[p])modify(1,p+1,0);
if(p-1>=1) {
int p1 = find_last_num(1, 1, p - 1);
if (p1 == -1)p1 = 1;
modify(1, p, p - p1);
}
if(p+1<=n) {
int p2=find_first_num(1,p+1,n);
if(p2!=-1) {
modify(1,p2,p2-p);
}
}
}
//debug();
res=query(1,1,n);
//if(res==0)res=n;
//cout<<"f: "<<f[res]<<"\n";
//cout<<"res="<<res<<"\n";
cout<<f[res]<<"\n";
}
}
/*
1
5 3
4 3 2 6 1
2 5
3 5
5 6
1
5 2
4 5 2 6 1
2 5
3 5
1
5 2
4 5 5 6 1
2 5
3 5
*/
signed main() {
become_faster();
int T = 1;
//T=read();
init();
//cout<<f[200000]<<"\n";
cin>>T;
//for(int i=1;i<=100;i++)solve(i);
while (T--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 113ms
memory: 4412kb
input:
1 5 2 4 3 2 6 1 2 5 3 5
output:
1 2 3
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 113ms
memory: 4444kb
input:
1 1 1 2000000000 1 1999999999
output:
1 1
result:
ok 2 lines
Test #3:
score: -100
Wrong Answer
time: 257ms
memory: 11512kb
input:
1 200000 200000 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ...
output:
160 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
wrong answer 2nd lines differ - expected: '200000', found: '160'