比赛 |
20241127 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
魔法传送阵 |
最终得分 |
100 |
用户昵称 |
flyfree |
运行时间 |
12.897 s |
代码语言 |
C++ |
内存使用 |
95.89 MiB |
提交时间 |
2024-11-27 10:55:04 |
显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define MAXN 1000010
- #define debug cout<<"flyfree\n";
- inline ll read(){
- ll x=0,f=1;
- char c=getchar();
- while(c<'0'||c>'9'){
- if(c=='-')f=-1;
- c=getchar();
- }
- while(c>='0'&&c<='9'){
- x=x*10+c-'0';
- c=getchar();
- }
- return x*f;
- }
- struct node{
- ll l,r;
- };
- bool cmp(node a,node b){
- return (a.l+a.r)<(b.l+b.r);
- }
- struct treap{
- ll idx,rot,q;
- ll s[MAXN][2],val[MAXN],siz[MAXN],sum[MAXN],key[MAXN],sht[MAXN];
- void mk(){
- memset(s,0,sizeof(s));
- memset(val,0,sizeof(val));
- memset(siz,0,sizeof(siz));
- memset(sum,0,sizeof(sum));
- memset(key,0,sizeof(key));
- rot=0,idx=0;
- }
- ll newnode(ll x){
- ll now;
- if(q){
- now=sht[q--];
- }else now=++idx;
- val[now]=sum[now]=x;
- s[now][0]=s[now][1]=0;
- siz[now]=1;
- key[now]=rand();
- return now;
- }
- void push_up(ll p){
- sum[p]=val[p]+sum[s[p][0]]+sum[s[p][1]];
- siz[p]=siz[s[p][0]]+siz[s[p][1]]+1;
- }
- void split_val(ll p,ll v,ll &x,ll &y){
- // cout<<p<<endl;
- if(!p){
- x=y=0;
- return;
- }
- if(val[p]<=v){
- x=p;
- split_val(s[p][1],v,s[p][1],y);
- }else{
- y=p;
- split_val(s[p][0],v,x,s[p][0]);
- }
- push_up(p);
- }
- void split_siz(ll p,ll k,ll &x,ll &y){
- if(!p){
- x=y=0;
- return;
- }
- if(siz[s[p][0]]<k){
- x=p;
- split_siz(s[p][1],k-siz[s[p][0]]-1,s[p][1],y);
- }else{
- y=p;
- split_siz(s[p][0],k,x,s[p][0]);
- }
- push_up(p);
- }
- ll merge(ll x,ll y){
- if(!x||!y)return x|y;
- if(key[x]<=key[y]){
- s[x][1]=merge(s[x][1],y);
- push_up(x);
- return x;
- }else{
- s[y][0]=merge(x,s[y][0]);
- push_up(y);
- return y;
- }
- }
- void insert(ll v){
- ll x,y,z;
- split_val(rot,v,x,y);
- // debug
- z=newnode(v);
- rot=merge(merge(x,z),y);
- }
- void del(ll v){
- ll x,y,z;
- split_val(rot,v,x,y);
- split_val(x,v-1,x,z);
- // siz[z]=val[z]=sum[z]=0;
- sht[++q]=z;
- z=merge(s[z][0],s[z][1]);
- rot=merge(merge(x,z),y);
- }
- ll re(){
- ll mid=(siz[rot])/2;
- ll x,y,ans;
- // cout<<sum[rot]<<endl;
- split_siz(rot,mid,x,y);
- ans=sum[y]-sum[x];
- rot=merge(x,y);
- return ans;
- }
- };
- treap tra,trb;
- node line[MAXN];
- ll n,k,ansz,cnt,maxz=1e9;
- void work1(){
- cout<<ansz+tra.re()<<endl;
- }
- void work2(){
- ll ans=tra.re();
- for(int i=1;i<=cnt;i++){
- tra.del(line[i].l),tra.del(line[i].r);
- trb.insert(line[i].l),trb.insert(line[i].r);
- ans=min(ans,tra.re()+trb.re());
- // cout<<i<<" "<<ans<<endl;
- }
- cout<<ans+ansz<<endl;
- }
- int main(){
- freopen("bridge.in","r",stdin);
- freopen("bridge.out","w",stdout);
- // k=read(),n=read();
- tra.mk(),trb.mk();
- srand((unsigned)time(0));
- cin>>k>>n;
- for(ll i=1;i<=n;i++){
- char sida,sidb;
- ll l,r;
- cin>>sida>>l>>sidb>>r;
- // if(n!=1)cout<<l<<" "<<r<<endl;
- if((sida=='A'&&sidb=='A')||(sida=='B'&&sidb=='B'))ansz+=abs(r-l);
- else{
- line[++cnt]={min(l,r),max(l,r)};
- tra.insert(l),tra.insert(r);
- // ansz++;
- }
- }
- // cout<<cnt<<endl;
- // debug;
- if(!cnt){
- cout<<ansz<<endl;
- return 0;
- }
- ansz+=cnt;
- sort(line+1,line+1+cnt,cmp);
- // for(ll i=1;i<=cnt;i++){
- // cout<<line[i].l<<" "<<line[i].r<<endl;
- // tra.insert(line[i].l),tra.insert(line[i].r);
- // debug
- // }
- if(k==1)work1();
- else work2();
- return 0;
- }