你说得对,但是这是哪门子的 3500
幽默远古 3500。
思淺路析:
考虑对
看到判断出现次数的奇偶性,立马想到异或哈希,由于出现次数是奇数和没有出现这两个条件在异或下是相反的,考虑将出现次数奇数简单地转化为出现次数偶数(即异或和为
考虑有值区间
由于
去除空区间维护一个指针表示我及之前的最长
视哈希表复杂度
参考代码:
#include<bits/stdc++.h>
#define ll long long
#define un unsigned
using namespace std;
ll n,m;
random_device my;
mt19937_64 rd(my());
un ll pre[200005],af[200005];
ll cot[200005],cnt[200005];
unordered_map<un ll,pair<ll,ll>>sum;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;++i)
{
ll l,r;
cin>>l>>r;
un ll val=rd();
pre[l]^=val;
af[r]^=val;
++cot[l];--cot[r+1];
}
un ll res=0;
for(ll i=1;i<=m;++i)
{
cot[i]+=cot[i-1];
res^=pre[i];
pre[i]=(pre[i-1]^res^pre[i]);
res^=af[i];
}
ll r=0,ans=0;
for(ll i=1;i<=m;++i)
{
cnt[i]+=cnt[i-1]+cot[i];
++sum[pre[i]].first;
sum[pre[i]].second+=i-1;
if(cot[i])r=i;
else while(cnt[i]-cnt[r+1])++r;
ans+=sum[pre[i]].first*i-sum[pre[i]].second-(i-r)*(i-r+1)/2;
}
cout<<ans;
}