AcWing 5722. 十滴水(链表+递归)
原题链接
困难
作者:
BoBolilla
,
2024-09-10 08:59:00
,
所有人可见
,
阅读 32
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int N = 3e5+10;
int sum,n,m; //sum记录当前还剩有水的格子数量
bool st[N];
struct Node
{
int p,w; //p是当前该点在格子中的位置,w为水量
int pre,nxt;
bool operator< (const Node &b) const
{
return p<b.p;
}
}a[N];
void find(int x)
{
if(x<1||x>m||st[x]) return; //如果这个点不在链表内或者已经被消除过则返回
if(a[x].w<4) a[x].w++; //不满4直接加水
else
{
a[a[x].pre].nxt=a[x].nxt; //到5把当前点消去并find该点前驱和后继
a[a[x].nxt].pre=a[x].pre;
st[x]=1; //消除过标记
sum--;
find(a[x].pre);find(a[x].nxt);
}
}
void solve(){
int k;cin >> n >> m >> k;
sum = m;
for(int i=1;i<=m;i++)
{
cin >> a[i].p >> a[i].w;
}
sort(a+1,a+m+1); //按照格子位置排序
map<int,int> idx; //记录每个点在链表中的位置
for(int i=1;i<=m;i++)
{
a[i].pre = i-1; //将链表串起来
a[i].nxt = i+1;
idx[a[i].p]=i;
}
while(k--)
{
int o;cin >> o;
int x = idx[o];
find(x);
cout << sum << endl;
}
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
solve();
return 0;
}