Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pair<int,int> deg[500]; // {degree, index}
- void run(){
- int n; cin>>n;
- for (int i=0; i<=n; i++) cin>>deg[i].first, deg[i].second=i+1;
- sort(deg,deg+n);
- vector<int> res;
- for (int i=0; i<=n; i++){
- ll sum=0;
- ll capsum=0;
- // copy in degrees in decreasing order
- vector<int> all;
- for (int j=n; j>=0; --j) if (i!=j) all.push_back(deg[j].first), sum+=deg[j].first;
- // check that degree sum is even
- if (sum%2!=0) continue;
- bool ok=true;
- ll capgt=-1; // number of items greater than the cap
- for (int k=n; k>=1; k--){
- // update sums of deg[1..k]
- if (k<n){
- sum-=all[k];
- }
- // update sums of min(deg[k+1..n],k)
- if (k<n){
- if (all[k]>k) capgt=max(capgt, (ll)(k+1));
- if (capgt!=-1){
- while (capgt<n and all[capgt]>k) ++capgt;
- capsum-=(capgt-k);
- }
- capsum+=min(all[k],k+1);
- }
- // check erdos-gallai theorem holds
- ok &= (sum <= k*(k-1) + capsum);
- }
- if (ok) res.push_back(deg[i].second);
- }
- sort(res.begin(),res.end());
- cout<<res.size()<<endl;
- for (int i=0; i<res.size(); i++) cout<<res[i]<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement