题解 P3913 【车的攻击】

· · 题解

前言

大体思路

代码

//P3913 车的攻击        
//submit 3             
//By sxt on 2020.4.6         
#include<bits/stdc++.h>             

#define rg register int                 
#define il inline             
#define in read()                       
#define _num(x) (x >= '0' && x <= '9')   
#define ql(x) memset(x, 0, sizeof(x))   
#define mid ((l + r) >> 1)   
#define el else if     

using namespace std;   

typedef long long ll;   

const int N = 1e6+3;   

il int read(){      
    int x=0,f=1;          
    char ch=getchar();    
    while(!_num(ch)){     
        if(ch=='-')     
            f=-1;      
        ch=getchar();     
    }                
    while(_num(ch)){     
        x=x*10+ch-'0';     
        ch=getchar();     
    }           
    return x*f;               
}                         

char f[20];               
int cnt;                   

il void pint(ll x){              
    if(x == 0){ putchar('0'), putchar('\n'); return ;}            
    cnt = 0;          
    while(x > 0){                   
        f[cnt++] = x % 10 + '0';         
        x /= 10;     
    }     
    while(cnt > 0) putchar(f[--cnt]);   
    putchar('\n');   
    return ;   
}   

int n, m, x, y, a[N], b[N], nowl, nowr, pa[N], pb[N], qa[N], qb[N], k;   
ll ans;     

il int check(int se[], int xx){   
    rg l = 1, r = m;    
    while(l < r - 1){     
        if(xx < se[mid]) r = mid - 1;  
        el(xx > se[mid]) l = mid + 1;  
        else r = mid;    
    }    
    if(se[l] == xx) return l;    
    return r;    
}     

signed main()    
{      
    //freopen("1.txt", "r", stdin);    
    n = in, k = m = in;     
    while(k--){     
        pa[m - k] = a[m - k] = in, pb[m - k] = b[m - k] = in;    
    }     
        //离散化    
    sort(pa + 1, pa + m + 1);     
    sort(pb + 1, pb + m + 1);     
    for(rg i = 1; i <= m; ++ i){    
        a[i] = check(pa, a[i]);   
        b[i] = check(pb, b[i]);   
    }                   
        //离散完成             
        //下面依次加入每一个车        
    for(rg i = 1; i <= m; ++ i){        
        x = a[i], y = b[i];      
        nowl += 1 - qa[x];        
        nowr += 1 - qb[y];      
            //这里注意一下顺序,本行的上下最好不要颠倒,颠倒的话最底下那个if需要做些调整。不懂可以手完一下。         
        if(!qa[x]){     
            ans += n - nowr;     
        }          
        if(!qb[y]){        
            ans += n - nowl;    
        }     
        if(!qb[y] && !qa[x]) ++ ans;   
        qb[y] = 1, qa[x] = 1;    
    }          
    pint(ans);    
    return 0;    
}        
THE\ ·\ END.