CodeForces:54

前言

整场比赛的数据范围都很良心
A是水题.
B是恶心的模拟,有一点锻炼代码能力
C是很水的数数套贪心题
D是被数据范围祸害了的构造题
E是一个很适合(像我一样)的不会计算几何的人做的计算几何题,只需要基本的向量知识

CF54A Presents

Description\text{Description}Description

你有 nnn 天时间,在这 nnn 天内,在给出的 ccc 个特定日期一定会得到礼物,此外,如果连续 kkk 天没有收到礼物,就会得到礼物.
1≤k≤n≤365,1≤c≤n1\le k\le n\le365,1\le c\le n1kn365,1cn

Solution\text{Solution}Solution

如果 n≤1018n\le10^{18}n1018,那可能还会有一些细节需要处理.
但是这个垃圾数据范围,直接模拟就行了…

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
int a[400];
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();k=read();m=read();for(int i=1;i<=m;i++){int x=read();a[x]=1;}int now=0,tot(0);for(int i=1;i<=n;i++){++now;//printf("i=%d now=%d\n")if(now==k||a[i]){++tot;now=0;}}printf("%d\n",tot);return 0;
}
/**/

CF54B Cutting Jigsaw Puzzle

Description\text{Description}Description

有一个 n×mn\times mn×m 的字符串矩形,你可以指定一个大小 (x,y)(x,y)(x,y),然后把矩形分割成 nx×my\dfrac{n}{x}\times \dfrac{m}{y}xn×ym 个小矩形(x∣n,y∣mx|n,y|mxn,ym),若所有的小矩形(可以旋转,但不能翻转)后均互不相同,则称这种分割是合法的.
求合法 分割的方案总数以及子矩形最小的分割方案.
n,m≤20n,m\le20n,m20.

Solution\text{Solution}Solution

