团队训练记录2024.10.5

这次double精度上卡了,赛时和学校强队差两题
题目链接:https://codeforces.com/gym/104023/problem

A. Dunai

队友写的,答案在总冠军位人数和位置上冠军加非冠军人数最小取min?

#include<bits/stdc++.h>
#define test(i) cout << #i << " "<< i << " " << endl;
#define endl '\n'

using namespace std;
typedef long long ll;

const int INF=0x3f3f3f3f;
const int N=2e5+5;

ll t,n;

ll cnt[10];
ll cnt1[10];
map<string,ll> mp;//队伍数量
map<string,ll> vis;

void fio(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

signed main()
{
	fio();
	ll m,num;
	cin >> n;
	string str,name;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=5; j++){
			cin >> name;
			vis[name]++;
		}
	}
	cin >> m;
	for(int i=1; i<=m; i++){
		cin >> str >> num;
		if(vis[str]) cnt1[num]++;
		else cnt[num]++;
	}
	ll ans=0;
	ll tmp=1e9+1;
	for(int i=1; i<=5; i++){
		ans+=cnt1[i];
		tmp=min(cnt1[i]+cnt[i],tmp);
	}
	cout << min(ans,tmp) << endl;
	return 0;
}

C. Grass

选四个点然后暴力一个点即可,不可用斜率做,这里用了gcd写法

#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
struct s
{
    ll x,y;
}p[25020];
ll gcd(ll x,ll y)
{
    if(y==0)
    return x;
    else
    return gcd(y,x%y);
}
bool check(ll a,ll b,ll c,ll d,ll e)
{
    ll g[5]={b,c,d,e};
    set<ll>k1;
    set<pair<ll,ll>>f;
    map<pair<ll,ll>,set<ll>>uo;
    for(ll i=0;i<4;i++)
    {
        if(p[g[i]].x==p[a].x)//垂直
        {
            k1.insert(p[g[i]].y);
        }
        else
        {
            ll u=p[a].y-p[g[i]].y;
            ll z=p[a].x-p[g[i]].x;
            ll op=gcd(abs(u),abs(z));
            if(u==0)
            z=0;
            else
            {
                u/=op;
                z/=op;
            }
            f.insert({u,z});
            uo[{u,z}].insert(p[g[i]].x);
        }
    }
    ll pd=0;
    ll ans=0,cnt=0;
    for(auto j:k1)
    {
        if(j>p[a].y)
        ans++;
        else
        cnt++;
    }
    if(ans>1||cnt>1)
    pd=1;
   // ans=0,cnt=0;
    for(auto j:f)
    {
        ans=0,cnt=0;
        for(auto k:uo[j])
        {
            if(k<p[a].x)
            ans++;
            else
            cnt++;
        }
        if(ans>1||cnt>1)
        pd=1;
    }
    if(pd)
    return 0;
    else
    return 1;
}
int main()
{
    ll t;
    cin>>t;
   // cout<<gcd(-5,-1)<<endl;
    while(t--)
    {
        ll n;
        cin>>n;
        for(ll i=1;i<=n;i++)
        {
            cin>>p[i].x>>p[i].y;
        }
        if(n<5)
        {
            cout<<"NO"<<endl;
            continue;
        }
         ll op=0;
          ll d[10]={0,1,2,3,4};
        for(ll i=5;i<=n;i++)
        {
            d[1]=1;
            d[2]=2;
            d[3]=3;
            d[4]=4;
            d[5]=i;
            for(ll j=1;j<=5;j++)
            {
                swap(d[1],d[j]);
                if(check(d[1],d[2],d[3],d[4],d[5]))
                {
                    op=1;
                }
                if(op)
                break;
            }
           if(op)
            break;
        }
        if(op==0)
        {
            cout<<"NO"<<endl;
        }
        else
        {
            cout<<"YES"<<endl;
            for(ll i=1;i<=5;i++)
            {
                cout<<p[d[i]].x<<" "<<p[d[i]].y<<endl;
            }
        }
    }
}

E. Python Will be Faster than C++

队友写的

#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
typedef  long long ll;
typedef char ElemType;
void fio()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}

ll n, k;
ll a[100];
int main() {
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		if (a[i] < k) {
			cout << "Python 3."<<i<<" will be faster than C++"<<endl;
			return 0;
		}
	}
	if (a[n] >= a[n - 1]) {
		cout << "Python will never be faster than C++"<<endl;
	}
	else {
		if (a[n] == k) {
			cout<< "Python 3." << n+1 << " will be faster than C++" << endl;
		}
		else {
			ll ans = (a[n] - k) / (a[n-1] - a[n]) + 1;
			cout << "Python 3." << n+ans << " will be faster than C++" << endl;
		}
	}
}

G. Grade 2

打表得规律

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll x,ll y)
{
    if(y==0)
    return x;
    else
    return gcd(y,x%y);
}
map<ll,ll>q;
ll a[2550];
ll g[2500000];
int main()
{
ll x,n;
cin>>x>>n;
ll cnt=0;
ll u=x;
//ll j=*lower_bound(a+1,a+1+cnt,x);
for(ll i=1;i<=31;i++)
{
    q[1ll<<i]++;
    cnt++;
    a[cnt]=1ll<<i;
}
ll j=*lower_bound(a+1,a+1+cnt,x);
for(ll i=1;i<=j;i++)
{
    g[i]=0;
}
for(ll i=1;i<=j;i++)
{
    g[i]=g[i-1]+(gcd(((i*x)^x),x)==1);
}
x=j-1;
while(n--)
{
    ll l,r;
    cin>>l>>r;
    if(q[u]>0)
    {
        cout<<0<<endl;
    }
    else
    {
        
            ll u=(l-1)/(x+1);
            ll l1=1+u*(x+1);//左边周期
            ll k=(r-1)/(x+1);
            ll r1=(x+1)+(k)*(x+1);
        // cout<<u<<" "<<l1<<" "<<k<<" "<<r1<<endl;
     //   cout<<g[l-1-l1+1]<<endl;
            cout<<(k-u+1)*(g[x+1])-g[l-1-l1+1]-(g[x+1]-g[((x+1)-(r1-r))])<<endl;
    }
}
}

