https://codeforces.com/contest/1555
A. PizzaForces
#include <bits/stdc++.h>
using namespace std;
void solve()
{
long long n,tmp,ans;
scanf("%lld",&n);
if (n>=8) {
ans=(n+1)/2*5;
}
else {
ans=(n+5)/6*15;
}
printf("%lld\n",ans);
}
int main()
{
int ttt;
scanf("%d",&ttt);
while (ttt--) {
solve();
}
return 0;
}
B. Two Tables
#include <bits/stdc++.h>
using namespace std;
#define INF 1000000000
void solve()
{
long long W,H,x1,x2,y1,y2,w,h;
scanf("%lld%lld%",&W,&H);
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
scanf("%lld%lld",&w,&h);
long long ans=INF;
if (W-x2>=w-x1) ans=min(ans,w-x1);
if (H-y2>=h-y1) ans=min(ans,h-y1);
if (x1>=x2-W+w) ans=min(ans,x2-W+w);
if (y1>=y2-H+h) ans=min(ans,y2-H+h);
ans=max(ans,0ll);
if (ans==INF) {
puts("-1");
}
else {
printf("%lld\n",ans);
}
}
int main()
{
int ttt;
scanf("%d",&ttt);
while (ttt--) {
solve();
}
return 0;
}
C. Coin Rows
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
int m;
int a[5][MAXN];
void solve()
{
scanf("%d",&m);
vector<int> U(m+5),D(m+5);
for (int i=1; i<=2; i++)
for (int j=1; j<=m; j++)
scanf("%d",&a[i][j]);
for (int i=m; i>0; i--)
U[i]=U[i+1]+a[1][i];
for (int i=1; i<=m; i++)
D[i]=D[i-1]+a[2][i];
int ans=2147483647,tmp;
for (int i=1; i<=m; i++) {
tmp=max(U[i+1],D[i-1]);
ans=min(tmp,ans);
}
printf("%d\n",ans);
}
int main()
{
int ttt;
scanf("%d",&ttt);
while (ttt--) {
solve();
}
return 0;
}
D. Say No to Palindromes
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200005
int n,m;
char s[MAXN];
int num[3][3][MAXN];
int tnum[3][3];
int vis[3];
int ans;
void dfs(int dep, int pnum)
{
if (dep==3) {
if (ans==-1 || ans> pnum)
ans=pnum;
return;
}
for (int i=0; i<3; i++) if (!vis[i]) {
vis[i]=1;
dfs(dep+1,pnum+tnum[dep][(i+1)%3]+tnum[dep][(i+2)%3]);
vis[i]=0;
}
}
void solve()
{
scanf("%d%d",&n,&m);
scanf("%s",s+1);
for (int i=1; i<=n; i++) {
num[i%3][s[i]-'a'][i]++;
for (int x=0; x<3; x++)
for (int y=0; y<3; y++)
num[x][y][i]+=num[x][y][i-1];
}
memset(vis,0,sizeof(vis));
for (int i=0; i<m; i++) {
int l,r;
scanf("%d%d",&l,&r);
for (int j=0; j<3; j++)
for (int k=0; k<3; k++)
tnum[j][k]=num[j][k][r]-num[j][k][l-1];
ans=-1;
dfs(0,0);
printf("%d\n",ans);
}
}
int main()
{
solve();
return 0;
}
E. Boring Segments
滑动窗口加线段树维护即可。
注意一下断点至少被覆盖两次,所以右端点减一。
#include <bits/stdc++.h>
using namespace std;
#define MAXM 100005
#define MAXN 3000005
#define Lp ((p)<<1)
#define Rp (((p)<<1)|1)
struct node {
int l,r,v;
};
node t[MAXN<<2];
int tag[MAXN<<2];
void bui(int p, int l, int r)
{
t[p].l=l;
t[p].r=r;
t[p].v=0;
if (l>=r) return;
bui(Lp,l,(l+r)>>1);
bui(Rp,((l+r)>>1)+1,r);
}
void add(int p, int l, int r, int val)
{
if (l<=t[p].l && t[p].r<=r) {
t[p].v+=val;
tag[p]+=val;
return;
}
int mid=(t[p].l+t[p].r)>>1;
if (l<=mid) add(Lp,l,r,val);
if (r>mid) add(Rp,l,r,val);
t[p].v=tag[p]+min(t[Lp].v,t[Rp].v);
}
int n,m;
node a[MAXN];
int ans;
bool cmp(node &x, node &y)
{
return x.v<y.v;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=0; i<n; i++)
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
sort(a,a+n,cmp);
//右端点减一是因为要保证起码端点的位置被覆盖至少两次
bui(1,1,m-1);
vector<int> s(m+5);
ans=2147483647;
int ll=0,rr;
for (rr=0; rr<n; rr++) {
add(1,a[rr].l,a[rr].r-1,1);
while (t[1].v) {
ans=min(ans,a[rr].v-a[ll].v);
add(1,a[ll].l,a[ll].r-1,-1);
ll++;
}
}
printf("%d\n",ans);
return 0;
}