【时空复杂度分析】
【时空复杂度分析】
各时间复杂度量级对应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
调和级数
代码
/*时间复杂度分析->调和级数 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;
}
}
}