Codeforces 848C Goodbye Souvenir [CDQ分治,二维数点]

Stella981
• 阅读 653

洛谷

Codeforces


这题我写了四种做法……


思路

不管做法怎样,思路都是一样的。

好吧,其实不一样,有细微的差别。

第一种

考虑位置$x$对区间$[l,r]$有$\pm x$的贡献当且仅当$pre_x!!!r$,其中$pre,nxt$表示与$x$同种颜色的前驱后继。

那么题目就转化为二维数点了:一维是位置,一维是前驱/后继,权值是$\pm​$位置。

第二种

考虑最后的减去开始的等价于每一位减去前面的。

即位置$x$的贡献是$x-pre_x,pre_x\geq l$。

那么题目同样转化为二维数点:一维是位置,一维是前驱,权值是$x-pre_x$。


做法

做法一

按照第一种思路,暴力树套树。

然而这样你会发现自己要么MLE要么RE……

做法二

按照第一种思路,莫队+树状数组。

然而你会不停地TLE,而且我的卡常技巧不够高超,放弃了。

做法三

按照第二种思路,莫队+树状数组。

并不需要怎么卡常就可以过。

做法四

这个是正解了。CDQ分治+二维数点。

用第二种思路,每次$pre_x$的变动可以变为在$(x,pre_x)$这个点上加减$x-pre_x$,询问可以变为查询以$(l,l)$为左下角,$(r,n)$为右上角的矩形之和。按照时间CDQ分治,每次算左边的点对右边的矩形的贡献。

然而这个矩形不好看,似乎还要差分/树套树?

其实并不用。考虑$x>pre_x$,所以直线$y=x$上方是没有点的,可以把查询变成以$(1,l)$为左下角,$(r,n)$为右上角的矩形。这样可以扫描线+树状数组了。

时间复杂度应该是$O(n\log^2 n)$。


代码

做法一

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define pii pair<int,int>
    #define fir first
    #define sec second
    #define MP make_pair
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
    #define drep(i,x,y) for (int i=(x);i>=(y);i--)
    #define go(x) for (int i=head[x];i;i=edge[i].nxt)
    #define sz 101010
    typedef long long ll;
    template<typename T>
    inline void read(T& t)
    {
        t=0;char f=0,ch=getchar();
        double d=0.1;
        while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
        while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
        if(ch=='.')
        {
            ch=getchar();
            while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
        }
        t=(f?-t:t);
    }
    template<typename T,typename... Args>
    inline void read(T& t,Args&... args){read(t); read(args...);}
    void file()
    {
        #ifndef ONLINE_JUDGE
        freopen("a.txt","r",stdin);
        #endif
    }
//    inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;

int n,m;
int a[sz];
int pre[sz],nxt[sz];
set<int>s[sz];

#define Tree sz*100
int Ls[Tree],Rs[Tree];
ll sum[2][Tree]; // 0:pre 1:nxt
#define Lson Ls[k],l,mid
#define Rson Rs[k],mid+1,r
int cnt;
int bin[Tree],top;
void del(int &k){Ls[k]=Rs[k]=sum[0][k]=sum[1][k]=0;bin[++top]=k;k=0;}
int newnode(){return top?bin[top--]:++cnt;}
void Add(int &k,int l,int r,int x,int y,int t)
{
    if (!k) k=newnode();
    sum[t][k]+=y;
    if (l==r) { if (!sum[0][k]&&!sum[1][k]) del(k); return; }
    int mid=(l+r)>>1;
    if (x<=mid) Add(Lson,x,y,t);
    else Add(Rson,x,y,t);
    if (!sum[0][k]&&!sum[1][k]) del(k);
}
ll Query(int k,int l,int r,int x,int y,int t)
{
    if (!k||x>y||!sum[t][k]) return 0;
    if (x<=l&&r<=y) return sum[t][k];
    int mid=(l+r)>>1;ll ret=0;
    if (x<=mid) ret+=Query(Lson,x,y,t);
    if (y>mid) ret+=Query(Rson,x,y,t);
    return ret;
}
void Debug(int k,int l,int r,int t)
{
    if (!k) { rep(i,l,r) printf("0 "); return; }
    if (l==r) return (void)printf("%lld ",sum[t][k]);
    int mid=(l+r)>>1;
    rep(i,0,1) assert(sum[i][k]==sum[i][Ls[k]]+sum[i][Rs[k]]);
    Debug(Lson,t);Debug(Rson,t);
}
#undef Lson
#undef Rson

