当前位置:网站首页>2022 Hangzhou Electric Power Multi-School Session 6 1008.Shinobu Loves Segment Tree Regular Questions
2022 Hangzhou Electric Power Multi-School Session 6 1008.Shinobu Loves Segment Tree Regular Questions
2022-08-05 10:17:00 【HeartFireY】
题目分析
The time complexity of solving this problem O ( T log n ) O(T\log n) O(Tlogn),标程 O ( T log 2 n ) O(T \log^2 n) O(Tlog2n)
Find each node in order b u i l d build buildThe regularity of the resulting addition sequence:(若干个 1 1 1)+(same number 2 , 3 , 4... 2,3,4... 2,3,4...)+(several identical numbers),Then find the plus 2 , 3 , 4 , . . . 2,3,4,... 2,3,4,...The number of times is related to the number of layer nodes.即为加 2 ⌊ l o g 2 x ⌋ 2^{ {\lfloor log_2{x} \rfloor}} 2⌊log2x⌋次 2 , 3 , 4 , … 2,3,4,\dots 2,3,4,….
This rule can be passed 1. 1. 1.Analyze the segment tree b u i l d build build性质 2. 2. 2.暴力打表(牛逼) 发现
Then we can write the formula:Suppose the addition sequence length is s i z siz siz,加 1 1 1的个数为 c n t 1 cnt_1 cnt1,那么该节点 r t rt rtThe sum of can be expressed as :
c n t 1 + ( ( ( s i z − c n t 1 ) ( 2 ⌊ l o g 2 x ⌋ ) + 1 ) × ( ( s i z − c n t 1 ) ( 2 ⌊ l o g 2 x ⌋ ) + 2 ) 2 − 1 ) × 2 ⌊ l o g 2 x ⌋ + [ ( s i z − c n t 1 ) m o d ( 2 ⌊ l o g 2 x ⌋ ) ) ] × ( ( s i z − c n t 1 ) ( 2 ⌊ l o g 2 x ⌋ ) + 2 ) cnt_1 + (\frac{(\frac{(siz - cnt1)}{(2^{ {\lfloor log_2{x} \rfloor}})} + 1) \times (\frac{(siz - cnt1)}{(2^{ {\lfloor log_2{x} \rfloor}})} + 2)}{2} - 1) \times 2^{ {\lfloor log_2{x} \rfloor}} + [(siz - cnt_1) \mod (2^{ {\lfloor log_2{x} \rfloor}}))] \times (\frac{(siz - cnt1)}{(2^{ {\lfloor log_2{x} \rfloor}})} + 2) cnt1+(2((2⌊log2x⌋)(siz−cnt1)+1)×((2⌊log2x⌋)(siz−cnt1)+2)−1)×2⌊log2x⌋+[(siz−cnt1)mod(2⌊log2x⌋))]×((2⌊log2x⌋)(siz−cnt1)+2)The number of digits to add s i z siz siz的规律,对于当前节点 r t rt rt:
- ⌈ ( r t − 2 ⌊ l o g 2 r t ⌋ ) / 2 ⌉ m o d 2 = = 1 , s i z − = 2 ⌊ l o g 2 r t ⌋ − 2 \lceil(rt - 2^{\lfloor log_2{rt} \rfloor}) / 2 \rceil \mod2 == 1, siz -= 2^{\lfloor log_2{rt} \rfloor - 2} ⌈(rt−2⌊log2rt⌋)/2⌉mod2==1,siz−=2⌊log2rt⌋−2
- ⌈ ( r t − 2 ⌊ l o g 2 r t ⌋ ) / 2 ⌉ m o d 2 = = 0 , s i z − = 2 ⌊ l o g 2 r t ⌋ − 1 \lceil(rt - 2^{\lfloor log_2{rt} \rfloor}) / 2 \rceil \mod2 == 0, siz -= 2^{\lfloor log_2{rt} \rfloor - 1} ⌈(rt−2⌊log2rt⌋)/2⌉mod2==0,siz−=2⌊log2rt⌋−1
求 s i z siz siz时,可以令 s i z = n siz = n siz=n,Then follow the path up the tree(Actually corresponds to the binary digit of the number)向上走,Then subtract the value corresponding to the current node.
1 1 1的规律:可以 O ( 1 ) O(1) O(1)求:
c n t 1 = { 2 ( ⌊ l o g 2 x ⌋ − 1 ) , ( x − 2 ⌊ l o g 2 x ⌋ + 1 ) m o d 2 = 1 2 ⌊ l o g 2 x ⌋ , ( x − 2 ⌊ l o g 2 x ⌋ + 1 ) m o d 2 = 0 cnt_1 =\left\{\begin{matrix} 2^{({\lfloor log_2{x} \rfloor} - 1)},\ (x - 2^{ {\lfloor log_2{x} \rfloor}} + 1) \mod 2 =1 \\ 2^{ {\lfloor log_2{x} \rfloor}},\ (x - 2^{ {\lfloor log_2{x} \rfloor}} + 1) \mod 2 = 0 \end{matrix}\right. cnt1={ 2(⌊log2x⌋−1), (x−2⌊log2x⌋+1)mod2=12⌊log2x⌋, (x−2⌊log2x⌋+1)mod2=0注意,当 s i z < 0 siz < 0 siz<0时,特判输出 0 0 0,Ask for the first level s i z siz sizIt is also necessary to make special judgments to avoid overflow.同时对 n = 1 n = 1 n=1的 4 4 4A special case is also required,避免溢出.
Code
#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, MOD = 1e9 + 7;
inline void solve(){
int n = 0, x = 0; cin >> n >> x;
if(n == 1 && x == 1){
cout << 1 << endl; return; }
else if(n == 1 && x != 1){
cout << 0 << endl; return; }
if(x == 1){
cout << (n * (n + 1) / 2) << endl; return; }
//cout << "FUCK:" << get_range(x) << endl;
//if(x > get_range(x)){ cout << 0 << endl; return; }
int ceng = log2(x), ceng_fir = (1 << (ceng));
int cnt1 = ((x - ceng_fir + 1) % 2) ? (1 << (ceng - 1)) : ceng_fir;
if((x - ceng_fir + 1) == 0) cnt1 = ceng_fir;
// cnt_1 -> 1的个数
int siz = n;
int rt = x;
while(rt != 2 && rt != 3){
// cout << rt << " BEF | ";
int ceng_now = log2(rt) + 1, ser = rt - (1 << (ceng_now - 1)) + 1;
int md = ser % 4;
if(md == 1 || md == 2) siz -= (1 << (ceng_now - 3));
if(md == 3 || md == 0) siz -= (1 << (ceng_now - 2));
rt >>= 1;
// cout << rt << " AFT " << endl;
// cout << siz << endl;
}
if(rt != 1) siz -= 1;
if(siz <= 0){
cout << 0 << endl;
return;
}
if(siz <= cnt1){
cout << siz << endl;
return;
}
int yu = (siz - cnt1) % (ceng_fir), m = (siz - cnt1) / (ceng_fir);
int ans = yu * (m + 2) + cnt1 + ceng_fir * ((m + 1) * (m + 2) / 2 - 1);
cout << ans << endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
cout << fixed << setprecision(12);
int t = 1; cin >> t;
while(t--) solve();
return 0;
}
边栏推荐
猜你喜欢

three物体围绕一周呈球形排列

First Decentralized Heist?Loss of nearly 200 million US dollars: analysis of the attack on the cross-chain bridge Nomad

dotnet OpenXML 解析 PPT 图表 面积图入门

JS逆向入门学习之回收商网,手机号码简易加密解析

项目成本控制如何帮助项目成功?

气象数据数据处理实例——matlab字符串切割匹配与R语言日期匹配(数据拼接)

Our Web3 Entrepreneurship Project, Yellow

STM32+ULN2003 drives 28BYJ4 stepper motor (forward and reverse according to the number of turns)

Analysis and practice of antjian webshell dynamic encrypted connection

电竞、便捷、高效、安全,盘点OriginOS功能的关键词
随机推荐
企业的数字化转型到底是否可以买来?
深入理解 Istio 流量管理的超时时间设置
LeetCode 216. Combined Sum III (2022.08.04)
韦东山 数码相框 项目学习(六)tslib的移植
Imitation SBUS fixed with serial data conversion
The difference between find, matches, lookingAt matching strings in matcher
力扣(LeetCode)216. 组合总和 III(2022.08.04)
Tanabata romantic date without overtime, RPA robot helps you get the job done
Voice-based social software development - making the most of its value
入门 Polkadot 平行链开发,看这一篇就够了
这份阿里强推的并发编程知识点笔记,将是你拿大厂offer的突破口
你最隐秘的性格在哪?
基于MindSpore高效完成图像分割,实现Dice!
什么是CRM决策分析管理?
高质量 DeFi 应用构建指南,助力开发者玩转 DeFi Summer
Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)
Why are RELTABLESPACE values 0 for many tables displayed in sys_class?
MySQL advanced (twenty-seven) database index principle
教你本地编译运行一个IDEA插件,在IDEA里聊天、下棋、斗地主!
leetcode: 529. 扫雷游戏