pku 2886

来源:互联网 发布:打电话说中文域名到期 编辑:程序博客网 时间:2024/06/15 05:09
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <set>#include <string>#include <cstring>#include <list>#include <queue>#include <stack>#include <cmath>using namespace std;#define PF(x) (scanf("%d",&x))#define PT(x,y) (scanf("%d%d",&x,&y))#define PR(x) (printf("%d\n",x))#define PRT(x,y)(printf("%d %d\n",x,y))#define PB(x)(scanf("%I64d",&x))#define PRB(x)(printf("%I64d\n",(x)))typedef __int64 LL;#define N 500005#define M 105#define Mod 1000#define Inf 0x7fffffff#define L(x) (x<<1)#define R(x) ((x<<1)|1)#define For(i,n) for(int i=0;i<n;i++)#define lowbit(x) (x) & (-x)#define mid(x,y) ((x+y)>>1)int nprime[N];int anti[N];int nth[N];void cal(){memset(nprime,0,sizeof(nprime));for(int i=1;i<=N;i++)for(int j=1;j<=N/i;j++)nprime[i*j]++;int ma=1;int index = 1;for (int i=1;i<N;i++){if(ma<nprime[i]) ma = nprime[i],index = i;anti[i] = ma;nth[i] = index;}}struct tree{int l,r;int sum;};struct P{char s[20];int credit;void in(){scanf("%s%d",s,&credit);}};tree T[4*N];int n,kth;int ar[N];int result;P arr[N];inline int maxx(int a,int b){return a>b?a:b;}inline int minx(int a,int b){return a>b?b:a;}void build(int l,int r,int k){    T[k].l = l;T[k].r = r;T[k].sum = r-l+1;if(l == r) return ;    int mi = mid(l,r);build(l,mi,L(k));build(mi+1,r,R(k));}void update(int pos,int k){if(T[k].l == T[k].r){T[k].sum = 0;result = T[k].l;return ;}if(T[L(k)].sum>=pos) update(pos,L(k));else update(pos-T[L(k)].sum,R(k));T[k].sum = T[L(k)].sum + T[R(k)].sum;}int sum(int l,int r,int k){if(l<=T[k].l && r>=T[k].r) return T[k].sum;int mi = mid(T[k].l,T[k].r);int ans = 0;if(l<=mi) ans += sum(l,r,L(k));if(r>mi) ans += sum(l,r,R(k));return ans;}void init(){   cal();      while(scanf("%d%d",&n,&kth)!=EOF)   {   For(i,n)   arr[i].in();   build(1,n,1);   int temp = nth[n];   for(int i=1;i<=temp;i++)   {   if(i==1) update(kth,1);   else    {   if(arr[result-1].credit<0)   {   int np = n-i+1;   int pos = -arr[result-1].credit%np;   if(pos == 0) pos = np;   int ln = sum(1,result,1);   if(ln>=pos) update(ln-pos+1,1);   else update(np-(pos-ln)+1,1);   }   else   {   int np = n-i+1;   int pos = (arr[result-1].credit)%np;   if(pos == 0) pos = np;   int ln = sum(1,result,1);   int te = np - ln;   if(te>=pos) update(ln+pos,1);   else update(pos-te,1);   }   }   }   printf("%s %d\n",arr[result-1].s,anti[n]);   }   return ;}int main(){init();return 0;}

原创粉丝点击