【时空复杂度分析】

【时空复杂度分析】

各时间复杂度量级对应n书目

一般总复杂度不超过1e9

O(logn)       -> 常数范围
O(n)          -> le9
O(nlogn)      -> <1e7
O(n*sqrt(n))  -> 1e5
O(n^2)        -> 1e4
O(n^3)        -> 5e2
O(2^n)        -> 25
O(n!)         -> 11

遇到1e5要遍历n^2往上不用慌!!!
想想O(nlogn)

小L的字符串翻转

https://ac.nowcoder.com/acm/contest/95337/D

调和级数

image

代码

/*时间复杂度分析->调和级数 O(nlogn)->直接扫就好*/
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef pair<int,int> PII;
typedef long long ll;
ll abss(ll a){return a>0?a:-a;}
ll max_(ll a,ll b){return a>b?a:b;}
ll min_(ll a,ll b){return a<b?a:b;}
bool cmpll(ll a,ll b){return a>b;}
const int N=1e6+10;
int n;
string s;
int ze[N],on[N];
signed main(){
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      cin>>n;
      cin>>s;
      for(int i=0;i<n;i++){
            if(s[i]=='0'){
                  ze[i+1]=ze[i]+1;
                  on[i+1]=on[i];
            }
            else if(s[i]=='1'){
                  ze[i+1]=ze[i];
                  on[i+1]=on[i]+1;
            }
      }
      int ans=1;//len为1时,最小贡献值是1(全部数化成1个然后合并)
      for(int len=2;len<=n;len++){
            int res=1;
            /*
            【思路】
            当一个序列同时出现0和1时:对答案贡献值为1
            否则为0
            */
            for(int i=1;i<=n;i+=len){//注意这里是调和级数的复杂度
                  int j=(i+len-1)>=n?n:(i+len-1);
                  if((ze[j]-ze[i-1])>0 && (on[j]-on[i-1])>0){
                        res++;
                  }
            }
            ans=res^ans;
      }
      cout<<ans;
      return 0;
}

Poi 的新加法(Hard Version)

https://ac.nowcoder.com/acm/contest/109080/F
时间复杂度是个谜
但是只要遇到0就break应该是没问题的(因为大部分情况都是很早就变成0)

int n,q;
//【位运算】
//发现f=(x&y)<<1;
void solve(){
    cin>>n>>q;
    vector<ll> a(n+1,0);
    for(int i=1;i<=n;i++) cin>>a[i];
    while(q--){
        int l,r;
        cin>>l>>r;
        int len=r-l+1;
        if(len==1) cout<<a[l]<<endl;
        else{
            ll cur=a[l];
            //如果出现0就break->后面都是0
            //时间复杂度是个迷 但是要敢写
            for(int i=l+1;i<=r;i++){
                cur=(cur&a[i])<<1;
                if(cur==0) break;
            }
            cout<<cur<<endl;
        }
    }
}
posted @ 2025-02-11 12:35  White_ink  阅读(11)  评论(0)    收藏  举报