一道复杂度怎么做应该都太不可能 TLE 的模拟题.
手玩出旋转对坐标的映射关系.
分别枚举因数暴力哈希 check 即可.
时间复杂度大概是 O(n3)O(n^3)O(n3).

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
char s[25][25];
int key=31;
struct node{char a[25][25];inline ull calc(){ull res(0);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) res=res*key+a[i][j]-'A'+1;}return res;}
}now,pre,w[6];
map<ull,int>mp;
int mn,x,y,res,num;
bool work(int a,int b,int x,int y){//memset(now.a,0,sizeof(a));num=0;for(int i=1;i<=max(n,m);i++){for(int j=1;j<=max(n,m);j++) now.a[i][j]=0;}for(int i=1;i<=x;i++){for(int j=1;j<=y;j++){//printf("  %d %d c=%c\n",a+i-1,b+j-1,s[a+i-1][b+j-1]);now.a[i][j]=s[a+i-1][b+j-1];}}/*printf("(%d %d)\n",a,b);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) printf("%c",now.a[i][j]?now.a[i][j]:'0');putchar('\n');}printf("calc=%llu\n",now.calc());*/if(mp[now.calc()]) return false;w[++num]=now;for(int o=1;o<=3;o++){memcpy(pre.a,now.a,sizeof(now.a));for(int i=1;i<=max(n,m);i++){for(int j=1;j<=max(n,m);j++) now.a[i][j]=0;}for(int i=1;i<=x;i++){for(int j=1;j<=y;j++){//printf("  (%d %d)-> (%d %d)\n",i,j,j,x-i+1);now.a[j][x-i+1]=pre.a[i][j];}}swap(x,y);    if(o==2||x==y){/*for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) printf("%c",now.a[i][j]?now.a[i][j]:'0');putchar('\n');}printf("calc=%llu\n",now.calc());*/if(mp[now.calc()]) return false;w[++num]=now;}}for(int i=1;i<=num;i++) mp[w[i].calc()]=1;return true;
}
bool check(int x,int y){//printf("\nx=%d y=%d\n",x,y);mp.clear();for(int i=1;i<=n;i+=x){for(int j=1;j<=m;j+=y){if(!work(i,j,x,y)) return false;}}return true;
}
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();m=read();mn=2e9;for(int i=1;i<=n;i++){scanf(" %s",s[i]+1);}for(int i=1;i<=n;i++){if(n%i) continue;for(int j=1;j<=m;j++){if(m%j) continue;if(check(i,j)){++res;//printf("------------ok! (%d %d)\n",i,j);if(mn>i*j){mn=i*j;x=i;y=j;}}}}printf("%d\n%d %d\n",res,x,y);return 0;
}
/**/

CF54C First Digit Law

Description\text{Description}Description

给出 nnn 个数,然后给出 nnn 行,每行 li,ril_i,r_ili,ri,代表第 iii 个数在区间 [li,ri][l_i,r_i][li,ri] 中,求一个概率使得这 nnn 个数中有 k%k\%k% 的数是 111 开头的.
n≤1000,1≤li≤ri≤1018n\le1000,1\le l_i\le r_i\le10^{18}n1000,1liri1018.

Solution\text{Solution}Solution

fxf_xfx[1,x][1,x][1,x] 符合条件的数的个数,sumx=∑x=0x10isum_x=\sum_{x=0}^x 10^isumx=x=0x10iwxw_xwx 为满足 10i≤x10^i\le x10ix 的最大的 iii.
就有:
fx=min⁡(2×10wx−1,x)−10wx+1+sumwx−1f_x=\min(2\times10^{w_x}-1,x)-10^{w_x}+1+sum_{w_x-1}fx=min(2×10wx1,x)10wx+1+sumwx1

那么第 iii 个数符合条件的概率就是 fri−fli−1ri−li+1\dfrac{f_{r_i}-f_{l_i-1}}{r_i-l_i+1}rili+1frifli1.
求出每个变量的概率之后,简单 n2n^2n2 dp即可.
细节上,注意 101810^{18}1018101010 会爆 longlong,所以求 wxw_xwx 判断时要乘转除.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1050;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
ll sum[20],mi[20];
double dp[N][N],p[N];
ll calc(ll x){if(x==0) return 0;int o=0;while(x/mi[o]>=10) ++o;return (o?sum[o-1]:0)+min(x,2*mi[o]-1)-mi[o]+1;
}
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifmi[0]=sum[0]=1;for(int i=1;i<=18;i++){mi[i]=mi[i-1]*10;sum[i]=sum[i-1]+mi[i];}n=read();for(int i=1;i<=n;i++){ll l=read(),r=read();p[i]=1.0*(calc(r)-calc(l-1))/(r-l+1);//printf("i=%d p=%lf\n",i,p[i]);}dp[0][0]=1;for(int i=0;i<n;i++){for(int j=0;j<=i;j++){dp[i+1][j+1]+=dp[i][j]*p[i+1];dp[i+1][j]+=dp[i][j]*(1-p[i+1]);}}int k=read();double res=0.0;for(int i=(n*k+99)/100;i<=n;i++) res+=dp[n][i];printf("%.10lf",res);return 0;
}
/**/

CF54D Writing a Song

Description\text{Description}Description

要求构造一个字符串 sss,满足该串长度为 nnn,只出现字母表中前 kkk 个字母,并且在指定位置必须出现指定字符串 ppp,或者报告无解.
n≤100n\le100n100.

Solution\text{Solution}Solution

第一眼:毒瘤计数题…
看完题意:恶心贪心题…
看到数据范围:就这?
或许贪心构造还是可做的,但是对于这个数据范围,我们不必冒着 WA 的风险动脑.
首先 KMP 预处理一下,然后设计 dpi,jdp_{i,j}dpi,j 表示填到第 iii 位,匹配到 ppp 的第 jjj 位是否合法.
转移暴力在 kmp 上跳即可,这数据范围也不需要预处理加速了.
对于输出方案,dp 过程中记录一下转移路径即可.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=105;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
int dp[N][N],frm[N][N],id[N][N];
int p[N],jd[N];
char s[N];
void kmp(){p[1]=0;for(int i=1,j=0;i<m;i++){while(j&&s[i+1]!=s[j+1]) j=p[j];if(s[i+1]==s[j+1]) ++j;p[i+1]=j;}//for(int i=1;i<=m;i++) printf("i=%d p=%d\n",i,p[i]);return;
}
int find(int j,int id){char c='a'+id-1;while(j&&s[j+1]!=c) j=p[j];if(s[j+1]==c) ++j;return j;
}
void print(int k,int pl){if(!k) return;print(k-1,frm[k][pl]);putchar('a'+id[k][pl]-1);
}
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();k=read();scanf(" %s",s+1);m=strlen(s+1);for(int i=1;i<=n-m+1;i++) scanf("%1d",&jd[i+m-1]);kmp();dp[0][0]=1;for(int i=0;i<=n;i++){    if(jd[i]){if(!dp[i][m]){printf("No solution\n");return 0;}for(int j=0;j<m;j++) dp[i][j]=0;//dp[i][p[m]]=1;frm[i][p[m]]=dp[i][m];id[i][p[m]]=id[i][m];}else{dp[i][m]=0;}if(i==n) break;for(int j=0;j<=m;j++){if(!dp[i][j]) continue;for(int p=1;p<=k;p++){int to=find(j,p);//printf("k=%d (%d %d) -> (%d %d)\n",p,i,j,i+1,to);dp[i+1][to]=1;frm[i+1][to]=j;id[i+1][to]=p;}}}for(int i=0;i<=m;i++){if(dp[n][i]){print(n,i);return 0;}}printf("No Solution\n");return 0;
}
/**/

CF54E Vacuum Сleaner

Description\text{Description}Description

对于一个 nnn 个结点的凸包形状的吸尘器,问你这个吸尘器在清理矩形的角落时,遗留下的最小面积,可以旋转.
n≤4×104n\le 4\times10^4n4×104.

Solution\text{Solution}Solution

可能是入门难度的计算几何了.
不难发现最优的时候墙一定和一条边重合(可以通过画圆证明).
那么我们就暴力枚举这条边,双指针维护墙另一条边过的顶点即可.
最后把所有点翻转过来再做一次.
实现上的技巧:

  1. 寻找另一条墙边过的点可以通过判断向量在当前边上投影的大小来实现.
  2. 计算面积时用墙的三角形面积减去多边形两个顶点截出的多边形面积,这个多边形面积可以处理一个面积关于顶点叉积的前缀和再减去这两个顶点叉积求出(建议画图理解).(算出的面积 可能为负,所以要取绝对值)
  3. 墙角三角形的边长一条可以通过投影来求,另一条勾股定理即可.

具体实现建议参考代码理解.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1e5+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
struct P{double x,y;
}p[N];
inline P operator + (P a,P b){return (P){a.x+b.x,a.y+b.y};}
inline P operator - (P a,P b){return (P){a.x-b.x,a.y-b.y};}
inline double operator * (P a,P b){return a.x*b.x+a.y*b.y;}
inline double operator ^ (P a,P b){return a.x*b.y-a.y*b.x;}
inline double dis(P a,P b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
inline double calc(double x,double y){return sqrt(x*x-y*y);}
double sum[N];
double solve(){double res=2e18;for(int i=n+1;i<=n+n;i++) p[i]=p[i-n];for(int i=2;i<=n+n;i++) sum[i]=sum[i-1]+(p[i]^p[i-1])/2;int j=1;for(int i=1;i<=n;i++){j=max(j,i+1);while(j+1<=n*2&&(p[i+1]-p[i])*(p[j+1]-p[i])>=(p[i+1]-p[i])*(p[j]-p[i])) ++j;if(j==i+1) res=0;if(j>2*n) break;double s=sum[j]-sum[i]+(p[i]^p[j])/2;double x=(p[j]-p[i])*(p[i+1]-p[i])/dis(p[i+1],p[i]);double y=calc(dis(p[i],p[j]),x);res=min(res,x*y/2-abs(s));//printf("i=%d j=%d s=%lf x=%lf y=%lf res=%lf\n",i,j,s,x,y,x*y/2-s);}return res;
}
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();for(int i=1;i<=n;i++) p[i].x=read(),p[i].y=read();double ans=solve();reverse(p+1,p+1+n);ans=min(ans,solve());printf("%.10lf\n",ans);return 0;
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOIP2016 提高组] 愤怒的小鸟

[NOIP2016 提高组] 愤怒的小鸟 题意&#xff1a; 有n只猪&#xff0c;给出猪的坐标(xi,yi),问最少用几个形如 yax^2bx 的曲线可以保证所有猪在曲线上&#xff0c;满足a<0,a,b为实数 n<18, 题解&#xff1a; 两个方法&#xff1a;爆搜或者状压dp 状压dp 看n<18也…

P5208-[WC2019] I 君的商店【交互,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P5208 题目大意 有一个长度为nnn的010101序列aaa&#xff0c;你知道里面有奇数个111还是偶数个111。你每次可以选择两个下标集合S/TS/TS/T询问集合SSS和集合TTT位置的数字和哪个更大。 交互库只会告诉你S≤TS\leq TS≤T或者…

模板:后缀数组(SA)

文章目录前言解析后缀排序优化1&#xff1a;基数排序优化2&#xff1a;简化第一次排序优化3&#xff1a;提前break完整代码LCP与height所谓后缀数组&#xff0c;就是存储后缀的数组 &#xff08;逃&#xff09; 前言 为什么一个算法&#xff0c;如此难以理解却依然是成为一个…

P3959 [NOIP2017 提高组] 宝藏

P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说&#xff0c;就是n个点m个边&#xff0c;选定一个点为根节点&#xff0c;构造一个最小生成树&#xff0c;边的权值为该该边起点到根节点之间的点的数量K&#xff08;不含根节点&#xff09; * 道路长度 1<n<12 0<m&…

如何在ASP.NET Core程序启动时运行异步任务(3)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 3)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu之前我写了两篇有关在ASP.NET Core中运行异步任务的博文&#xff0c;本篇博文是对之前两篇博文中演示示例和实现方法的简短跟进。你可以通过…

CF1140G-Double Tree【最短路,矩阵乘法,树上倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1140G 题目大意 给出一个nnn个点的树TTT&#xff0c;然后复制一份T′TT′&#xff0c;每个TTT中的点iii向T′TT′中的点iii都有连边构成一张图。 图上所有权值各不相同&#xff0c;现在qqq次询问图上两点的最短路。 1≤n≤…

数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls

可检验模板正确度An Easy Problem?!Ancient Berland CircusOpen-air shopping mallsAn Easy Problem?! problem 就是大讨论 #include <cmath> #include <cstdio> #include <iostream> using namespace std; #define eps 1e-6struct vec {double x, y;ve…

CodeForces:12271261(div1)1262(div2)

文章目录前言CF1227A Math ProblemDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF1227B BoxDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF1227C MessyDescription\text{Des…

【NET CORE微服务一条龙应用】应用部署

简介本章主要介绍https://github.com/q315523275/FamilyBucket上微服务一条龙应用&#xff0c;在实际使用中的应用部署&#xff0c;以原始方式部署非docker部署应用主要包括&#xff1a;1、网关应用部署2、授权认证应用部署3、配置中心查询服务端应用部署4、综合管理应用部署5、…

牛客网区间dp练习

NC13230 合并回文子串 NC16129 小小粉刷匠 NC19909 [CQOI2007]涂色PAINT NC19997 [HAOI2016]字符合并 NC20238 [SCOI2003]字符串折叠 NC20252 [SCOI2007]压缩 NC20312 [SDOI2008]SUE的小球 POJ3042 Grazing on the Run

CF516D-Drazil and Morning Exercise【树上差分,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF516D 题目大意 给出一棵nnn个点的树&#xff0c;定义f(x)f(x)f(x)表示距离点xxx最远的点的距离&#xff0c;qqq次询问给出一个kkk&#xff0c;要求一个最大的连通块满足连通块中所有点的f(x)f(x)f(x)最大最小差值不能超过k…

容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对

文章目录Co-primesourcesolutioncodeCharacter EncodingsourcesolutioncodeTree and Constraintssourcesolutioncode「2017 山东一轮集训 Day7」逆序对sourcesolutioncodeCo-prime source TTT组数据&#xff0c;给出&#x1d43f;,&#x1d445;,&#x1d441;&#x1d43f;, …

手工修复Azure DevOps无法连接到Azure的问题

点击上方蓝字关注“汪宇杰博客”今天我在为一个从TFVC迁移到Git的老项目重新配置发布到Azure App Service的CI/CD管线的时候&#xff0c;Azure DevOps竟然爆了。这是一个微软已知的bug&#xff0c;目前还未修复&#xff0c;我来带大家看看如何手工workaround这个问题。首先&…

Loj#576-「LibreOJ NOI Round #2」签到游戏【线段树】

正题 题目链接:https://loj.ac/p/576 题目大意 给出一个长度为nnn的序列aaa&#xff0c;还有一个未知序列bbb&#xff0c;你每次可以花费gcd⁡ilrai\gcd_{il}^r a_igcdilr​ai​的代价得到∑ilrbi\sum_{il}^rb_i∑ilr​bi​的值。 每次修改aaa中的一个数&#xff0c;求得到b…

NC14732 锁

NC14732 锁 题意&#xff1a; n个居民&#xff0c;门上有k把锁&#xff0c;每个居民有若干钥匙&#xff0c;为1到k的一个子集&#xff0c;如果几名居民的钥匙的并集是1到k&#xff0c;即他们拥有全部锁的对应钥匙。 求最小的k&#xff0c;使得可以适当地给居民们每人若干钥匙…

CodeForces:1103(div1)1104(div2)

文章目录前言CF1104A Splitting into digitsDescription\text{Description}DescriptionSolution\text{Solution}SolutionDescription\text{Description}DescriptionCF1104B Game with stringDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text…

专题突破一之分块——Untitled Problem II,Balanced Lineup,[ioi2009]Regions

文章目录SP2940 UNTITLE1 - Untitled Problem IIsourcesolutioncodeBalanced LineupsourcecodeCount on a tree II[ioi2009]RegionsSP2940 UNTITLE1 - Untitled Problem II source solution 分块 si{sik(i−l1)sikik(1−l)l≤i≤rsik(r−l1)r<is_i\begin{cases} s_ik\tim…

.NET Core实战项目之CMS 第十七章 CMS网站系统的部署

目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了&#xff0c;通过这一系列的学习你应该能够轻松应对.NET Core的日常开发了&#xff01;当然这个CMS系统的一些逻辑处理还需要优化&#xff0c;如没有引入日志组件以及缓存功能&#xff0c;权限目前只支持控制到菜单&…

ICPC2019南昌区域赛

ICPC2019南昌区域赛 题号题目知识点难度A9102BA Funny Bipartite Graph状压dp思维稳银快金CAnd and Pair二项式定理快铜DBitwise TreeEBob’s Problem思维&#xff0c;生成树签到FDynamic Suffix ArrayGEating Plan思维题稳铜快银HPowers of TwoIResistanceJSummonKTreeLWho i…

Loj#510-「LibreOJ NOI Round #1」北校门外的回忆【线段树】

正题 题目链接:https://loj.ac/p/510 题目大意 给出一个代码 function add(x,v)while x < n dos[x] s[x] xor vx x lowbit(x) //注意&#xff0c;这里是 lowbit&#xff0c;这也是两份代码唯一的区别end while end functionfunction query(x)ans 0while x > 0 doa…