Educational Codeforces Round 95 (Rated for Div. 2) A-D
阿新 • • 發佈:2020-09-16
A
計算出總的stick數目tot, ⌈(tot-1)/(k-1)⌉即可
#include "bits/stdc++.h" using namespace std; #define all(v) (v).begin(), (v).end() #define io ios::sync_with_stdio(0) #define rep(i, a, b) for (int i = a; i <= b; i++) #define rson rt << 1 | 1, mid + 1, r #define lson rt << 1, l, mid #define lll __int128 #define lowbit(i) ((-i) & (i)) #define pii pair<int, int> #define fi first #define se second #define mp make_pair #define pb push_back #define int long long template<class T>void read(T &x) { x=0; int f=0; char ch=getchar(); while(ch<'0'||ch>'9') { f|=(ch=='-'); ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } x=f?-x:x; return; } #define ull unsigned long long #define eps 1e-12 #define sc(x) scanf("%lld", &(x)) #define mem(a,b) memset(a,b,sizeof(a)) #define endl "\n" #define inf 0x3f3f3f3f #define ll long long #define dbug cout<<"here\n"; #define int long long const int mod = 1e9+7; const int maxn=5e5+10; int n; void work() { int x,y,k; cin>>x>>y>>k; int ans=0; ans+=k; int tot=0; tot+=k*y+k; ans+=(tot-1 +x-1-1)/(x-1); cout<<ans<<endl; } signed main() { int t;cin>>t; while(t--) work(); }
B
對於不固定的數,從小到大排序即可
#include "bits/stdc++.h" using namespace std; #define all(v) (v).begin(), (v).end() #define io ios::sync_with_stdio(0) #define rep(i, a, b) for (int i = a; i <= b; i++) #define rson rt << 1 | 1, mid + 1, r #define lson rt << 1, l, mid #define lll __int128 #define lowbit(i) ((-i) & (i)) #define pii pair<int, int> #define fi first #define se second #define mp make_pair #define pb push_back #define int long long template<class T>void read(T &x) { x=0; int f=0; char ch=getchar(); while(ch<'0'||ch>'9') { f|=(ch=='-'); ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } x=f?-x:x; return; } #define ull unsigned long long #define eps 1e-12 #define sc(x) scanf("%lld", &(x)) #define mem(a,b) memset(a,b,sizeof(a)) #define endl "\n" #define inf 0x3f3f3f3f #define ll long long #define dbug cout<<"here\n"; #define int long long const int mod = 1e9+7; const int maxn=5e5+10; int cmp(int a,int b) { return a>b; } int n; int arr[maxn],vis[maxn]; int a[maxn],b[maxn]; int p[maxn]; void work() { read(n); rep(i,1,n) read(arr[i]); rep(i,1,n) read(vis[i]); int la=0,lb=0; rep(i,1,n) { if(vis[i]==1) a[++la]=arr[i]; else b[++lb]=arr[i]; } sort(b+1,b+1+lb,cmp); p[0]=0; rep(i,1,la) { p[i]=p[i-1]+a[i]; } int l=1,r=1; for(int i=1;i<=n;i++) { if(vis[i]) printf("%lld",arr[i]); else printf("%lld",b[l++]); printf("%c",i==n?'\n':' '); } } signed main() { int t;cin>>t; while(t--) work(); }
C
二維dp[i][j]代表在第i位是由第j個玩家打boss, 轉移很好推, 如程式碼.
ps:也可以特判第一位, 然後找[2,n]中有幾個111的出現
#include "bits/stdc++.h" using namespace std; #define all(v) (v).begin(), (v).end() #define io ios::sync_with_stdio(0) #define rson rt << 1 | 1, mid + 1, r #define lson rt << 1, l, mid #define lll __int128 #define lowbit(i) ((-i) & (i)) #define pii pair<int, int> #define fi first #define se second #define mp make_pair #define pb push_back #define rep(i, a, b) for (int i = a; i <= b; i++) #define urep(i, x, y) for(int i=x;i>=y;i--) template<class T>void read(T &x) { x=0; int f=0; char ch=getchar(); while(ch<'0'||ch>'9') { f|=(ch=='-'); ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } x=f?-x:x; return; } #define ull unsigned long long #define eps 1e-12 #define sc(x) scanf("%lld", &(x)) #define mem(a,b) memset(a,b,sizeof(a)) #define endl "\n" #define inf 0x3f3f3f3f #define ll long long #define dbug cout<<"here\n"; #define int long long const double PI = acos(-1.0); const int mod = 1e9+7; const int maxn=5e5+10; void Prime(int prime[],int visit[],int ed) { mem(visit,0); mem(prime,0); for (int i = 2;i <= ed; i++) { if (!visit[i]) { prime[++prime[0]] = i; } for (int j = 1; j <=prime[0] && i*prime[j] <= ed; j++) { visit[i*prime[j]] = 1; if (i % prime[j] == 0) { break; } } } } int prime[maxn]; int visit[maxn]; int a[maxn]; int b[maxn]; int n; int dp[maxn][3]; void work() { read(n); rep(i,1,n) read(a[i]); rep(i,1,n) dp[i][1]=dp[i][2]=inf; dp[0][1]=dp[0][2]=0; rep(i,1,n) { dp[i][1]=min(dp[i][1],dp[i-1][2]+(a[i]==1)); if(i>=2) { dp[i][1]=min(dp[i][1],dp[i-2][2]+(a[i-1]==1)+(a[i]==1)); } if(i!=1) { dp[i][2]=min(dp[i][2],dp[i-1][1]); if(i>=3) { dp[i][2]=min(dp[i][2],dp[i-2][1]); } } } printf("%lld\n",min(dp[n][1],dp[n][2])); } signed main() { int t; read(t); while(t--) work(); }
D
用multiset,原序列q和維護差分p,ans就是max(q)-min(q)-max(p)
#include "bits/stdc++.h"
using namespace std;
#define all(v) (v).begin(), (v).end()
#define io ios::sync_with_stdio(0)
#define rson rt << 1 | 1, mid + 1, r
#define lson rt << 1, l, mid
#define lll __int128
#define lowbit(i) ((-i) & (i))
#define pii pair<int, int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define urep(i, x, y) for(int i=x;i>=y;i--)
template<class T>void read(T &x)
{
x=0;
int f=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
f|=(ch=='-');
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x=f?-x:x;
return;
}
#define ull unsigned long long
#define eps 1e-12
#define sc(x) scanf("%lld", &(x))
#define mem(a,b) memset(a,b,sizeof(a))
#define endl "\n"
#define inf 0x3f3f3f3f
#define ll long long
#define dbug cout<<"here\n";
#define int long long
const double PI = acos(-1.0);
const int mod = 1e9+7;
const int maxn=5e5+10;
void Prime(int prime[],int visit[],int ed)
{
mem(visit,0);
mem(prime,0);
for (int i = 2;i <= ed; i++) {
if (!visit[i]) {
prime[++prime[0]] = i;
}
for (int j = 1; j <=prime[0] && i*prime[j] <= ed; j++) {
visit[i*prime[j]] = 1;
if (i % prime[j] == 0) {
break;
}
}
}
}
int prime[maxn];
int visit[maxn];
int a[maxn];
void work()
{
int n,m;
read(n),read(m);
multiset<int>q,p;
rep(i,1,n) read(a[i]);
sort(a+1,a+1+n);
int ans=0;
rep(i,1,n)
{
q.insert(a[i]);
if(i>1)
{
ans+=a[i]-a[i-1];
p.insert(a[i]-a[i-1]);
}
}
if(p.size()>=1)
cout<<ans-*(--p.end())<<endl;
else cout<<ans<<endl;
while(m--)
{
int cmd,val;
read(cmd),read(val);
if(cmd==1)
{
if(q.empty())
{
q.insert(val);
}
else
{
auto l=q.lower_bound(val);
auto r=q.upper_bound(val);
if(val > *(--q.end()))
{
p.insert(val - *(--q.end()));
ans+=val - *(--q.end());
}
else if(val < *q.begin())
{
p.insert(*q.begin() - val);
ans+=*q.begin()-val;
}
else
{
--l;
int del=*r-*l;
p.erase(p.lower_bound(del));
p.insert(*r-val);
p.insert(val-*l);
}
q.insert(val);
}
}
else
{
auto pos=q.lower_bound(val);
if(val==*q.begin())
{
int temp;
if(q.size() > 1)
{
temp=*(++q.begin())-*q.begin();
p.erase(p.lower_bound(temp));
ans-=temp;
}
q.erase(q.lower_bound(val));
}
else if(val==(*--q.end()))
{
if(q.size() > 1)
{
int temp=*(--q.end()) - *(--(--q.end()));
p.erase(p.lower_bound(temp));
ans-=temp;
}
q.erase(q.lower_bound(val));
}
else
{
auto l = --pos;
auto r = ++(++pos);
pos--;
p.erase(p.lower_bound(*r-*pos));
p.erase(p.lower_bound(*pos-*l));
p.insert(*r-*l);
q.erase(q.lower_bound(val));
}
}
if(p.size() >= 1)
cout<<ans-*(--p.end())<<endl;
else cout<<ans<<endl;
}
}
signed main()
{
work();
}