int root[sz<<2];
#define ls k<<1
#define rs k<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
ll query(int k,int l,int r,int x,int y)
{
    if (x<=l&&r<=y) 
    {
        ll a=Query(root[k],0,n+1,y+1,n+1,1),b=Query(root[k],0,n+1,0,x-1,0);
        return a-b;
    }
    int mid=(l+r)>>1;ll ret=0;
    if (x<=mid) ret+=query(lson,x,y);
    if (y>mid) ret+=query(rson,x,y);
    return ret;
}
void debug(int k,int l,int r)
{
    printf("%d ~ %d:\n",l,r);
    printf("pre: ");Debug(root[k],0,n+1,0);puts("");
    printf("nxt: ");Debug(root[k],0,n+1,1);puts("");
    if (l==r) return;
    int mid=(l+r)>>1;
    debug(lson);debug(rson);
}
void change(int k,int l,int r,int x,int a,int b) // pre[x]->a , nxt[x]->b
{
    if (pre[x]!=-1) Add(root[k],0,n+1,pre[x],-x,0);
    Add(root[k],0,n+1,a,x,0);
    if (nxt[x]!=-1) Add(root[k],0,n+1,nxt[x],-x,1);
    Add(root[k],0,n+1,b,x,1);
    if (l==r) return;
    int mid=(l+r)>>1;
    if (x<=mid) change(lson,x,a,b);
    else change(rson,x,a,b);
}

int calcPre(int x,int col){set<int>::iterator it=s[col].lower_bound(x);--it;return *it;}
int calcNxt(int x,int col){return *(s[col].upper_bound(x));}

int main()
{
    file();
    int x,y,z;
    read(n,m);
    rep(i,1,n) s[i].insert(0),s[i].insert(n+1);
    rep(i,1,n) read(a[i]),s[a[i]].insert(i);
    rep(i,1,n)
    {
        int Pre=calcPre(i,a[i]),Nxt=calcNxt(i,a[i]);
        pre[i]=nxt[i]=-1;
        change(1,1,n,i,Pre,Nxt);
        pre[i]=Pre,nxt[i]=Nxt;
    }
    while (m--)
    {
        read(z,x,y);
        if (z==1)
        {
            if (y==a[x]) continue;
            int Pre=calcPre(x,y),Nxt=calcNxt(x,y);
            change(1,1,n,x,Pre,Nxt);
            if (pre[x]!=0) change(1,1,n,pre[x],pre[pre[x]],nxt[x]);
            if (nxt[x]!=n+1) change(1,1,n,nxt[x],pre[x],nxt[nxt[x]]);
            if (Pre!=0) change(1,1,n,Pre,pre[Pre],x);
            if (Nxt!=n+1) change(1,1,n,Nxt,x,nxt[Nxt]);
            s[a[x]].erase(x);s[y].insert(x);
            a[x]=y;
            if (nxt[x]!=n+1) pre[nxt[x]]=pre[x];
            if (pre[x]!=0) nxt[pre[x]]=nxt[x];
            if (Pre!=0) nxt[Pre]=x;
            if (Nxt!=n+1) pre[Nxt]=x;
            pre[x]=Pre;nxt[x]=Nxt;
        }
        else printf("%lld\n",query(1,1,n,x,y));
    }
}

做法二

代码被我瞎卡一波常数之后变得巨丑无比。

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define rep(i,x,y) for (R int i=x;i<=y;++i)
    #define sz 101001 
    typedef long long ll;
    template<typename T>
    inline void read(T& t)
    {
        t=0;char f=0,ch=getchar();
        double d=0.1;
        while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
        while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
        if(ch=='.')
        {
            ch=getchar();
            while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
        }
        t=(f?-t:t);
    }
    template<typename T,typename... Args>
    inline void read(T& t,Args&... args){read(t); read(args...);}
    void file()
    {
        #ifndef ONLINE_JUDGE
        freopen("a.txt","r",stdin);
        #endif
    }
//    inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;

int n,m;
int a[sz];
int pre[sz],nxt[sz];
int w[2][sz]; // 0:pre 1:nxt
set<int>s[sz];

ll S1;
ll sum[2][sz];
#define I inline
#define R register
I void Add(R int x,R ll v,R int t){S1+=v*t;while (x<=n+2) sum[t][x]+=v,x+=(x&(-x));}
I ll Query(R int x,R int t){ll ret=0;while (x) ret+=sum[t][x],x-=(x&(-x));return ret;}

