
密码锁#includebits/stdc.h using namespace std; const int N11,mod10; int n,ans,dp[N][N][N][N][N]; int main() { cinn; for(int i1;in;i) { int a,b,c,d,e; cinabcde; for(int j1;j9;j) { dp[(aj)%mod][b][c][d][e]; dp[a][(bj)%mod][c][d][e]; dp[a][b][(cj)%mod][d][e]; dp[a][b][c][(dj)%mod][e]; dp[a][b][c][d][(ej)%mod]; dp[(aj)%mod][(bj)%mod][c][d][e]; dp[a][(bj)%mod][(cj)%mod][d][e]; dp[a][b][(cj)%mod][(dj)%mod][e]; dp[a][b][c][(dj)%mod][(ej)%mod]; } } for(int i0;i9;i) for(int j0;j9;j) for(int k0;k9;k) for(int u0;u9;u) for(int v0;v9;v) if(dp[i][j][k][u][v]n)ans; coutans; return 0; }消消乐#includebits/stdc.h #define ll long long using namespace std; const int N2e65; int n,dp[N],a[N][26],to[N]; char s[N]; ll ans; int main() { scanf(%d%s,n,s1); for(int i1;in;i) { to[i]i; int xa[to[i-1]][s[i]-a]; if(x) to[i]to[x-1],dp[i]dp[x-1]1; a[to[i]][s[i]-a]i,ansdp[i]; } printf(%lld\n,ans); return 0; }结构体#includebits/stdc.h using namespace std; typedef long long ll; typedef pairll,ll pr; const int MAXN256; ll max(ll x,ll y){return xy?x:y;} ll min(ll x,ll y){return xy?x:y;} pr mp(ll x,ll y){return (pr){x,y};} //用来输入的变量 ll n,op,k,addr_in; string s,ti,ni,in1[MAXN],in2[MAXN]; //类型结构体 struct Type{ string Name;//类型名称 vectorType* Member_Type;//类型成员类型 vectorstring Member_Name;//类型成员元素 ll Memory_Size;//类型占用内存大小 ll Memory_Align;//类型对齐要求 void clear(){ Name.clear(); Member_Type.clear(); Member_Name.clear(); Memory_AlignMemory_Size0; } }; Type Def_Type[MAXN];//已被定义过的类型 ll Type_Num;//已被定义过的类型数量 mapstring,Type* Name_To_Type;//名称到类型的映射 //元素结构体 struct Element{ Type Ele_Type;//元素类型 string Name;//元素名称 ll Address;//元素起始地址 void clear(){ Ele_Type.clear(); Name.clear(); Address0; } }; Element Def_Ele[MAXN];//已被定义过的元素 ll Ele_Num;//已被定义过的元素数量 mapstring,Element* Name_To_Ele;//名称到元素的映射 //地址 ll Addr_Pos;//已分配到的地址位置 mappr,Element* Addr_To_Ele;//地址到元素的映射 //函数 void Nothing();//一个不知道干什么用也没有存在感的空函数 void init();//预处理 void Type_Create(string,ll,string*,string*);//创建一个类型的函数 void Ele_Create(string,string);//创建一个元素的函数 ll Visit_Ele(string);//访问某个元素的函数 string Visit_Addr(ll);//访问某个地址的元素 void work();//工作 //主函数 int main(){ init(); work(); return 0; } //创建一个类型的函数 void Type_Create(string type_name,ll num,string *ar1,string *ar2){ Type New_Type;//创建一个新类型 New_Type.clear(); New_Type.Nametype_name;//名字直接赋值 for(int i1;inum;i){ New_Type.Member_Type.push_back(Name_To_Type[ar1[i]]);//成员类型直接赋值 New_Type.Member_Name.push_back(ar2[i]);//成员名称直接赋值 } ll pos0;//起始地址默认为 0 vectorType*::iterator itNew_Type.Member_Type.begin(); for(;it!New_Type.Member_Type.end();it){//遍历成员 ll Align(*it)-Memory_Align;//成员对齐要求 ll Size(*it)-Memory_Size;//成员大小 New_Type.Memory_Alignmax(New_Type.Memory_Align,Align);//类型的对齐要求为其成员中的最大对齐要求 if(pos%Align)pos(pos/Align1)*Align;//如果起始地址不满足对齐规则 posSize;//下一个成员的起始地址(这个成员的终止地址) } if(pos%New_Type.Memory_Align) pos(pos/New_Type.Memory_Align1)*New_Type.Memory_Align;//如果终止地址不满足对齐规则 New_Type.Memory_Sizepos;//终止地址减去起始地址即为大小(起始地址默认为 0) Def_Type[Type_Num]New_Type;//别忘了维护这个数组 Name_To_Type[type_name]Def_Type[Type_Num];//别忘了维护这个映射 } //创建一个元素的函数 void Ele_Create(string type_name,string ele_name){ Element New_Ele;//创建一个新元素 New_Ele.clear(); ll AlignName_To_Type[type_name]-Memory_Align;//该元素的类型的对齐要求 ll SizeName_To_Type[type_name]-Memory_Size;//该元素的大小 if(Addr_Pos%Align)Addr_Pos((Addr_Pos/Align1)*Align);//若起始位置不满足对齐规则 New_Ele.AddressAddr_Pos;//起始地址赋值 New_Ele.Ele_Type*Name_To_Type[type_name];//通过映射找到该类型,赋值 New_Ele.Nameele_name;//名称直接赋值 Def_Ele[Ele_Num]New_Ele;//别忘了维护这个数组 Name_To_Ele[ele_name]Def_Ele[Ele_Num];//别忘了维护这个映射 Addr_To_Ele[mp(Addr_Pos,Addr_PosSize-1)]Def_Ele[Ele_Num];//将元素的起始位置和终止位置作为键值加入元素 Addr_PosSize;//更新最高位地址 } //访问某个元素的函数 ll Visit_Ele(string ele_name){ queuestring name;//存储名称的队列 string tool;//如其名 tool.clear(); for(int i0;i(ll)ele_name.length();i){//处理名称 if(ele_name[i].){//如果遇上了调用符 name.push(tool); tool.clear(); } else toolele_name[i]; } name.push(tool); ll posName_To_Ele[name.front()]-Address;//起始地址为最外层元素的起始地址 Type typeName_To_Ele[name.front()]-Ele_Type;//最外层元素的类型 name.pop(); while(!name.empty()){ string Namename.front();//取出队首 name.pop(); vectorstring::iterator it1type.Member_Name.begin();//遍历成员名称 vectorType*::iterator it2type.Member_Type.begin();//遍历成员类型 for(;it1!type.Member_Name.end();it1,it2){ if(pos%(*it2)-Memory_Align) pos(pos/(*it2)-Memory_Align1)*(*it2)-Memory_Align;//如果起始地址不满足对齐规则 if(*it1Name){//如果找到了新队首 type**it2; break; } else pos(*it2)-Memory_Size;//更新起始地址 } } return pos; } //访问某个地址的元素 string Visit_Addr(ll addr){ if(addrAddr_Pos)return ERR;//判断地址是否在某个元素中 Element ele; mappr,Element*::iterator itAddr_To_Ele.begin(); for(;it!Addr_To_Ele.end();it){//寻找地址所处的元素 if(addr(*it).first.first or addr(*it).first.second)continue; ele*((*it).second); break; } ll pos_goaladdr-ele.Address,pos_s0,pos_t;//目标地址、起始地址、终止地址 Type typeele.Ele_Type;//当前元素类型 string ele_name;//元素名称 ele_name.clear(); ele_nameele.Name;//元素名称先加上最外层元素名称 while(!type.Member_Name.empty()){//循环直到元素类型为基本类型(此时元素类型没有成员) vectorType*::iterator it1type.Member_Type.begin();//遍历当前元素类型的成员类型 vectorstring::iterator it2type.Member_Name.begin();//遍历当前元素类型的成员名称 for(;it1!type.Member_Type.end();it1,it2){ pos_tpos_s(*it1)-Memory_Size;//更新终止地址 if(pos_goalpos_t and pos_goalpos_s){//如果目标地址在此成员中 ele_name.*it2;//更新元素名称 type**it1;//更新元素类型 //这两行代码需要注意不可调换位置 //因为 it2 是 type 的迭代器,type 更改后,it2 也会相应改变 //因此需要在改变 type 之前调用 it2 break; } else{//如果目标地址不在此成员中 if(it11type.Member_Type.end())return ERR;//如果这个成员是最后一个成员了,说明目标地址为空洞 ll Align(*(it11))-Memory_Align;//该成员的对齐要求 if(pos_t%Align)pos_t(pos_t/Align1)*Align;//如果终止地址不满足对齐规则 if(pos_goalpos_t)return ERR;//如果目标地址在满足对齐规则后处于此成员内了,那么说明目标地址为空洞 pos_spos_t;//更新起始位置 } } } if(ele_name)return ERR;//特判,若名称为空,则说明不存在元素包含这个地址 return ele_name; } //预处理 void init(){ Def_Type[1].Namebyte; Def_Type[2].Nameshort; Def_Type[3].Nameint; Def_Type[4].Namelong; Def_Type[1].Memory_AlignDef_Type[1].Memory_Size1; Def_Type[2].Memory_AlignDef_Type[2].Memory_Size2; Def_Type[3].Memory_AlignDef_Type[3].Memory_Size4; Def_Type[4].Memory_AlignDef_Type[4].Memory_Size8; Name_To_Type[byte]Def_Type[1]; Name_To_Type[short]Def_Type[2]; Name_To_Type[int]Def_Type[3]; Name_To_Type[long]Def_Type[4]; Type_Num4; } //工作 void work(){ scanf(%lld,n);//输入 n while(n--){ scanf(%lld,op);//输入操作类型 if(op1){//操作 1 cinsk; for(int i1;ik;i)cinin1[i]in2[i]; Type_Create(s,k,in1,in2); coutDef_Type[Type_Num].Memory_Size Def_Type[Type_Num].Memory_Align\n; } else if(op2){//操作 2 cintini; Ele_Create(ti,ni); coutDef_Ele[Ele_Num].Address\n; } else if(op3){//操作 3 cins; coutVisit_Ele(s)\n; } else if(op4){//操作 4 cinaddr_in; coutVisit_Addr(addr_in)\n; } } }种树#includebits/stdc.h using namespace std; #define ___ __int128 const int N1e510; int n,b[N],c[N],p[N],t[N],fa[N],stk[N]; int h[N],e[N1],ne[N1],idx; bool vis[N]; long long a[N]; inline void add(int a,int b) { e[idx]b;ne[idx]h[a];h[a]idx; } inline void dfs(int u,int p){fa[u]p;for(int ih[u];~i;ine[i]) if(e[i]!p) dfs(e[i],u);} inline ___ calc(int x,___ l,___ r) { if(c[x]0) return (r-l1)*b[x](r-l1)*(lr)/2*c[x]; ___ T(1-b[x])/c[x]; if(Tl) return r-l1; if(Tr) return (r-l1)*b[x](r-l1)*(lr)/2*c[x]; return (T-l1)*b[x](T-l1)*(lT)/2*c[x]r-T; } inline bool check(int r) { for(int i1;in;i) { if(calc(i,1,r)a[i]) return false; int dl1,drn; while(dldr) { int mid(dldr1)1; if(calc(i,mid,r)a[i]) dlmid; else drmid-1; } p[i]i;t[i]dl;vis[i]false; } sort(p1,pn1,[](int A,int B){return t[A]t[B];}); for(int i1,x0;in;i) { int nowp[i],top0; while(!vis[now]) vis[stk[top]now]true,nowfa[now]; while(top) if(t[stk[top--]]x) return false; } return true; } int main() { memset(h,-1,sizeof h); scanf(%d,n); for(int i1;in;i) scanf(%lld%d%d,a[i],b[i],c[i]); for(int i1;in;i) { int u,v; scanf(%d%d,u,v); add(u,v);add(v,u); } dfs(1,0);vis[0]true; int ln,r1e9; while(lr) { int mid(lr)1; if(check(mid)) rmid; else lmid1; } printf(%d,l); return 0; }