1. 程式人生 > >【Henu ACM Round#19 F】Dispute

【Henu ACM Round#19 F】Dispute

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