ll ans[sz];
int blo;
int pos[sz];
void init(){blo=pow(n,2.0/3);rep(i,1,sz-1) pos[i]=i/blo;}
struct hh
{
    int l,r,tim,id;
    I const bool operator < (const hh &a) const
    {
        if (pos[l]!=pos[a.l]) return pos[l]<pos[a.l];
        if (pos[r]!=pos[a.r]) return pos[r]<pos[a.r];
        return tim<a.tim;
    }
}q[sz];

struct hhh
{
    int pos,u,t; // t=0:pre t=1:nxt w[t][pos]->u
    inline hhh(int Pos=0,int U=0,int T=0){pos=Pos,u=U,t=T;}
}p[sz*6];

I void swap(int &x,int &y){int t=x;x=y,y=t;}
#define add(x) Add(w[0][x]+1,x,0);Add(w[1][x]+1,x,1);
I void del(R int x){Add(w[0][x]+1,-x,0);Add(w[1][x]+1,-x,1);}
I void work(R hhh &a,R int l,R int r)
{
    R int pos=a.pos,t=a.t,&W=w[t][pos];
    if (l<=pos&&pos<=r) Add(W+1,-pos,t);
    R int tt=a.u;a.u=W;W=tt;
    if (l<=pos&&pos<=r) Add(W+1,pos,t);
}

I int calcPre(R int x,R int col){set<int>::iterator it=s[col].lower_bound(x);--it;return *it;}
I int calcNxt(R int x,R int col){return *(s[col].upper_bound(x));}

signed main()
{
    srand(time(0));rep(i,1,233) srand(rand());
    file();
    R int x,y,z;
    read(n,m);
    init();
    rep(i,1,n) s[i].insert(0),s[i].insert(n+1);
    rep(i,1,n) read(a[i]),s[a[i]].insert(i);
    rep(i,1,n) w[0][i]=pre[i]=calcPre(i,a[i]),w[1][i]=nxt[i]=calcNxt(i,a[i]);
    R int tim=0,c=0;
    rep(_,1,m)
    {
        read(z,x,y);
        if (z==1)
        {
            if (y==a[x]) continue;
            int Pre=calcPre(x,y),Nxt=calcNxt(x,y);
            s[a[x]].erase(x);s[y].insert(x);
            a[x]=y;
            if (nxt[x]!=n+1) p[++tim]=hhh(nxt[x],pre[x],0),pre[nxt[x]]=pre[x];
            if (pre[x]!=0) p[++tim]=hhh(pre[x],nxt[x],1),nxt[pre[x]]=nxt[x];
            if (Pre!=0) p[++tim]=hhh(Pre,x,1),nxt[Pre]=x;
            if (Nxt!=n+1) p[++tim]=hhh(Nxt,x,0),pre[Nxt]=x;
            pre[x]=Pre;nxt[x]=Nxt;
            p[++tim]=hhh(x,Pre,0);p[++tim]=hhh(x,Nxt,1);
        }
        else ++c,q[c]=(hh){x,y,tim,c};
    }
    sort(q+1,q+c+1);
    R int l=1,r=0;tim=0;
    rep(i,1,c)
    {
        R int L=q[i].l,RR=q[i].r,Tim=q[i].tim;
        while (tim<Tim) work(p[++tim],l,r);
        while (tim>Tim) work(p[tim--],l,r);
        while (l<L) {Add(w[0][l]+1,-l,0);Add(w[1][l]+1,-l,1);++l;}
        while (l>L) {--l;Add(w[0][l]+1,l,0);Add(w[1][l]+1,l,1);}
        while (r<RR) {++r;Add(w[0][r]+1,r,0);Add(w[1][r]+1,r,1);}
        while (r>RR) {Add(w[0][r]+1,-r,0);Add(w[1][r]+1,-r,1);--r;}
        ans[q[i].id]=S1-Query(RR+1,1)-Query(L-1+1,0);
    }
    rep(i,1,c) printf("%lld\n",ans[i]);    
}

做法三

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define pii pair<int,int>
    #define fir first
    #define sec second
    #define MP make_pair
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
    #define drep(i,x,y) for (int i=(x);i>=(y);i--)
    #define go(x) for (int i=head[x];i;i=edge[i].nxt)
    #define sz 101001 
    typedef long long ll;
    template<typename T>
    inline void read(T& t)
    {
        t=0;char f=0,ch=getchar();
        double d=0.1;
        while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
        while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
        if(ch=='.')
        {
            ch=getchar();
            while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
        }
        t=(f?-t:t);
    }
    template<typename T,typename... Args>
    inline void read(T& t,Args&... args){read(t); read(args...);}
    void file()
    {
        #ifndef ONLINE_JUDGE
        freopen("a.txt","r",stdin);
        #endif
    }
