티스토리 뷰

Link

Tag

  • Segment Tree
  • Spare Table

Time Complexity

  • O(Q(lgN+lgQ)+XlgX) (X=100003)

f(x)=2x21,g(x)=4x33x이고, 길이 N의 수열 A가 주어진다. f,g를 구간에 적용하는 쿼리와 Ai100003으로 나눈 나머지를 구하는 쿼리가 주어진다. 이러한 쿼리를 Q개 처리해야 한다. 일단 f,g가 곱셈으로만 이루어져 있으니 나머지를 구하는건 그냥 해주면 될거 같고, f,g를 어떻게 하느냐가 문제다. 근데 왜 하필 f,g를 저렇게 줬을까? 뭔가 특별한 성질이 있나? 결론부터 말하자면 fg=gf다. 그래서 1,2번 쿼리가 어떤 순서로 들어왔는지는 중요하지 않고, 각각 Aif,g가 각각 몇번 적용되었는지 알아내고 빠르게 계산할 수 있으면 된다.

 

f,g가 각각 몇번 적용되었는지는 range-update point-query 세그먼트 트리 두개면 된다. 실제 Ai를 빠르게 계산하는건 Sparse Table로 전처리하면 O(lgQ)에 가능하다.

 

Sparse Table 전처리에 O(XlgX) (X=100003), 1,2번 쿼리당 O(lgN), 3번 쿼리당 O(lgN+lgQ)에 처리 가능하다. 대충 엔로그엔~~

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
#define fi first
#define se second
#define endl '\n'
#define y1 holyshit
#define all(x) x.begin(),x.end()
const int inf=0x3f3f3f3f;
const int mod=100003;
int N,Q,A[500010],f[100010][20],g[100010][20];
int tree[2][1<<20];
int base=1<<19;
void update(int op,int l,int r){
l+=base; r+=base;
while(l<=r){
if(l&1) tree[op][l]++;
if(~r&1) tree[op][r]++;
l=(l+1)>>1; r=(r-1)>>1;
}
}
int query(int op,int p){
int ret=0;
for(p+=base;p;p>>=1) ret+=tree[op][p];
return ret;
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>N>>Q;
for(int i=0;i<mod;i++){
f[i][0]=(2LL*i*i-1+mod)%mod;
g[i][0]=(4LL*i*i-3+mod)*i%mod;
}
for(int i=1;i<20;i++) for(int j=0;j<mod;j++){
f[j][i]=f[f[j][i-1]][i-1];
g[j][i]=g[g[j][i-1]][i-1];
}
for(int i=1;i<=N;i++) cin>>A[i];
while(Q--){
int t,l,r,x; cin>>t;
if(t==3){
cin>>x;
int res=A[x], fcnt=query(0,x), gcnt=query(1,x);
for(int i=0;i<20;i++) if((1<<i)&fcnt) res=f[res][i];
for(int i=0;i<20;i++) if((1<<i)&gcnt) res=g[res][i];
cout<<res<<endl;
}
else{
cin>>l>>r;
update(t-1,l,r);
}
}
return 0;
}
view raw 21607.cpp hosted with ❤ by GitHub

'PS > 문제풀이' 카테고리의 다른 글

BOJ 17635: 다리  (0) 2022.04.25
BOJ 16909: 카드 구매하기 3  (0) 2021.04.02
BOJ 14870: 조개 줍기  (0) 2020.08.02
BOJ 16027: Global warming  (0) 2020.06.14
BOJ 17101: Dynamic Centroid  (0) 2020.06.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 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
글 보관함