网站推荐你懂我的意思吧知乎,外包是做什么的,wordpress网站导出,昆明网站建设设计考场错误#xff1a; A题其实并不简单#xff0c;但是先想了一个方法后#xff0c;就交了#xff0c;wa了后一直卡住#xff0c;策略不当#xff0c;到最后后期写C的时候也犯了一些低级的错误#xff0c;这点需要注意。 之后顺利的把BCDHI写完后#xff0c;又完成了A的…考场错误 A题其实并不简单但是先想了一个方法后就交了wa了后一直卡住策略不当到最后后期写C的时候也犯了一些低级的错误这点需要注意。 之后顺利的把BCDHI写完后又完成了A的改正补充最后又把G完成了最终做出了7个题但罚时最多应该注意正确率
Gym - 100738E
启发式合并的模板题其实看到25次的限制就应该想到应该和log有关结合最小生成树的Kruskal的算法把边权排序一个一个做合并就可以了注意每次选择sz小的往sz大的上面合并就好了
#includebits/stdc.h
using namespace std;
typedef long long ll;
const int maxn2e55;
int n,m;
struct edge
{int x,y,z;
}e[maxn1];
int fa[maxn],bus[maxn];
vector int driver[maxn];
bool cmp(edge x,edge y)
{return x.zy.z;
}
int find(int x)
{if(xfa[x]) return x;return fa[x]find(fa[x]);
}
vector int G[maxn];
int gs;
ll res;
void print(int u,int ff)
{for(int to:G[u]){if(toff) continue;print(to,u);if(driver[bus[to]].size()driver[bus[u]].size())swap(bus[u],bus[to]);for(int v:driver[bus[to]]){driver[bus[u]].push_back(v);printf(Move %d %d %d\n,v,bus[to],bus[u]);}}if(ff) printf(Drive %d %d %d\n,bus[u],u,ff);
}
int main()
{scanf(%d%d,n,m);for(int i1;im;i) scanf(%d%d%d,e[i].x,e[i].y,e[i].z);for(int i1;in;i) fa[i]i,bus[i]i,driver[i].push_back(i);sort(e1,em1,cmp);for(int i1;im;i){int fxfind(e[i].x),fyfind(e[i].y);if(fxfy) continue;fa[fx]fy;rese[i].z;G[e[i].x].push_back(e[i].y);G[e[i].y].push_back(e[i].x);gs; if(gsn-1) break;}printf(%lld\n,res);for(int i1;in;i) fa[i]i;print(1,0);printf(Done\n);return 0;
}Gym - 100738F
后缀数组的裸题可以使用后缀数组后 然后把询问离线按照长度依次处理对于同一个长度二分配合树状数组计算即可
#includebits/stdc.h
using namespace std;
const int maxn1e55;
int n;
char s[maxn];
int sa[maxn],rk[maxn],cnt[maxn],fz[maxn];
int oldrk[maxn],id[maxn];
bool cmp(int x,int y,int w)
{return oldrk[x]oldrk[y] oldrk[xw]oldrk[yw];
}
void SA()
{int m233;for(int i0;im;i) cnt[i]0;for(int i1;in;i) cnt[rk[i]s[i]];for(int i1;im;i) cnt[i]cnt[i-1];for(int in;i1;i--) sa[cnt[rk[i]]--]i;int i,p;for(int w1;;w1,mp){for(p0,in;in-w;i--) id[p]i;for(i1;in;i) if(sa[i]w) id[p]sa[i]-w;for(i0;im;i) cnt[i]0;for(i1;in;i) cnt[fz[i]rk[id[i]]];for(i1;im;i) cnt[i]cnt[i-1];for(in;i1;i--) sa[cnt[fz[i]]--]id[i];for(i1;in;i) oldrk[i]rk[i];for(p0,i1;in;i) rk[sa[i]]cmp(sa[i],sa[i-1],w)?p:p;if(pn){for(i1;in;i) sa[rk[i]]i;break;}}
}
struct Query
{int id,l,k;
}q[maxn];
int Q;
bool ccmp(Query x,Query y)
{return x.ly.l;
}
int c[maxn];
int lowbit(int x)
{return x-x;
}
void add(int pos,int x)
{while(posn){c[pos]x;poslowbit(pos);}
}
int ask(int pos)
{int res0;while(pos){resc[pos];pos-lowbit(pos);}return res;
}
int res[maxn];
int main()
{scanf(%s,s1);nstrlen(s1);SA();scanf(%d,Q);for(int i1;iQ;i){scanf(%d%d,q[i].l,q[i].k);q[i].idi;} sort(q1,qQ1,ccmp);int now1;for(int i1;iQ;i){while(nowq[i].l){add(rk[n-now1],1);now;}int l1,rn,ans0;while(lr){int midlr1;if(mid-ask(mid)q[i].k) ansmid,rmid-1;else lmid1;}res[q[i].id]sa[ans];}for(int i1;iQ;i) printf(%d\n,res[i]);return 0;
}