//    inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;

int n,m;
int a[sz];
int pre[sz],nxt[sz];
int w[sz]; 
set<int>s[sz];

ll sum[sz];
//void add(int x,ll v){if (!x) return;while (x<=n) sum[x]+=v,x+=(x&(-x));}
//ll query(int x){ll ret=0;while (x) ret+=sum[x],x-=(x&(-x));return ret;}
void add(int x,ll v){sum[x]+=v;}
ll query(int x){ll ret=0;rep(i,1,x) ret+=sum[i];return ret;}

ll ans[sz];
int blo;
int pos[sz];
void init(){blo=pow(n,2.0/3);rep(i,1,sz-1) pos[i]=i/blo;}
struct hh
{
    int l,r,tim,id;
    const bool operator < (const hh &a) const
    {
        if (pos[l]!=pos[a.l]) return pos[l]<pos[a.l];
        if (pos[r]!=pos[a.r]) return pos[r]<pos[a.r];
        return tim<a.tim;
    }
}q[sz];

struct hhh
{
    int pos,v; // pre[pos] -> v
    hhh(int Pos=0,int V=0){pos=Pos,v=V;}
}p[sz*6];

void add(int x){add(w[x],x-w[x]);}
void del(int x){add(w[x],w[x]-x);}
void work(hhh &a,int l,int r)
{
    if (l<=a.pos&&a.pos<=r) add(w[a.pos],w[a.pos]-a.pos);
    swap(a.v,w[a.pos]);
    if (l<=a.pos&&a.pos<=r) add(w[a.pos],a.pos-w[a.pos]);
}

int calcPre(int x,int col){set<int>::iterator it=s[col].lower_bound(x);--it;return *it;}
int calcNxt(int x,int col){return *(s[col].upper_bound(x));}


int main()
{
    file();
    int x,y,z;
    read(n,m);
    init();
    rep(i,1,n) s[i].insert(0),s[i].insert(n+1);
    rep(i,1,n) read(a[i]),s[a[i]].insert(i);
    int tim=0,c=0;
    rep(i,1,n) w[i]=pre[i]=calcPre(i,a[i]),nxt[i]=calcNxt(i,a[i]);
    while (m--)
    {
        read(z,x,y);
        if (z==1)
        {
            if (y==a[x]) continue;
            int Pre=calcPre(x,y),Nxt=calcNxt(x,y);
            s[a[x]].erase(x);s[y].insert(x);
            a[x]=y;
            if (nxt[x]!=n+1)
                pre[nxt[x]]=pre[x],
                p[++tim]=hhh(nxt[x],pre[nxt[x]]);
            if (pre[x]!=0) nxt[pre[x]]=nxt[x];
            if (Pre!=0) nxt[Pre]=x;
            if (Nxt!=n+1)
                pre[Nxt]=x,
                p[++tim]=hhh(Nxt,pre[Nxt]);
            pre[x]=Pre;nxt[x]=Nxt;
            p[++tim]=hhh(x,pre[x]);
        }
        else ++c,q[c]=(hh){x,y,tim,c};
    }
    sort(q+1,q+c+1);
    int l=1,r=0;tim=0;
    rep(i,1,c)
    {
        int L=q[i].l,R=q[i].r,Tim=q[i].tim;
        while (tim<Tim) work(p[++tim],l,r);
        while (tim>Tim) work(p[tim--],l,r);
        while (l<L) del(l++);
        while (l>L) add(--l);
        while (r<R) add(++r);
        while (r>R) del(r--);
        ans[q[i].id]=query(n)-query(L-1);
    }
    rep(i,1,c) printf("%lld\n",ans[i]);
}

做法四

正解比暴力好写多了呢……

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define pii pair<int,int>
    #define fir first
    #define sec second
    #define MP make_pair
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
    #define drep(i,x,y) for (int i=(x);i>=(y);i--)
    #define go(x) for (int i=head[x];i;i=edge[i].nxt)
    #define sz 101010
    typedef long long ll;
    template<typename T>
    inline void read(T& t)
    {
        t=0;char f=0,ch=getchar();
        double d=0.1;
        while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
        while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
        if(ch=='.')
        {
            ch=getchar();
            while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
        }
        t=(f?-t:t);
    }
    template<typename T,typename... Args>
    inline void read(T& t,Args&... args){read(t); read(args...);}
    void file()
    {
        #ifndef ONLINE_JUDGE
        freopen("a.txt","r",stdin);
        #endif
    }
