Untitled
unknown
c_cpp
3 years ago
5.3 kB
3
Indexable
/** * @Author:51D **/ #include <iostream> #include <string> #include <utility> #include <cstdlib> #include <limits> #include <cmath> #include <climits> #include <vector> #include <bits/stdc++.h> #include <set> #include <map> #include <iomanip> #include <unordered_set> #include <unordered_map> #include <iterator> #include <algorithm> #include <sstream> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //using namespace __gnu_pbds; using namespace std; typedef long long ll; #define mod 1000000007 #define inf 1e9 #define f(i,n) for(int i=0;i<n;i++) #define FIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define w(t) ll tt;cin>>tt;while(tt--) #define pb push_back #define endl "\n" #define read(arr,n) for(ll i=0;i<n;i++){cin>>arr[i];}; #define pi pair<ll,ll> #define all(arr) arr.begin(),arr.end() // template <typename T> // using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; //options: less,greater_equal,less_equal,greater void __print(int x) {cerr << x;} void __print(long x) {cerr << x;} void __print(long long x) {cerr << x;} void __print(unsigned x) {cerr << x;} void __print(unsigned long x) {cerr << x;} void __print(unsigned long long x) {cerr << x;} void __print(float x) {cerr << x;} void __print(double x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifndef ONLINE_JUDGE #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else #define debug(x...) #endif const int N=3e5+5; const long long infll = 0x3f3f3f3f3f3f3f3fLL; int p[N]; ll modulo(ll a, ll b, ll n){ ll x=1, y=a; while (b > 0) { if (b%2 == 1) { x = (x*y) % n; // multiplying with base } y = (y*y) % n; // squaring the base b /= 2; } return x % n; } ll modmod(ll a,ll b,ll c){ // Fermats Little Theorem // A^(M-1) = 1 (mod M) if M is a prime. // So write B^C as x*(M-1) + y ll y = modulo(b,c,mod-1); return modulo(a,y,mod); } ll value[1000001]; void fillNumberOfDivisorsArray(){ for(ll i=1;i<=1000000;i++){ for(ll j=1;i*j<=1000000;j++){ value[i*j]++; } } } vector<ll> prime; bool is_composite[N]; void sieve(ll n) { fill(is_composite,is_composite + n,false); for (ll i=2;i<n;i++){ if(!is_composite[i]){ prime.push_back(i); } for (int j=2;i*j < n;j++){ is_composite[i * j] = true; } } } void addEdge(vector<ll> adj[],ll u,ll v){ adj[u].pb(v); adj[v].pb(u); } ll __lcm(ll a,ll b){ return a*b/(__gcd(a,b)); } vector<ll> fact; void factorialFill(){ fact.pb(1); fact.pb(1); for(ll i=2;i<=1000000;i++){ fact.pb((i%mod * fact.back()%mod)%mod); } } ll getfact(ll num){ return fact[num]%mod; } ll getBits(ll num){ return log2(num) + 1; } struct cmp { bool operator() (const pair<int, int> &a, const pair<int, int> &b) const { return a.first < b.first; } }; /* Your observations here: */ ll getAnswer(ll mid,vector<ll>& arr,ll sum,ll k){ vector<ll> temp = arr; ll n = temp.size(); ll cnt = abs(temp[0] - mid); sum -= temp[0]; sum += mid; temp[0] = mid; if(sum<=k){ return cnt; } for(ll i=n-1;i>0;i--){ sum -= temp[i]; sum += temp[0]; if(temp[i]!=temp[0]){ cnt++; } temp[i] = temp[0]; if(sum<=k){ return cnt; } } return cnt + (sum-k); } void solve(ll tc){ ll n,k; cin>>n>>k; vector<ll> arr(n); ll sum = 0; for(ll i=0;i<n;i++){ cin>>arr[i]; sum += arr[i]; } if(sum<=k){ cout<<0<<endl; return; } // Binary on lowest number set sort(arr.begin(),arr.end()); ll l = -1e17; ll r = arr[0]; ll ans = LLONG_MAX; while(l<r){ ll mid = (l+r+1)/2; ll a1 = getAnswer(mid,arr,sum,k); ll a2 = getAnswer(mid-1,arr,sum,k); if(a2>=a1){ ans = min(ans,a1); l = mid; } else{ r = mid-1; } } cout<<ans<<endl; } int main() { FIO; #ifndef ONLINE_JUDGE freopen("debug.txt", "w", stderr); #endif ll tt; cin>>tt; for(ll i=1;i<=tt;i++){ solve(i); } return 0; }
Editor is loading...