小翔题库
题单 & 题解
std如下:
自己出的/抄的题。没有质量,没有难度。
std
- 皮蛋
#include<bits/stdc++.h>
typedef long long LL;
const int N=1e6+5;
int n,l,tot;LL ans;
struct node{ int x,p; } G[N];
inline bool operator < (node a,node b){ return a.x<b.x; }
signed main(){
scanf("%d%d",&n,&l);
for (int i=1;i<=n;++i) scanf("%d%d",&G[i].p,&G[i].x);
std::sort(G+1,G+1+n);
for (int i=1;i<=n;++i) G[i].p?++tot:ans+=tot;
printf("%lld",ans);
return 0;
}
- 毛笋
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,k,f[N],ans;
struct node{ int x,y; } G[N];int idx;
inline bool operator < (node a,node b){ return a.x==b.x?a.y<b.y:a.x<b.x; }
signed main(){
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=k;++i){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
if (c>a+b-2) G[++idx]=(node){a,b};
}
std::sort(G+1,G+1+idx);
memset(f,0x3f,sizeof(f)),f[0]=0;
for (int i=1;i<=idx;++i){
int now=upper_bound(f,f+2+ans,G[i].y)-f-1;
ans=max(ans,now+1),f[now+1]=min(f[now+1],G[i].y);
}
printf("%d\n%d",n+m-2,ans);
return 0;
}
- 蒜头
#include<cstdio>
#include<cstring>
using namespace std;
const int N=501,M=51,P=290;
int n,m,k,p;
int A[N],B[N],F[N][M][P],ans=-1;
inline void tomax(int& x,const int y){
if (x<y) x=y;
}
signed main(){
scanf("%d%d%d%d",&n,&m,&k,&p);
memset(F,-1,sizeof(F));
for (int i=1;i<=n;++i) scanf("%d",&A[i]);
for (int i=1;i<=n;++i) scanf("%d",&B[i]);
F[1][m][A[1]]=k;
if (m) F[1][m-1][(A[1]>>1)*(A[1]>>1)%p]=k;
if (k) tomax(F[1][m][B[1]],k-1);
for (int i=1;i<n;++i){
for (int j=0;j<=m;++j){
for (int h=0;h<p;++h){
tomax(F[i+1][j][h*A[i+1]%p],F[i][j][h]);
if (j) tomax(F[i+1][j-1][h*(A[i+1]>>1)*(A[i+1]>>1)%p],F[i][j][h]);
if (F[i][j][h]) tomax(F[i+1][j][h*B[i+1]%p],F[i][j][h]-1);
}
}
}
for (int i=0;i<=m;++i){
for (int j=0;j<p;++j){
if (~F[n][i][j]) tomax(ans,j);
}
}
printf("%d",ans);
return 0;
}
- 藤瓜
#include<bits/stdc++.h>
const int N=1e6+5;
int n,m,k,b[N],a[N],sum,T[N],tot,l1[N],r1[N],l2[N],r2[N],ans,ansk;
inline void I(int x,int y){ ++x;for(;x<=k;x+=x&-x) T[x]+=y; }
inline int Q(int x){ ++x;int res=0;for(;x;x-=x&-x) res+=T[x];return res; }
bool tag=1;
signed main(){
//freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=m;++i) scanf("%d",&b[i]);
for (int i=1;i<=n;++i) l1[i]=l2[i]=-1;
for (int i=1,j=1;i<=n;++i){
scanf("%d",&a[i]);
if (j<=m&&b[j]==i){
if (a[i]<k){
if (a[i]==0) l1[i]=l2[i]=-1;
else if (a[i]+sum<k||sum==k-1){
l1[i]=(sum+1)%k,r1[i]=(sum+a[i])%k;
}else{
l1[i]=sum+1,r1[i]=k-1;
l2[i]=0,r2[i]=(sum+a[i])%k;
}
if (~l1[i]) I(l1[i],1),I(r1[i]+1,-1);
if (~l2[i]) I(l2[i],1),I(r2[i]+1,-1);
}else ++tot;
++j;
}
sum=(sum+a[i])%k;
}
ans=tot+Q(0),ansk=-1;
for (int i=1,j=1;i<=n;++i){
if (j>m) break;
if (b[j]==i){
if (a[i]>=k) --tot;
if (~l1[i]) I(l1[i],-1),I(r1[i]+1,1);
if (~l2[i]) I(l2[i],-1),I(r2[i]+1,1);
++j;
}
int res=Q(a[i]%k)+tot;
if (res>ans) ans=res,ansk=i-1;
if (b[j-1]==i&&(a[i]>=k||l1[i]==0||l2[i]==0)) ++tot;
}
if (!tag) return printf("%d",ans),0;
if (~ansk) printf("%d\nyes\n%d",ans,ansk);
else printf("%d\nno",ans);
return 0;
}
- 蒜头2
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int MOD=998244353,M=32001;
int p[M],vis[M],g[M],k[M],idx,m,ans,n;
struct node{
int a[2][2];
#define a(p,i,j) p.a[i][j]
} fi,non;
inline node operator * (node x,node y){
node z;
a(z,0,0)=a(z,0,1)=a(z,1,0)=a(z,1,1)=0;
for (int k=0;k<2;++k){
for (int i=0;i<2;++i){
for (int j=0;j<2;++j){
a(z,i,j)=(a(z,i,j)+(LL)a(x,i,k)*a(y,k,j)%MOD)%MOD;
}
}
}
return z;
}
inline int fib(int b){
if (b<0) return 0;
if (b==0) return 1;
if (b==1) return 1;
b-=2;
node s=non,x=non;
while (b){
if (b&1) s=s*x;
x=x*x,b>>=1;
}
return a((s*fi),0,0);
}
inline int ny(int x){
int b=MOD-2,s=1;
while (b){
if (b&1) s=(LL)s*x%MOD;
x=(LL)x*x%MOD,b>>=1;
}return s;
}
inline void INIT(){
a(non,0,0)=a(non,1,0)=a(non,0,1)=1;
a(non,1,1)=0;
a(fi,0,0)=1,a(fi,1,0)=1;
a(fi,0,1)=a(fi,1,1)=0;
for (int i=2;i<M;++i){
if (!vis[i]) p[++m]=i;
for (int j=1;p[j]*i<M;++j){
vis[p[j]*i]=1;
if (i%p[j]==0) break;
}
}
}
int res,sum;
inline int F(int x){
return (fib(x)+fib(x-2))%MOD;
}
void Dfs2(int tot,int cur,int mu){
if (!mu) return;
if (cur>idx){
//cout<<"Dfs2:: "<<tot<<" "<<mu*F(sum/tot)<<endl;
res=(res+(LL)mu*F(sum/tot)%MOD)%MOD;
return;
}
Dfs2(tot,cur+1,mu);
if (k[cur]>0) Dfs2(tot*g[cur],cur+1,-mu);
}
void Dfs1(int tot,int cur){
if (cur>idx){
res=0,sum=tot,Dfs2(1,1,1);
//cout<<"DFS1::: "<<tot<<" "<<res<<endl;
ans=(ans+(LL)res*ny(tot)%MOD)%MOD;
return;
}
for (int i=0,j=1;i<=k[cur];++i,j*=g[cur]){
int now=k[cur];
k[cur]=i;
Dfs1(tot*j,cur+1);
k[cur]=now;
}
}
signed main(){
//freopen("head9.in","r",stdin);
//freopen("head9.out","w",stdout);
INIT();
int T;cin>>T;
for (int test=1;test<=T;++test){
int nn;cin>>n;nn=n;idx=0,ans=0;
for (int i=1;p[i]*p[i]<=nn;++i){
if (nn%p[i]==0){
g[++idx]=p[i],k[idx]=0;
while (nn%p[i]==0) nn/=p[i],++k[idx];
}
}
if (nn>1) g[++idx]=nn,k[idx]=1;
Dfs1(1,1);
cout<<(ans+MOD)%MOD<<endl;
}
return 0;
}/*
4
2
3
4
667
*/
- 扑克
#include<bits/stdc++.h>
#define gc getchar
#define pc putchar
#define F(i,x,y) for(int i=x;i<=y;++i)
#define R(i,x,y) for(int i=x;i>=y;--i)
inline int read(){
int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
inline void print(int x){ if (x>9) print(x/10);pc('0'+x%10); }
const int N=2e5+5;
int n,m,A[N],rt,tot;
struct Splay{
int son[2],fa,sz,sum,rev,val,cnt;
#define son(i,j) G[i].son[j]
#define fa(i) G[i].fa
#define sz(i) G[i].sz
#define sum(i) G[i].sum
#define rev(i) G[i].rev
#define val(i) G[i].val
#define cnt(i) G[i].cnt
} G[N<<2];
inline void swap(int& x,int& y){
int z=x;x=y;y=z;
}
inline void maintain(int k){
if (!k) return;
sz(k)=sz(son(k,0))+sz(son(k,1))+cnt(k);
sum(k)=sum(son(k,0))^sum(son(k,1))^((cnt(k)&1)?val(k):0);
}
inline void letrev(int k){
if (!k) return;
rev(k)^=1,swap(son(k,0),son(k,1));
}
inline void pushdown(int k){
if (!rev(k)||!k) return;
letrev(son(k,0)),letrev(son(k,1));
rev(k)=0;
}
void _put(int cur){
if (!cur) return;
pushdown(cur);
_put(son(cur,0));
printf("rt=%d, id=%d, fa=%d, sz=%d, sum=%d, rev=%d, val=%d, cnt=%d, ls=%d, rs=%d\n"
,rt,cur,fa(cur),sz(cur),sum(cur),rev(cur),val(cur),cnt(cur),son(cur,0),son(cur,1));
//F(i,1,cnt(cur)) printf("%d ",val(cur));
_put(son(cur,1));
}
void OUTPUT(){
printf("OUT::: \n"),_put(rt),pc('\n');
}
inline int addnod(int c,int v){
cnt(++tot)=c,val(tot)=v;
return maintain(tot),tot;
}
inline bool get(int k){ return k==son(fa(k),1); }
inline void rotate(int k){
int x=fa(k),y=fa(x),p=get(k);
son(x,p)=son(k,p^1);if (son(x,p)) fa(son(x,p))=x;
son(k,p^1)=x;fa(x)=k;
if (y) son(y,x==son(y,1))=k;else rt=k;fa(k)=y;
maintain(x),maintain(k);
}
inline void splay(int k,int pos){
if (!k) return;
for (int i=fa(k);(i=fa(k))!=pos;rotate(k)){
if (fa(i)!=pos) rotate(get(k)==get(i)?i:k);
}
}
int remaink;
inline int findk(int k){
if (k<1||k>sz(rt)) return (remaink=0),0;
int cur=rt;
while (cur){
pushdown(cur);
if (k<=sz(son(cur,0))) cur=son(cur,0);
else if (k<=sz(son(cur,0))+cnt(cur)) return (remaink=k-sz(son(cur,0))),cur;
else k-=sz(son(cur,0))+cnt(cur),cur=son(cur,1);
}
return 0;
}
inline int split(int k,int pos){
if (!k||pos==cnt(k)) return 0;
if (pos>cnt(k)||pos<0) printf("k = %d, pos = %d, cnt(k) = %d\n",k,pos,cnt(k)),exit(0);
if (pos==0) return k;
int cur=addnod(cnt(k)-pos,val(k));
cnt(k)=pos,son(cur,1)=son(k,1),son(k,1)=cur;
fa(cur)=k;if (son(cur,1)) fa(son(cur,1))=cur;
maintain(cur),maintain(k);
return cur;
}
inline void Insert(int pos,int c,int v){
int x=findk(pos),cur=addnod(c,v);
splay(x,0);
int y=findk(pos+1);
if (x==y) y=split(x,remaink-1);
if (y){
//printf("BEFORE, x=%d, y=%d\n",x,y);OUTPUT();
splay(y,x);//puts("SPLAyed");OUTPUT();
son(y,0)=cur,fa(cur)=y;
maintain(y),maintain(x);
}else{
son(x,1)=cur,fa(cur)=x;
maintain(x);
}
}
inline void Reverse(int le,int ri){
if (le==ri) return;
if (le==1&&ri==sz(rt)) return letrev(rt);
int x=findk(le-1);
split(x,remaink);
splay(x,0);
int y=findk(ri+1);
y=split(y,remaink-1);
if (y){
splay(y,x);
letrev(son(y,0));
}else{
letrev(son(x,1));
}
}
inline int mostle(int k){
if (!k) return 0;
while ((pushdown(k),son(k,0))) k=son(k,0);
return k;
}
inline int mostri(int k){
if (!k) return 0;
while ((pushdown(k),son(k,1))) k=son(k,1);
return k;
}
inline void letrot(int cur){
//printf("cur=%d\n",cur);
int l=mostle(cur),r=mostri(cur);
if (cnt(r)>1){
r=split(r,cnt(r)-1);
int fr=fa(r);
if (fr) son(fr,r==son(fr,1))=0;
son(l,0)=r,fa(r)=l;
return maintain(fr),maintain(r),maintain(l),splay(l,0),splay(fr,0);
}else{
int fr=fa(r);//printf("r=%d, son=%d\n",r,son(r,0));
if (son(r,0)) fa(son(r,0))=fr;
if (fr) son(fr,r==son(fr,1))=son(r,0);
son(r,0)=0,son(l,0)=r,fa(r)=l;
return maintain(fr),maintain(r),maintain(l),splay(l,0),splay(fr,0);
}
}
inline void Rotate(int le,int ri){
if (le==ri) return;
if (le==1&&ri==sz(rt)){
return letrot(rt);
}
int x=findk(le-1);
split(x,remaink);
splay(x,0);
int y=findk(ri+1);
y=split(y,remaink-1);
if (y){
splay(y,x);
letrot(son(y,0));
}else{
letrot(son(x,1));
}
}
inline int Sum(int le,int ri){
if (le==1&&ri==sz(rt)) return sum(rt);
int x=findk(le-1);
split(x,remaink);
splay(x,0);
int y=findk(ri+1);
y=split(y,remaink-1);
if (y){
splay(y,x);
return sum(son(y,0));
}else{
return sum(son(x,1));
}
}
int Build(int l,int r){
if (l>r) return 0;
if (l==r) return addnod(1,A[l]);
int mid=l+r>>1,cur=addnod(1,A[mid]);
son(cur,0)=Build(l,mid-1);
son(cur,1)=Build(mid+1,r);
if (son(cur,0)) fa(son(cur,0))=cur;
if (son(cur,1)) fa(son(cur,1))=cur;
maintain(cur);
return cur;
}
signed main(){
//freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
n=read(),m=read();
F(i,1,n) A[i]=read();
rt=Build(1,n);
//OUTPUT();
F(i,1,m){
int op=read(),x=read(),y=read();
if (op==1){
int z=read();
Insert(x,y,z);
}else if (op==2){
Reverse(x,y);
}else if (op==3){
Rotate(x,y);
}else if (op==4){
print(Sum(x,y)),pc('\n');
}
//OUTPUT();
}
return 0;
}
- 阿克
#include<bits/stdc++.h>
const int N=2e5+5;
typedef long long LL;
struct Edge{ int val,pos; };
std::vector<Edge> G[N];
int n,k;LL maxn,mid,p,res[N];bool con[N];
#define abs(x) (x>0?x:-(x))
void Dfs(int cur,int fa,int fv){
for (int i=0;i<(int)G[cur].size();++i){
int to=G[cur][i].pos,v=G[cur][i].val;
if (to==fa) continue;
Dfs(to,cur,v);
if (abs(res[to])>abs(res[cur])||(abs(res[to])==abs(res[cur])&&res[to]<0)) res[cur]=res[to];
}
if (res[cur]>0) con[cur]=0;else if (res[cur]<0) con[cur]=1;
if (con[cur]&&res[cur]+fv>0) res[cur]=0;
else if (res[cur]+fv>mid){
++p;
if (-mid+fv>0) res[cur]=0;
else res[cur]=-mid+fv,con[fa]=(res[cur]==0);
}else res[cur]+=fv,con[fa]=(res[cur]==0);
}
inline bool check(){
for (int i=1;i<=n;++i) con[i]=0,res[i]=0;
p=0;Dfs(1,0,0);
if (!con[1]||res[1]>0) ++p;
return p<=k;
}
signed main(){
//freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
scanf("%d%d",&n,&k);
if (k==n) return putchar('0'),0;
for (int i=1;i<n;++i){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
G[a].push_back((Edge){c,b}),G[b].push_back((Edge){c,a});
maxn+=c;
}
LL le=1,ri=maxn;
while (le<ri){
mid=(le+ri)>>1;
if (check()) ri=mid;
else le=mid+1;
}
printf("%lld",le);
return 0;
}
- 排队
//O(nlogn) Solution
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0)
const int N=1e7+3,INF=1e9+7;
struct node{
int val,tag;
} G[N];
inline bool operator < (node a,node b){
return a.val<b.val;
}
int A[N],ans[N],idx=1,n;
signed main(){
IOS;//freopen("game5.in","r",stdin);freopen("game5.out","w",stdout);
std::cin>>n;
for (int i=1;i<=n;++i){
std::cin>>A[i];
G[i]=(node){A[i],i};
}
std::sort(G+1,G+1+n);
for (int i=1;i<=n;++i){
while (idx<=n&&G[idx].val<A[i]){
if (G[idx].tag>i) ans[G[idx].tag]=i;
else ans[G[idx].tag]=-1;
++idx;
}
}
for (int i=idx;i<=n;++i) ans[G[i].tag]=-1;
for (int i=1;i<=n;++i) std::cout<<ans[i]<<' ';
return 0;
}/*
10
2 1 4 7 4 8 3 6 4 7
*/
- 平衡树性能测试(随机数据)
//BIT
#include<bits/stdc++.h>
#define gc getchar
#define pc putchar
inline int read(){
int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
inline void print(int x){ if (x<0) x=-x,pc('-');if (x>9) print(x/10);pc('0'+x%10); }
const int N=1e6+5;
int v[N],qt[N],qx[N],T[N],maxn;
bool vis[N];
struct node{
int val,tag;
} G[N];
inline void I(int x,int y){ for(;x<=maxn;x+=x&-x) T[x]+=y; }
inline int Q(int x){ int res=0;for(;x;x-=x&-x) res+=T[x];return res; }
inline bool operator < (node a,node b){ return a.val<b.val; }
inline int Findk(int k){
if (!k) return 0;
int res=0;
for (int i=19;~i;--i){
if (res+(1<<i)>maxn) continue;
if (T[res+(1<<i)]<k) res+=(1<<i),k-=T[res];
}
return res+1;
}
inline void Insert(int x){
if (vis[x]) return;
I(x,1),vis[x]=1;
}
inline int Pre(int x){
return v[Findk(Q(x-1))];
}
signed main(){
int m=read();v[0]=-1;
for (int i=1;i<=m;++i){
qt[i]=read(),qx[i]=read();
G[i].val=qx[i],G[i].tag=i;
}
std::sort(G+1,G+1+m);
int pre=1<<29;
for (int i=1;i<=m;++i){
if (pre!=G[i].val) pre=G[i].val,v[++maxn]=G[i].val;
qx[G[i].tag]=maxn;
}
for (int i=1;i<=m;++i){
if (!qt[i]) Insert(qx[i]);
else print(Pre(qx[i])),pc('\n');
}
return 0;
}
- 平衡树测试(构造数据)
同上。
- 链表
云剪贴板
- 线性筛
#include<bits/stdc++.h>
namespace LEON{
#define gc getchar
#define pc putchar
#define F(x,y,z) for(int x=y;x<=z;++x)
inline int read(){
int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
void put(int x){ if (x) put(x/10),pc('0'+x%10); }
inline void print(int x){ if (!x) pc('0');else put(x);pc('\n'); }
} using namespace LEON;
int f[1000001][3],p[78499];
signed main(){
int T=read()-1,n=read(),idx=0;
f[1][2]=1;F(i,2,n){
if (!f[i][2]) f[i][0]=1,f[i][1]=1,f[i][2]=i-1,p[++idx]=i;
for (int j=1;p[j]*i<=n;++j){
f[p[j]*i][0]=f[i][0]+1;
if (i%p[j]==0){
f[p[j]*i][1]=f[i][1],f[p[j]*i][2]=f[i][2]*p[j];
break;
}
f[p[j]*i][1]=f[i][1]+1,f[p[j]*i][2]=f[i][2]*(p[j]-1);
}
}
F(i,1,n) print(f[i][T]);
return 0;
}
- AK
#include<cstdio>
#define LL long long
using namespace std;
const int N=1e3+5,MOD=998244353;
const LL INF=1e18;
int A[N][N],nf,f[N*N];
LL F[N][N][3];//0fromup 1fromleft 2fromright
int n,m,K;
inline LL max(LL a,LL b,LL c)
{
if (a<b) a=b;
if (a<c) a=c;
return a;
}
inline int read()
{
int num=0,p=1;char ch=getchar();
while (ch>'9'||ch<'0')
{
if (ch=='-') p=-1;
ch=getchar();
}
while (ch<='9'&&ch>='0') num=(num<<1)+(num<<3)+(ch^48),ch=getchar();
return p*num;
}
inline int pow(int a,int b)
{
int s=1;
while (b)
{
if (b&1) s=(LL)s*a%MOD;
a=(LL)a*a%MOD;
b>>=1;
}
return s;
}
int main()
{
n=read(),m=read(),K=read();
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
A[i][j]=read();
for (int i=0;i<=n+1;++i)
for (int j=0;j<=m+1;++j)
F[i][j][0]=F[i][j][1]=F[i][j][2]=-INF;
F[1][1][0]=0;
for (int i=1;i<=n;++i)
{
if (i!=1)
for (int j=1;j<=m;++j)
F[i][j][0]=max(F[i-1][j][0],F[i-1][j][1],F[i-1][j][2])+A[i][j];
for (int j=2;j<=m;++j)
F[i][j][1]=max(F[i][j-1][0],F[i][j-1][1],-INF)+A[i][j];
if (i!=1)
for (int j=m-1;j;--j)
F[i][j][2]=max(F[i][j+1][0],F[i][j+1][2],-INF)+A[i][j];
}
int ans=max(F[n][m][0],F[n][m][1],F[n][m][2])%MOD;
ans=pow(ans,K);
f[0]=1;
for (int i=1;i<=n*m;++i) f[i]=(LL)f[i-1]*i%MOD;
nf=pow(f[n*m],MOD-2);
for (int i=n*m;i;--i) ans=(LL)ans*nf%MOD,nf=(LL)nf*i%MOD;
printf("%d",ans);
}
- 运算
#include<cstdio>
using namespace std;
char c[1200];int idx=-1;
int main()
{
char ch=getchar();
while (ch!=EOF)
{
if (ch=='.')
{
puts("no");
return 0;
}
c[++idx]=ch;
ch=getchar();
}
if (c[0]=='1'&&(c[1]>'9'||c[1]<'1')) putchar('1');
else putchar('1'),putchar('/'),puts(c);
}