//    inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;

int n,m,Q;
int a[sz];
int pre[sz],nxt[sz];
set<int>s[sz];

int calcPre(int x,int col){set<int>::iterator it=s[col].lower_bound(x);--it;return *it;}
int calcNxt(int x,int col){return *(s[col].upper_bound(x));}

ll ans[sz];
struct hh
{
    int type; // 0:modify 1:query
    int x,y,val;
    int id;
}q[sz*6];
inline bool cmp(const hh &x,const hh &y)
{
    if (x.type!=y.type) return x.type<y.type;
    if (x.type) return x.y<y.y;
    return x.x<y.x;
}
inline void calc(int x,int v) // pre[x]->v
{
    q[++m]=(hh){0,x,pre[x],pre[x]-x,0};
    pre[x]=v;
    q[++m]=(hh){0,x,v,x-v,0};
}

ll sum[sz];
void add(int x,ll v){ if (!x) return; while (x<=n) sum[x]+=v,x+=(x&(-x)); }
ll query(int x){ ll ret=0; while (x) ret+=sum[x],x-=(x&(-x)); return ret; }

void solve(int l,int r)
{
    if (l==r) return;
    int mid=(l+r)>>1;
    solve(l,mid);solve(mid+1,r);
    int p=l-1;
    rep(i,mid+1,r) if (q[i].type)
    {
        while (p<mid&&(q[p+1].type||q[p+1].x<=q[i].y))
        {
            ++p;
            if (!q[p].type) add(q[p].y,q[p].val);
        }
        ans[q[i].id]+=query(n)-query(q[i].x-1);
    }
    rep(i,l,p) if (!q[i].type) add(q[i].y,-q[i].val);
    sort(q+l,q+r+1,cmp);
}

int main()
{
    file();
    int x,y,z;
    read(n,Q);
    rep(i,1,n) s[i].insert(0),s[i].insert(n+1);
    rep(i,1,n) read(a[i]),s[a[i]].insert(i);
    rep(i,1,n) pre[i]=calcPre(i,a[i]),nxt[i]=calcNxt(i,a[i]),q[++m]=(hh){0,i,pre[i],i-pre[i],0};
    int c=0;
    while (Q--)
    {
        read(z,x,y);
        if (z==1)
        {
            if (y==a[x]) continue;
            int Pre=calcPre(x,y),Nxt=calcNxt(x,y);
            s[a[x]].erase(x);s[y].insert(x);
            a[x]=y;
            if (nxt[x]!=n+1) calc(nxt[x],pre[x]);
            if (pre[x]!=0) nxt[pre[x]]=nxt[x];
            if (Pre!=0) nxt[Pre]=x;
            if (Nxt!=n+1) calc(Nxt,x);
            calc(x,Pre);
            nxt[x]=Nxt;
        }
        else ++c,q[++m]=(hh){1,x,y,0,c};
    }
    solve(1,m);
    rep(i,1,c) printf("%lld\n",ans[i]);
    return 0;
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
Appscan的下载安装
1、下载Appscan:http://download2.boulder.ibm.com...2AppScan\_Setup.exe(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fdownload2.boulder.ibm.com%2Fsar%2FCMA%2FRAA%2F00jq2
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
3年前
Jenkins+Ansible+Gitlab自动化部署三剑客
JenkinsAnsibleGitlab自动化部署三剑客小中大showerlee2016031113:00Ansible(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.
Stella981 Stella981
3年前
Python 环境搭建
pythonbug集目录\toc\00python模块下载地址pyhton模块下载地址(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.lfd.uci.edu%2F%7Egohlke%2Fpythonlibs%2F)01pythonpip
Easter79 Easter79
3年前
Swift项目兼容Objective
!456.jpg(http://static.oschina.net/uploads/img/201509/13172704_1KcG.jpg"1433497731426906.jpg")本文是投稿文章,作者:一叶(博客(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2F00red
Easter79 Easter79
3年前
The Complete Guide To Rooting Any Android Phone
PhoneWhitsonGordon(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.lifehacker.com.au%2Fauthor%2Fwhitsongordon%2F)7April,20118:00AMShare(https://ww
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo