這次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;
}
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;
}
}