比赛 20241127 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 魔法传送阵 最终得分 100
用户昵称 flyfree 运行时间 12.897 s
代码语言 C++ 内存使用 95.89 MiB
提交时间 2024-11-27 10:55:04
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MAXN 1000010
  5. #define debug cout<<"flyfree\n";
  6. inline ll read(){
  7. ll x=0,f=1;
  8. char c=getchar();
  9. while(c<'0'||c>'9'){
  10. if(c=='-')f=-1;
  11. c=getchar();
  12. }
  13. while(c>='0'&&c<='9'){
  14. x=x*10+c-'0';
  15. c=getchar();
  16. }
  17. return x*f;
  18. }
  19. struct node{
  20. ll l,r;
  21. };
  22. bool cmp(node a,node b){
  23. return (a.l+a.r)<(b.l+b.r);
  24. }
  25. struct treap{
  26. ll idx,rot,q;
  27. ll s[MAXN][2],val[MAXN],siz[MAXN],sum[MAXN],key[MAXN],sht[MAXN];
  28. void mk(){
  29. memset(s,0,sizeof(s));
  30. memset(val,0,sizeof(val));
  31. memset(siz,0,sizeof(siz));
  32. memset(sum,0,sizeof(sum));
  33. memset(key,0,sizeof(key));
  34. rot=0,idx=0;
  35. }
  36. ll newnode(ll x){
  37. ll now;
  38. if(q){
  39. now=sht[q--];
  40. }else now=++idx;
  41. val[now]=sum[now]=x;
  42. s[now][0]=s[now][1]=0;
  43. siz[now]=1;
  44. key[now]=rand();
  45. return now;
  46. }
  47. void push_up(ll p){
  48. sum[p]=val[p]+sum[s[p][0]]+sum[s[p][1]];
  49. siz[p]=siz[s[p][0]]+siz[s[p][1]]+1;
  50. }
  51. void split_val(ll p,ll v,ll &x,ll &y){
  52. // cout<<p<<endl;
  53. if(!p){
  54. x=y=0;
  55. return;
  56. }
  57. if(val[p]<=v){
  58. x=p;
  59. split_val(s[p][1],v,s[p][1],y);
  60. }else{
  61. y=p;
  62. split_val(s[p][0],v,x,s[p][0]);
  63. }
  64. push_up(p);
  65. }
  66. void split_siz(ll p,ll k,ll &x,ll &y){
  67. if(!p){
  68. x=y=0;
  69. return;
  70. }
  71. if(siz[s[p][0]]<k){
  72. x=p;
  73. split_siz(s[p][1],k-siz[s[p][0]]-1,s[p][1],y);
  74. }else{
  75. y=p;
  76. split_siz(s[p][0],k,x,s[p][0]);
  77. }
  78. push_up(p);
  79. }
  80. ll merge(ll x,ll y){
  81. if(!x||!y)return x|y;
  82. if(key[x]<=key[y]){
  83. s[x][1]=merge(s[x][1],y);
  84. push_up(x);
  85. return x;
  86. }else{
  87. s[y][0]=merge(x,s[y][0]);
  88. push_up(y);
  89. return y;
  90. }
  91. }
  92. void insert(ll v){
  93. ll x,y,z;
  94. split_val(rot,v,x,y);
  95. // debug
  96. z=newnode(v);
  97. rot=merge(merge(x,z),y);
  98. }
  99. void del(ll v){
  100. ll x,y,z;
  101. split_val(rot,v,x,y);
  102. split_val(x,v-1,x,z);
  103. // siz[z]=val[z]=sum[z]=0;
  104. sht[++q]=z;
  105. z=merge(s[z][0],s[z][1]);
  106. rot=merge(merge(x,z),y);
  107. }
  108. ll re(){
  109. ll mid=(siz[rot])/2;
  110. ll x,y,ans;
  111. // cout<<sum[rot]<<endl;
  112. split_siz(rot,mid,x,y);
  113. ans=sum[y]-sum[x];
  114. rot=merge(x,y);
  115. return ans;
  116. }
  117. };
  118. treap tra,trb;
  119. node line[MAXN];
  120. ll n,k,ansz,cnt,maxz=1e9;
  121. void work1(){
  122. cout<<ansz+tra.re()<<endl;
  123. }
  124. void work2(){
  125. ll ans=tra.re();
  126. for(int i=1;i<=cnt;i++){
  127. tra.del(line[i].l),tra.del(line[i].r);
  128. trb.insert(line[i].l),trb.insert(line[i].r);
  129. ans=min(ans,tra.re()+trb.re());
  130. // cout<<i<<" "<<ans<<endl;
  131. }
  132. cout<<ans+ansz<<endl;
  133. }
  134. int main(){
  135. freopen("bridge.in","r",stdin);
  136. freopen("bridge.out","w",stdout);
  137. // k=read(),n=read();
  138. tra.mk(),trb.mk();
  139. srand((unsigned)time(0));
  140. cin>>k>>n;
  141. for(ll i=1;i<=n;i++){
  142. char sida,sidb;
  143. ll l,r;
  144. cin>>sida>>l>>sidb>>r;
  145. // if(n!=1)cout<<l<<" "<<r<<endl;
  146. if((sida=='A'&&sidb=='A')||(sida=='B'&&sidb=='B'))ansz+=abs(r-l);
  147. else{
  148. line[++cnt]={min(l,r),max(l,r)};
  149. tra.insert(l),tra.insert(r);
  150. // ansz++;
  151. }
  152. }
  153. // cout<<cnt<<endl;
  154. // debug;
  155. if(!cnt){
  156. cout<<ansz<<endl;
  157. return 0;
  158. }
  159. ansz+=cnt;
  160. sort(line+1,line+1+cnt,cmp);
  161. // for(ll i=1;i<=cnt;i++){
  162. // cout<<line[i].l<<" "<<line[i].r<<endl;
  163. // tra.insert(line[i].l),tra.insert(line[i].r);
  164. // debug
  165. // }
  166. if(k==1)work1();
  167. else work2();
  168. return 0;
  169. }