@y20070316
2017-02-14T06:11:24.000000Z
字数 6142
阅读 935
OI 校内赛
#include <cstdio>#include <cctype>#include <vector>#include <queue>using namespace std;#define F(i,a,b) for (int i=(a);i<=(b);i++)#define X first#define Y second#define LL long longLL rd(void);const int N=1024;const LL MAX=(LL)1e16;int n,m;struct Ed {int v;LL d;Ed(int _v=0,LL _d=0) {v=_v;d=_d;}};vector<Ed> fac_g[N],rev_g[N];int s,t,k;int vis[N];LL h[N];priority_queue< pair<LL,int> > q;struct Info {LL f;LL g;int id;Info(LL _f=0,LL _g=0,int _id=0) {f=_f;g=_g;id=_id;}friend int operator < (Info a,Info b) {return a.f>b.f;}};priority_queue<Info> q2;int cnt;int main(void) {#ifndef ONLINE_JUDGEfreopen("A.in","r",stdin);freopen("A.out","w",stdout);#endifn=rd(),m=rd();F(i,1,m) {int x=rd(),y=rd();LL z=rd();fac_g[x].push_back(Ed(y,z));rev_g[y].push_back(Ed(x,z));}s=rd(),t=rd(),k=rd();fill(h,h+N,MAX);q.push(make_pair(0,t));while (!q.empty()) {pair<LL,int> x=q.top();q.pop();if (vis[x.Y])continue;h[x.Y]=-x.X;vis[x.Y]=1;F(i,1,rev_g[x.Y].size())if (!vis[rev_g[x.Y][i-1].v])q.push(make_pair(-h[x.Y]-rev_g[x.Y][i-1].d,rev_g[x.Y][i-1].v));}if (h[s]==MAX) {printf("-1\n");return 0;}q2.push(Info(0+h[s],0,s));while (!q2.empty()) {Info x=q2.top();q2.pop();if (x.id==t) {cnt++;if (cnt==k) {printf("%lld\n",x.g);return 0;}}F(i,1,fac_g[x.id].size())q2.push(Info(x.g+fac_g[x.id][i-1].d+h[fac_g[x.id][i-1].v],x.g+fac_g[x.id][i-1].d,fac_g[x.id][i-1].v));}printf("-1\n");return 0;}LL rd(void) {LL x=0,f=1; char c=getchar();while (!isdigit(c)) {if (c=='-') f=-1;c=getchar();}while (isdigit(c)) {x=x*10+c-'0';c=getchar();}return x*f;}
以后写完题目的时候,若样例比较费,要自己再手出一下。
#include <cstdio>#include <cctype>#include <algorithm>using namespace std;#define F(i,a,b) for (int i=(a);i<=(b);i++)int rd(void);const int M=32768;const int S=1048576;int n,m;int tot,root[M];struct Info {int f;int g;Info(int _f=0,int _g=0) {f=_f;g=_g;}};struct Tree {int l,r;int lc,rc;Info data;}tr[S];int Copynode(int frm) {int x=++tot;tr[x]=tr[frm];return x;}int Build(int l,int r) {int x=++tot;tr[x].l=l,tr[x].r=r;if (l!=r) {int mid=(l+r)>>1;tr[x].lc=Build(l,mid);tr[x].rc=Build(mid+1,r);}else tr[x].data=Info(l,0);return x;}Info Query(int x,int loc) {if (tr[x].l==tr[x].r)return tr[x].data;int mid=(tr[x].l+tr[x].r)>>1;if (loc<=mid)return Query(tr[x].lc,loc);else return Query(tr[x].rc,loc);}Info Find(int rt,int loc) {Info f_pos=Query(rt,loc);while (loc!=f_pos.f) {loc=f_pos.f;f_pos=Query(rt,loc);}return f_pos;}int Modify(int frm,int loc,Info data) {int x=Copynode(frm);if (tr[x].l==tr[x].r) {tr[x].data=data;return x;}int mid=(tr[x].l+tr[x].r)>>1;if (loc<=mid)tr[x].lc=Modify(tr[frm].lc,loc,data);else tr[x].rc=Modify(tr[frm].rc,loc,data);return x;}int main(void) {#ifndef ONLINE_JUDGEfreopen("B.in","r",stdin);freopen("B.out","w",stdout);#endifn=rd(),m=rd();root[0]=Build(1,n);F(i,1,m) {int kd=rd();if (kd==1) {int a=rd(),b=rd();Info fa=Find(root[i-1],a);Info fb=Find(root[i-1],b);if (fa.f==fb.f)root[i]=root[i-1];else {if (fa.g>fb.g)swap(fa,fb);int t=Modify(root[i-1],fa.f,Info(fb.f,fa.g));root[i]=Modify(t,fb.f,Info(fb.f,max(fa.g+1,fb.g)));}}else if (kd==2) {int k=rd();root[i]=root[k];}else {int a=rd(),b=rd();Info fa=Find(root[i-1],a);Info fb=Find(root[i-1],b);printf("%d\n",fa.f==fb.f);root[i]=root[i-1];}}return 0;}int rd(void) {int x=0,f=1; char c=getchar();while (!isdigit(c)) {if (c=='-') f=-1;c=getchar();}while (isdigit(c)) {x=x*10+c-'0';c=getchar();}return x*f;}
注意字符串的空间问题。
至少要开大2,而不是1!!
#include <cstdio>#include <cstring>#include <cctype>#include <ctime>#include <algorithm>#include <cassert>using namespace std;#define F(i,a,b) for (int i=(a);i<=(b);i++)#define LL long longLL rd(void);const int N=262144;int n;char s[16];int m;int root,tot;struct Treap {int lc,rc;LL key;int fix;int siz;int rev_tag;LL delta;LL min_val;}tr[N];struct D {int lc,rc;D(int _lc=0,int _rc=0) {lc=_lc,rc=_rc;}};int Newnode(LL val) {int x=++tot;tr[x].lc=tr[x].rc=0;tr[x].key=val;tr[x].fix=rand();tr[x].siz=1;tr[x].rev_tag=0;tr[x].delta=0;tr[x].min_val=val;return x;}void Update(int x) {int lc=tr[x].lc;int rc=tr[x].rc;tr[x].siz=tr[lc].siz+1+tr[rc].siz;tr[x].min_val=tr[x].key;if (lc>0)tr[x].min_val=min(tr[x].min_val,tr[lc].min_val);if (rc>0)tr[x].min_val=min(tr[x].min_val,tr[rc].min_val);}void Rev(int x) {tr[x].rev_tag^=1;swap(tr[x].lc,tr[x].rc);}void Push_del(int x,LL d) {tr[x].key+=d;tr[x].delta+=d;tr[x].min_val+=d;}void Clear(int x) {int lc=tr[x].lc;int rc=tr[x].rc;if (tr[x].rev_tag) {if (lc>0)Rev(lc);if (rc>0)Rev(rc);tr[x].rev_tag=0;}if (tr[x].delta!=0) {if (lc>0)Push_del(lc,tr[x].delta);if (rc>0)Push_del(rc,tr[x].delta);tr[x].delta=0;}}int Merge(int x,int y) {if (!x||!y)return x+y;if (tr[x].fix<tr[y].fix) {Clear(x);tr[x].rc=Merge(tr[x].rc,y);Update(x);return x;}else {Clear(y);tr[y].lc=Merge(x,tr[y].lc);Update(y);return y;}}D Split(int x,int rk) {if (!rk)return D(0,x);Clear(x);D t;if (rk<=tr[tr[x].lc].siz) {t=Split(tr[x].lc,rk);tr[x].lc=t.rc;Update(x);t.rc=x;}else {t=Split(tr[x].rc,rk-tr[tr[x].lc].siz-1);tr[x].rc=t.lc;Update(x);t.lc=x;}return t;}void Add(int &rt,int x,int y,LL d) {D tx=Split(rt,y);D ty=Split(tx.lc,x-1);Push_del(ty.rc,d);rt=Merge(Merge(ty.lc,ty.rc),tx.rc);}void Reverse(int &rt,int x,int y) {D tx=Split(rt,y);D ty=Split(tx.lc,x-1);Rev(ty.rc);rt=Merge(Merge(ty.lc,ty.rc),tx.rc);}void Revolve(int &rt,int x,int y,int t) {D tx=Split(rt,y);D ty=Split(tx.lc,x-1);t%=tr[ty.rc].siz;D tz=Split(ty.rc,tr[ty.rc].siz-t);rt=Merge(Merge(ty.lc,Merge(tz.rc,tz.lc)),tx.rc);}void Insert(int &rt,int rk,LL val) {D tx=Split(rt,rk);int x=Newnode(val);rt=Merge(Merge(tx.lc,x),tx.rc);}void Delete(int &rt,int rk) {D tx=Split(rt,rk-1);D ty=Split(tx.rc,1);rt=Merge(tx.lc,ty.rc);}LL GetMin(int rt,int x,int y) {D tx=Split(rt,y);D ty=Split(tx.lc,x-1);LL ans=tr[ty.rc].min_val;rt=Merge(Merge(ty.lc,ty.rc),tx.rc);return ans;}int main(void) {#ifndef ONLINE_JUDGEfreopen("C.in","r",stdin);freopen("C.out","w",stdout);#endifsrand(time(0));n=rd();F(i,1,n) {LL x=rd();root=Merge(root,Newnode(x));}m=rd();F(i,1,m) {scanf("%s",s+1);if (s[1]=='A') {int x=rd(),y=rd();LL d=rd();Add(root,x,y,d);}else if (s[1]=='R'&&s[4]=='E') {int x=rd(),y=rd();Reverse(root,x,y);}else if (s[1]=='R'&&s[4]=='O') {int x=rd(),y=rd(),t=rd();Revolve(root,x,y,t);}else if (s[1]=='I') {int x=rd(); LL p=rd();Insert(root,x,p);}else if (s[1]=='D') {int x=rd();Delete(root,x);}else if (s[1]=='M') {int x=rd(),y=rd();LL ans=GetMin(root,x,y);printf("%lld\n",ans);}}return 0;}LL rd(void) {LL x=0,f=1; char c=getchar();while (!isdigit(c)) {if (c=='-') f=-1;c=getchar();}while (isdigit(c)) {x=x*10+c-'0';c=getchar();}return x*f;}