【Henu ACM Round#19 F】Dispute
阿新 • • 發佈:2018-02-01
local name cpp com 一個 pty cout clas syn
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
這一題和這一題很像 (鏈接 )
會發現如果a[i]!=b[i]那麽就按下i就好了。
然後改變和他相鄰的點。
此後a[i]再也不可能和b[i]相同了。
(其他點無論怎麽按b[i]只會變大)
但是這樣直接暴力寫會超時->O(N^2)。
則寫一個隊列。
處理和他相鄰的點的時候。
如果發現a[y]==b[y]
就重新入隊。
因為可以保證每個點最多操作一次。
所以復雜度就是O(n+m)的了。
【代碼】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
int n,m,a[N+10],b[N+10];
vector<int> g[N+10];
queue<int> dl;
int main()
{
#ifdef LOCAL_DEFINE
freopen("rush_in.txt","r",stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> m;
for (int i = 1 ;i <= m;i++){
int x,y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 1;i <= n;i++) cin>>a[i];
for (int i = 1;i <= n;i++) b[i] =0;
vector<int> v;v.clear();
for (int i = 1;i <= n;i++)
if (b[i]==a[i]){
dl.push(i);
}
while (!dl.empty()){
int x = dl.front();
dl.pop();
if (b[x]!=a[x]) continue;
v.push_back(x);
for (int y:g[x]){
b[y]++;
if (b[y]==a[y]){
dl.push(y);
}
}
}
cout<<(int)v.size()<<endl;
for (int x:v){
cout<<x<<' ';
}
return 0;
}
【Henu ACM Round#19 F】Dispute