题解,但不是回文数

刘嘉柚  •  2个月前


#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 100007
using namespace std;
struct Splay{
	int val,fa,s[2],size;
}t[N];
struct Node{
	int num,val;
}a[N];
int c[N];
int root,T,n=0,cnt=0,m,num=0,f[N];
bool Cmp(const Node a,const Node b){
    return a.val<b.val;
}
void update(int p){
    t[p].size=t[t[p].s[0]].size+t[t[p].s[1]].size+1;
}
int wich(int x){
    return t[t[x].fa].s[0]==x? 0:1;
}
void connect(int x,int y,int f){
    t[x].fa=y;t[y].s[f]=x;
}
int lowbit(int x){
    return x&(-x);
}
void add(int x,int val){
    while(x<=n){
        c[x]=max(c[x],val);
        x+=lowbit(x);
    }
}
int query(int x){
    int ret=0;
    while(x){
        ret=max(ret,c[x]);x-=lowbit(x);
    }
    return ret;
}
void rotate(int x){
	int y=t[x].fa,rt=t[y].fa;
	int ys=wich(x),rts=wich(y);
	connect(t[x].s[ys^1],y,ys);
	connect(y,x,ys^1);connect(x,rt,rts);
	update(y);update(x);
}

void rota(int p){
	if(wich(p)==wich(t[p].fa)){rotate(t[p].fa);rotate(p);}
	else{rotate(p);rotate(p);}
}

void splay(int p,int to)
{
	if(!p) return;
	if(p==to) return;
	if(to==root) root=p;
	while(1)
	{
		if(t[p].fa==to){rotate(p);return;}
		if(t[t[p].fa].fa==to){rota(p);return;}
		rota(p);
	}
}

int find(int x)
{
	int p=root;
	while(p)
	{
		if(x<=t[t[p].s[0]].size) p=t[p].s[0];
		else if(x==t[t[p].s[0]].size+1) return p;
		else{x-=t[t[p].s[0]].size+1;p=t[p].s[1];}
	}
	return 0;
}
void insert(int val,int k)
{
	int l=find(k+1),r=find(k+2);
	splay(l,root);
	splay(r,t[root].s[1]);
	t[++cnt]=(Splay){val,t[root].s[1],{0,0},1};
	t[t[root].s[1]].s[0]=cnt;
	update(t[root].s[1]);update(root);
	splay(cnt,root);
}

void dfs(int p)
{
	if(t[p].s[0]) dfs(t[p].s[0]);
	if(t[p].val!=INF&&t[p].val!=-INF)
		a[++num].val=t[p].val;
	if(t[p].s[1]) dfs(t[p].s[1]);
}
int main()
{
	t[++cnt]=(Splay){-INF,0,{0,2},2};
	t[++cnt]=(Splay){INF,1,{0,0},1};
	scanf("%d",&n); 
	int x;
	root=1;
	for(int i=1; i<=n; i++)
		scanf("%d",&x),insert(i,x);
	dfs(root);
	for(int i=1; i<=n; i++) a[i].num=i;
	sort(a+1,a+1+n,Cmp);
	int ans=0;
	for(int i=1; i<=n; i++)
	{
		int maxx=query(a[i].num);
		add(a[i].num,++maxx);
		ans=max(ans,maxx);
		printf("%d\n",ans);
	}
}

评论:

L

#include <cstdio>
#include <cstring>
const int S=303;
int n,a[S],l;
char c[S],d[S];
inline void add()
{
	for (int i=0;i<l;++i)
		d[l-i-1]=c[i];
	l+=2;
	for (int i=0;i<l;++i)
	{
		c[i]+=d[i];
		if (c[i]>=n) c[i+1]++,c[i]-=n;
	}
	while (!c[l-1]) --l;
}
inline bool pd()
{
	for (int i=0;i<l;++i)
		if (c[i]!=c[l-1-i]) return false;
	return true;
}
int main()
{
	scanf("%d%s",&n,c);l=strlen(c);
	for (int i=0;i<l;++i)
	{
		if (c[i]>='0' && c[i]<='9') c[i]-='0';
		else c[i]=c[i]-'A'+10;
	}
	int step=0;
	while (!pd())
	{
		++step;
		if (step>30) break;
		add();
	}
	if (step<=30) printf("%d\n",step);
	else puts("Impossible!");
	return 0;
}

awa


baim.  •  2个月前

大佬好强,连2017年的题解抄的都是您的代码


蒋沛霖  •  2个月前