Codeforces 848C Goodbye Souvenir [CDQ分治,二维数点]
这题我写了四种做法……
思路
不管做法怎样,思路都是一样的。
好吧,其实不一样,有细微的差别。
第一种
考虑位置\(x\)对区间\([l,r]\)有\(\pm x\)的贡献当且仅当\(pre_x\!\!<\!l \;or\;nxt_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;
}
Codeforces 848C Goodbye Souvenir [CDQ分治,二维数点]的更多相关文章
- Codeforces 848C Goodbye Souvenir(CDQ 分治)
题面传送门 考虑记录每个点的前驱 \(pre_x\),显然答案为 \(\sum\limits_{i=l}^{r} i-pre_i (pre_i \geq l)\) 我们建立一个平面直角坐标系,\(x\ ...
- [Codeforces]848C - Goodbye Souvenir
题目大意:n个数字,m次操作,支持修改一个数字和查询一个区间内每种数字最大出现位置减最小出现位置的和.(n,m<=100,000) 做法:把每个数字表示成二维平面上的点,第一维是在数组中的位置, ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- CF848C:Goodbye Souvenir(CDQ分治)
Description 给定长度为$n$的数组, 定义数字$X$在$[l,r]$内的值为数字$X$在$[l,r]$内最后一次出现位置的下标减去第一次出现位置的下标给定$m$次询问, 每次询问有三个整数 ...
- 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治
LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...
- 【CodeForces】983 E. NN country 树上倍增+二维数点
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...
- 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼
离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)
题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...
随机推荐
- 微信小程序开发(6) SSL证书及HTTPS服务器
1. 域名 在万网购买,略 2. 云服务器 阿里云购买,略 3. 安装lnmp 使用lnmp.org程序,略 4. 申请证书 阿里云-管理控制台-安全(云盾)-证书服务-购买证书证书类型: 免费型DV ...
- luogu 1268 树的重量
打眼一看就是最小生成树嘛,但经过板子wa掉的经历后得知,,emmmm,原来是, 构造! (虽然不知是什么但觉得听起来很厉害的样子...手动微笑) n=2的情况 自然就是g(1,2) n=3的情况,由于 ...
- mybatis 动态sql 插入报错
1. 值为null必须制定jdbcType 单条执行的话,可以考虑把值为null的字段去掉 2. 值的类型无法解析 比如oracle.sql.TIMESTAMP类型,需转为java.sql.TIMES ...
- 安装LDAP用户认证
LDAP伺服器设定 1.安装 openldap-servers yum -y install openldap openldap-devel openldap-servers 2.建立 LDAP 密码 ...
- sap部署
SAP部署 连接sap系统需要通过sap javaconnect来连接,对于sapjco.jar系列文件有32位与64位之分.即对jdk有严格要求.现说明客户端部署及服务端部署两种情况: 一. 部署客 ...
- sql server 2008 windows验证改混合登陆中SqlServer身份验证用户名密码
安装过程中,SQL Server 数据库引擎设置为 Windows 身份验证模式或 SQL Server 和 Windows 身份验证模式.本主题介绍如何在安装后更改安全模式. 如果在安装过程中选择“ ...
- 目标检测:YOLO(v1 to v3)——学习笔记
前段时间看了YOLO的论文,打算用YOLO模型做一个迁移学习,看看能不能用于项目中去.但在实践过程中感觉到对于YOLO的一些细节和技巧还是没有很好的理解,现学习其他人的博客总结(所有参考连接都附于最后 ...
- ASP.NET MVC - NPOI读取Excel
引入: using System; using System.Data; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserM ...
- 20165221—JAVA第六周学习心得
课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...
- GridView item设置点击背景
GridView item设置点击背景 android:listSelector="@android:color/transparent"