[关闭]
@994495jj 2017-08-18T12:55:05.000000Z 字数 1375 阅读 745

hdu6136

201708


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. #define dd(a) cout<<#a<<"="<<a<<" ";
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13. typedef vector<int> vi;
  14. //--------
  15. const int N=100005;
  16. pair<pii,int> a[N];
  17. int n,m,tim;
  18. int l[N],r[N],vis[N];
  19. int gcd(int a,int b) {
  20. if(b==0) return a;
  21. return gcd(b,a%b);
  22. }
  23. struct node {
  24. int i,j,ta,tb;
  25. node() {}
  26. node(int _i,int _j) {
  27. i=_i;j=_j;
  28. if(a[i].fi.se<a[j].fi.se) swap(i,j);
  29. ta=(a[j].fi.fi-a[i].fi.fi+m)%m;
  30. tb=a[i].fi.se-a[j].fi.se;
  31. int d=gcd(ta,tb);
  32. ta/=d;tb/=d;
  33. }
  34. bool operator < (const node &c) const {
  35. return 1ll*ta*c.tb>1ll*tb*c.ta;
  36. }
  37. };
  38. int main() {
  39. int T;scanf("%d",&T);
  40. while(T--) {
  41. ///
  42. scanf("%d%d",&n,&m);
  43. ///read
  44. rep(i,1,n+1) {
  45. int d;scanf("%d",&d);
  46. a[i].fi.fi=d;
  47. }
  48. rep(i,1,n+1) {
  49. int v;scanf("%d",&v);
  50. a[i].fi.se=v;
  51. a[i].se=i;
  52. }
  53. ///solve
  54. ++tim;
  55. sort(a+1,a+1+n);
  56. rep(i,1,n) r[i]=i+1;r[n]=1;
  57. rep(i,2,n+1) l[i]=i-1;l[1]=n;
  58. priority_queue<node> q;
  59. if(n>2) q.push(node(1,n));
  60. rep(i,1,n) q.push(node(i,i+1));
  61. int ta=0,tb=0;
  62. while(!q.empty()) {
  63. node now=q.top();q.pop();
  64. int i=now.i,j=now.j;
  65. if(vis[i]==tim||vis[j]==tim) continue;
  66. int t=(a[i].se>a[j].se)?j:i;
  67. vis[t]=tim;
  68. int L=l[t],R=r[t];
  69. if(L!=R) q.push(node(L,R));
  70. r[L]=R;l[R]=L;
  71. ta=now.ta;tb=now.tb;
  72. }
  73. ///print
  74. printf("%d/%d\n",ta,tb);
  75. }
  76. return 0;
  77. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注