I. Dragon Bloodline

优先队列+二分+unsigned long long

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef unsigned long long ll;
ll a[50010];
long long  b[30];
ll c[30];
ll n, k;
bool ck(long long  x)
{
    priority_queue<ll>q;
    for (ll i = 1; i <= n; i++)
    {
        q.push((ll)a[i] * x);
    }
    while (!q.empty())
    {
        int ans = 0;
        ll op = q.top();
        for (ll j = k; j >= 1; j--)
        {
            if (c[j] > 0)
            {
                if (op <= b[j])
                {
                    c[j]--;
                    q.pop();
                }
                else
                {
                    ll u = op / b[j];
                    u = min(u, c[j]);
                    op -= u * b[j];
                    c[j] -= u;
                    q.pop();
                    if (op > 0)
                        q.push(op);
                }
                break;
            }
            else
                ans++;
        }
        if (ans == k)
            break;
    }
    if (q.size() == 0)
    {
        return 1;
    }
    else
        return 0;
}
ll d[25];
int main()
{
    ll t;
    cin >> t;
    while (t--)
    {
        cin >> n >> k;
        for (ll i = 1; i <= n; i++)cin >> a[i];
        for (int i = 1; i <= k; i++)
        {
            cin >> c[i];
            d[i] = c[i];
            b[i] = (1ll << (i - 1));
        }
        long long  l = 1, r = 1e18;
        while (l <= r)
        {
            for (ll i = 1; i <= k; i++)c[i] = d[i];
            long long  mid = (l + r) >> 1;
            if (ck(mid))
                l = mid + 1;
            else
                r = mid - 1;
        }
        cout << r << endl;
    }
}

J. Eat, Sleep, Repeat

双端队列模拟

#include<map>
#include<iostream>
#include<set>
#include<deque>
using namespace std;
typedef long long ll;
void fio()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
ll gcd(ll x, ll y)
{
    if (y == 0)
        return x;
    else
        return gcd(y, x % y);
}
map<ll, ll>q, e;
ll a[255000];
ll g[250000];
set<pair<ll, ll>>f;
int main()
{
    fio();
    ll t;
    cin >> t;
    while (t--)
    {
        f.clear();
        q.clear();
        e.clear();
        ll n, m;
        cin >> n >> m;
        for (ll i = 1; i <= n; i++)
        {
            cin >> a[i];
            q[a[i]]++;
        }
        for (ll i = 1; i <= m; i++)
        {
            ll x, y;
            cin >> x >> y;
            f.insert({ x,y });
            e[x]++;
        }
        for (ll i = 1; i <= n; i++)
        {
            if (e[a[i]] == 0)
            {
                e[a[i]]++;
                f.insert({ a[i],(1e16 + 1) });
            }
        }
        ll u = -1;
        deque<pair<ll, ll>>lo;
        if (e[0] == 0)
        {
            e[0]++;
            f.insert({ 0,1e16 + 1 });
        }
        ll ans = 0;
        ll cnt = -99999999999999;
        for (auto j : f)
        {
            if (q[j.first] > j.second)
            {
                ans = 0;
                break;
            }
            //cout<<j.first<<" "<<j.second<<endl;
            cnt++;
            if (cnt > 0 && j.first != cnt)
            {
                lo.push_back({ 1e16 + 5,cnt });
                cnt = -9999999999999;
            }
            if (lo.empty())
            {
                ll op = j.second - q[j.first];
                q[j.first] = 0;
                if (op > 0)
                {
                    lo.push_back({ op,j.first });
                }
                cnt=j.first;
                continue;
            }
            if (j.second != 0)
            {
                while (!lo.empty())
                {
                    if (lo.front().first >= q[j.first])
                    {
                        ll c = lo.front().second;
                        ll k = lo.front().first - q[j.first];
                        cnt = j.first;
                        ans += q[j.first] * (j.first - lo.front().second);
                        q[j.first] = 0;
                        lo.pop_front();
                        if (k != 0)
                        {
                            lo.push_front({ k,c });
                        }
                        lo.push_back({ j.second,j.first });
                        break;
                    }
                    else
                    {
                        ll c = lo.front().second;
                        ll k = -lo.front().first + q[j.first];
                        cnt = j.first;
                        ans += lo.front().first * (j.first - lo.front().second);
                        q[j.first] = k;
                        lo.pop_front();
                    }
                    if(lo.empty())
                    {
                            ll op = j.second - q[j.first];
                            lo.push_back({ op,j.first });
                            cnt = j.first;
                            break;
                    }
                }
            }
            else
            {
                lo.clear();
                cnt = j.first;
                continue;
            }
        }
     //cout << ans << endl;
        if (ans % 2 == 0)
        {
            cout << "FuuFuu" << endl;
        }
        else
            cout << "Pico" << endl;
    }
}
posted @ 2024-10-05 20:11  长皆  阅读(5)  评论(0编辑  收藏  举报