A - City Day
#include <cstdio>
int a[100500];
signed main() {
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i+10]);
}
for(int i=10;i>=1;i--) {
a[i]=a[i+1]+1;
}
for(int i=n+11;i<=n+20;i++) {
a[i] = a[i-1]+1;
}
n+=20;
int l=0,r=0;
for(int i=11;i<=n;i++) {
int flag=1;
for(int j=1;j<=x;j++){
if(a[i-j]<a[i]){
flag=0;
break;
}
}
if(!flag)continue;
flag=1;
for(int j=1;j<=y;j++){
if(a[i+j]<a[i]){
flag=0;
break;
}
}
if(!flag)continue;
printf("%d\n",i-10);
return 0;
}
return 0;
}
B - Water Lily
#include <cstdio>
#include <cmath>
int main() {
int a,b;
scanf("%d%d",&a,&b);
double x=a,y=b;
printf("%.12lf\n", (x+y*y/x)*0.5 - x);
}
C - MP3
#include <cstdio>
#include <map>
using namespace std;
map<int, int> cnt;
int main() {
long long n,I,a;
scanf("%lld%lld",&n,&I);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
cnt[a]++;
}
I = (I*8)/n;
if(I > 27) {
printf("0\n");
return 0;
}
long long K = 1ll<<I;
long long l=0,r=n;
auto s = cnt.begin(),t = s;
long long ret = 1ll <<60ll;
long long dif = 1;
for(;s!=cnt.end();) {
while(t!= cnt.end() && dif <= K) {
r-=t->second;
t++;
dif++;
}
ret = min(ret,l+r);
l+=s->second;
dif--;
s++;
}
printf("%lld\n",ret);
}
D - Welfare State
#include <cstdio>
#include <algorithm>
using namespace std;
int sgt[200050<<2], mi[200050<<2], fix[200050<<2],a[200050];
void pushup(int p) {
sgt[p] = max(sgt[p<<1], sgt[p<<1|1]);
mi[p] = min(mi[p<<1],mi[p<<1|1]);
}
void build(int p, int l, int r) {
fix[p]=-1;
if(l==r) {
sgt[p]=mi[p]=a[l];
return ;
}
int m=(l+r)>>1;
build(p<<1,l,m);
build(p<<1|1,m+1,r);
pushup(p);
}
void pushdown(int p) {
if(fix[p]!=-1) {
fix[p<<1] = max(fix[p<<1], fix[p]);
fix[p<<1|1] = max(fix[p<<1|1],fix[p]);
sgt[p<<1] = max(sgt[p<<1], fix[p]);
sgt[p<<1|1] = max(sgt[p<<1], fix[p]);
mi[p<<1] = fix[p];
mi[p<<1|1] = fix[p];
fix[p] = -1;
}
}
void tmx(int p, int l, int r, int L, int R, int x) {
if(mi[p]>=x) {
return ;
}
if(sgt[p] <= x && L <= l && r <= R) {
sgt[p] = x;
fix[p] = x;
mi[p]=x;
return ;
}
pushdown(p);
int m=(l+r)>>1;
if(mi[p<<1] < x && L <=m) {
tmx(p<<1,l,m,L,R,x);
}
if(mi[p<<1|1] < x && m < R){
tmx(p<<1|1,m+1,r,L,R,x);
}
pushup(p);
}
void update(int p, int l, int r, int a,int x) {
if(l==r) {
mi[p]=sgt[p]=x;
return ;
}
pushdown(p);
int m = (l+r)>>1;
if(a<=m) {
update(p<<1,l,m,a,x);
} else {
update(p<<1|1,m+1,r,a,x);
}
pushup(p);
}
void query(int p, int l, int r) {
if(l==r) {
a[l] = sgt[p];
return ;
}
pushdown(p);
int m=(l+r)>>1;
query(p<<1,l,m);
query(p<<1|1,m+1,r);
}
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++){
int o;
scanf("%d",&o);
if(o==1) {
int p,x;
scanf("%d",&p);
scanf("%d",&x);
update(1,1,n,p,x);
} else {
int x;
scanf("%d",&x);
tmx(1,1,n,1,n, x);
}
}
query(1,1,n);
for(int i=1;i<=n;i++) {
printf("%d ",a[i]);
}printf("\n");
}
E - Matching vs Independent Set
#include <cstring>
#include <cstdio>
int vis[400050], rett[400050];
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,m;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(int) *(3*n+1));
int cnt =0;
for(int i=1;i<=m;i++) {
int u,v;
scanf("%d%d",&u,&v);
if (!vis[u] && !vis[v]) {
vis[u] = vis[v] = 1;
rett[++cnt] = i;
}
}
if(cnt>=n) {
puts("Matching");
for(int i=1;i<=n;i++) {
printf("%d ",rett[i]);
}
puts("");
} else {
puts("IndSet");
cnt = 1;
for(int i=1;cnt<=n;i++) {
if(!vis[i]) {
cnt++;
printf("%d ",i);
}
}
puts("");
}
}
}
F - Rectangle Painting 1
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[55][55];
int a[55][55],dp[55][55][55][55];
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%s",s[i]+1);
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
a[i][j]=a[i][j-1]+a[i-1][j]-a[i-1][j-1]+(s[i][j]=='#');
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) {
for(int k=n-i+1;k>=1;k--) {
for(int l=n-j+1;l>=1;l--) {
if(a[k+i-1][l+j-1] - a[k-1][l+j-1] - a[k+i-1][l-1] + a[k-1][l-1] == 0) {
continue;
}
auto &ret = dp[k][l][k+i-1][l+j-1];
ret = max(i,j);
for(int f=1;f<i;f++) {
ret = min(ret, dp[k][l][k+f-1][l+j-1]+dp[k+f][l][k+i-1][l+j-1]);
}
for(int f=1;f<j;f++) {
ret= min(ret, dp[k][l][k+i-1][l+f-1]+dp[k][l+f][k+i-1][l+j-1]);
}
}
}
}
}
printf("%d\n",dp[1][1][n][n]);
}