题目
代码
基本和萍姐姐的 一模一样
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
vector<int> v[100010];
vector<int> pre[3];
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
scanf("%lld",&t);
while(t--){
int n,m,k;
scanf("%lld %lld %lld",&n,&m,&k);
for(int i=0;i<=n;i++) v[i].clear();
map<int,int> mp;
for(int i=1;i<=k;i++){
int x,y;
scanf("%lld %lld",&x,&y);
v[x].push_back(y);
}
sort(v[1].begin(),v[1].end());
pre[1].clear();
if(v[1].size()){
pre[1].push_back(1);
pre[1].push_back(v[1][0]-1);
}
else{
pre[1].push_back(1);
pre[1].push_back(m);
}
int ans=0;
for(int i=1;i<=n;i++){
sort(v[i].begin(),v[i].end());
// if(pre[i&1].size()==0) break;
pre[(i-1)&1].clear();
int la=0,pos=0;
if(v[i].size()==0){
if((int)pre[i&1].size() == 0) continue;
int l=pre[i&1][0],r=m;
pre[(i-1)&1].push_back(l);
pre[(i-1)&1].push_back(r);
ans+=r-l+1;
continue;
}
for(auto j:v[i]){
// if((int)pre[i&1].size() == 0) continue;
int l=la+1,r=j-1;
la=r+1;
if(r<l) continue;
int len=pre[i&1].size();
while(pos<len&&pre[i&1][pos+1]<l) pos+=2;
if(pos>=len) continue;
l=max(pre[i&1][pos],l);
if(l>r) continue;
pre[(i-1)&1].push_back(l);
pre[(i-1)&1].push_back(r);
ans+=r-l+1;
}
if(la<m){
int l=la+1,r=m;
if(r<l) continue;
int len=pre[i&1].size();
while(pos<len&&pre[i&1][pos+1]<l) pos+=2;
if(pos>=len) continue;
l=max(pre[i&1][pos],l);
if(l>r) continue;
pre[(i-1)&1].push_back(l);
pre[(i-1)&1].push_back(r);
ans+=r-l+1;
}
}
printf("%lld\n",ans);
}
return 0;
}