AcWing 5722. 十滴水csp33(4)
原题链接
困难
作者:
YAX_AC
,
2024-11-22 14:20:34
,
所有人可见
,
阅读 18
#include<bits/stdc++.h>
using namespace std;
const int N = 300010;
typedef pair<int,int> PII;
int c,m,n;
int l[N],r[N];
PII a[N];
map<int,int> _;
bool st[N];
void remove(int p)//在双链表中删掉p节点
{
r[l[p]] = r[p];
l[r[p]] = l[p];
}
//每次确定了p节点一定要被删掉,才会递归erase(p) 函数
void erase(int p)// 处理 p 节点以及后续的递归操作
{
st[p] = true;
int ll = l[p],rr = r[p];
remove(p);
m--;
if(ll!=-1) a[ll].second++;
if(rr!=-1) a[rr].second++;
if(ll!=-1 && !st[ll] && a[ll].second >= 5) erase(ll);
if(rr!=-1 && !st[rr] && a[rr].second >= 5) erase(rr);
}
//快读
template<typename tn> void read(tn &n)
{
tn s=0,flag=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') flag=-1;
for(;'0'<=ch&&ch<='9';ch=getchar()) s=s*10+ch-'0';
if(ch=='.')
{
ch=getchar();
tn r=0,R=1;
for(;'0'<=ch&&ch<='9';ch=getchar()) r=r*10+ch-'0',R*=10;
s+=r/R;
}
n=s*flag;
}
int main()
{
read(c),read(m),read(n);
for(int i = 1; i<=m; i++) read(a[i].first),read(a[i].second);
sort(a+1,a+1+m,[&](PII x,PII y)
{
return x.first<y.first;
});
for(int i = 1; i<=m; i++) _[a[i].first] = i;//离散化对应的值
for(int i = 1; i<=m; i++)
{
l[i] = i-1;
r[i] = i+1;
}
l[1] = 1;
r[m] = -1;
while(n--)
{
int p;read(p);
//将p映射回离散后的值
p = _[p];
a[p].second++;//该位置水滴加1
if(p!=-1 && a[p].second >= 5 && !st[p]) erase(p);
cout<<m<<endl;
}
return 0;
}