关于刚结束的T1
  • 板块学术版
  • 楼主cmll02
  • 当前回复20
  • 已保存回复20
  • 发布时间2021/2/6 18:18
  • 上次更新2023/11/5 03:38:30
查看原帖
关于刚结束的T1
171487
cmll02楼主2021/2/6 18:18

RT,蒟蒻直接跑打暴力。。

但是#10跑6s左右过不去/kk

加了各种玄学优化(比如奇怪的hash、size优化、剪枝),然而还是T

QAQ

求优化/kel

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <assert.h>
#include <stack>
#include <unordered_map>
#include <stdlib.h>
#define int unsigned long long
inline int read()
{
	int num = 0; char c = getchar();
	while (c<48 || c>57)c = getchar();
	while (c >= 48 && c <= 57)num = (num << 3) + (num << 1) + (c ^ 48), c = getchar();
	return num;
};
int a;
struct Node{
	int type;//0=^!&|
	int num;
	Node *lc,*rc;
	int sz;
}*r;
std::unordered_map<int,char> ma;
//std::stack<Node*> s;
Node* s[100005];
int pos=0;
void build2(Node *r,Node *fa,Node *root,int p)
{
	//putchar('(');
	if(r->type==1)
	{
		r->sz=1;
		return;
	}
	if(r->num=='!'&&r->rc->type==0&&r->rc->num=='!'&&r!=root)
	{
		if(p)
		{
			fa->rc=r->rc->rc;
			build2(fa->rc,fa,root,1);
		}
		else
		{
			fa->lc=r->rc->rc;
			build2(fa->lc,fa,root,0);
		}
		return;
		//Node *p=r->rc->rc;
		//delete(r->rc);
		//r->rc=p;
	}
	if(r->lc)build2(r->lc,r,root,0),r->sz+=r->lc->sz;
	//if(r->type)printf("%d",r->num);
	//else putchar(r->num);
	if(r->rc)build2(r->rc,r,root,1),r->sz+=r->rc->sz;
	r->sz++;
	if(r->lc)
	{
		if(r->lc->sz>r->rc->sz)
		{
			Node *o=r->lc;r->lc=r->rc;r->rc=o;
		}
	}
	//putchar(')');
}
void build(Node *r)
{
	putchar('(');
	if(r->lc)build(r->lc);
	if(r->type)printf("%d",r->num);
	else putchar(r->num);
	if(r->rc)build(r->rc);
	putchar(')');
}
short hash[59731027];
short ffff[59731027];
inline int get(int p)
{
	int u=p%59731027;
	while(hash[u])
	{
		if(ffff[u]==p)return u;
		u=(u+14285008)%59731027;
	}
	return u;
}
int calc(Node *r)
{
	if(r->type==1)return (a>>r->num)&1;
	if(r->num=='|')return (calc(r->lc)==1?1:calc(r->rc));
	if(r->num=='&')return (calc(r->lc)==0?0:calc(r->rc));
	if(r->num=='^')return calc(r->lc)^calc(r->rc);
	if(r->num=='!')return !calc(r->rc);
	return 114514;
}
int u[64];
signed main()
{
	int n=read(),ans=0;
	for(int i=0;i<n;i++)
	{
		char c[5];
		scanf("%s",&c);
		//puts("AL");
		Node *e=new Node();
		if(c[1])
		{
			//Node *e;
			e->type=1;
			e->num=(c[0]-48)*10+c[1]-48;
			u[e->num]=1;
			e->lc=e->rc=NULL;
			s[pos++]=e;
		}
		else if(c[0]>47&&c[0]<58)
		{
			//printf("%s z\n",c);
			//Node *e;
			e->type=1;
			//printf("%s z\n",c);
			e->num=(c[0]-48);
			u[e->num]=1;
			//printf("%s z\n",c);
			e->lc=e->rc=NULL;
			//printf("%s z\n",c);
			s[pos++]=e;
			//printf("%s z\n",c);
		}
		else
		{
			if(c[0]=='!')
			{
				//Node *e;
				Node *p=s[--pos];
				e->rc=p;e->lc=NULL;
				e->num=c[0];e->type=0;
			}
			else
			{
				//Node *e;
				Node *p=s[--pos];
				Node *q=s[--pos];
				if(n<=50000)e->lc=p,e->rc=q;
				else e->lc=q,e->rc=p;
				e->num=c[0];e->type=0;
			}
			s[pos++]=e;
		}
		r=e;
	}
	//build2(r);
	build2(r,r,r,0);
	//build(r);
	int M=read(),tm;
	while(M--)
	{
		a=read();
		int qaq=get(a);
		if(hash[qaq])
		{
			putchar(hash[qaq]);
			continue;
		}
		int p=calc(r)+48;
		putchar(p);
		hash[qaq]=p;
		ffff[qaq]=a;
		/*tm=ma[a];
		if(tm)putchar(tm);
		else
		{
			tm=calc(r)+48;
			putchar(tm);
			///hash[a%59731027]=tm;
			ma[a]=tm;
		}*/
	}
	//printf("%lld\n",);
	return 0;
}
2021/2/6 18:18
加载中...