CF453(Div1 简单题解)
A .Little Pony and Expected Maximum
pro:给定M,N,表示一个M面的骰子,甩N次,问出现的最大的数的期望。
sol:容斥,f(i)表示最大数<=i的期望,那么最大数=x的期望就是f(x)-f(x-1);
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
double dp[maxn];
double qpow(double a,int x)
{
double res=1.0;while(x){
if(x&) res=res*a;
a=a*a; x>>=;
} return res;
}
int main()
{
int M,N; double ans=.;
scanf("%d%d",&M,&N);
rep(i,,M) dp[i]=qpow(1.0*i/M,N);
rep(i,,M) ans+=(dp[i]-dp[i-])*i;
printf("%.10lf\n",ans);
return ;
}
B .Little Pony and Harmony Chest
pro:给定数组a[],求一个两两互质的b[],使得abs(a[]-b[])最小,输出一个方案。 N<=100,a[]<=30
sol:两两互质,表示之前出现的素因子不能出现,而我们发现>60不可能,因为差值会变很大。 所以我们记录<=60的素数,然后状压DP,记录一下来源,最后倒回去输出即可。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int maxm=;
int a[maxn],p[maxn],vis[maxn],tot,cnt;
int pre[maxn][maxm],now[maxn][maxm],dp[maxn][maxm],fac[maxn];
vector<int>G[maxm];
void dfs(int pos,int Now)
{
if(pos==) return ;
dfs(pos-,pre[pos][Now]);
printf("%d ",now[pos][Now]);
}
int main()
{
int N,M,ans=,P;
memset(dp,0x3f,sizeof(dp)); dp[][]=;
rep(i,,) {
if(!vis[i]){
p[tot++]=i;
for(int j=i+i;j<=;j+=i) vis[j]=;
}
}
rep(i,,){
rep(j,,tot-){
if(i%p[j]==){
fac[i]|=(<<j);
}
}
}
M=(<<tot)-;
rep(i,,M) rep(j,,)
if(!(fac[j]&i)) G[i].push_back(j),cnt++;
scanf("%d",&N);
rep(i,,N) scanf("%d",&a[i]);
rep(i,,N){
rep(j,,M) {
for(int k=;k<G[j].size();k++){
int v=G[j][k];
if(dp[i][j|fac[v]]>dp[i-][j]+abs(a[i]-v)){
dp[i][j|fac[v]]=dp[i-][j]+abs(a[i]-v);
pre[i][j|fac[v]]=j;
now[i][j|fac[v]]=v;
}
}
}
}
rep(i,,M) if(dp[N][i]<ans) ans=dp[N][i],P=i;
dfs(N,P);
return ;
}
C .Little Pony and Summer Sun Celebration
pro:给定N点M边的无向图(不一定连通),然后给没给点限制一个0或1,表示经过点的奇偶,让你找一条路径,满足路径长度<=N*4,而且满足奇偶要求。
sol:我们DFS,如果儿子的奇偶性未满足,满足我们再走一遍(fa->son->fa)即可,发现一定可以构造好。。。然后就是要求的奇数的点一定要连通。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn],To[maxn],d[maxn],cnt;
int a[maxn],b[maxn],tot,vis[maxn],t[maxn],F=;
void add(int u,int v)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;
}
void dfs(int u,int f)
{
vis[u]=; t[u]^=;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v!=f&&!vis[v]){
tot++; a[tot]=u; b[tot]=v;
dfs(v,u);
tot++; a[tot]=v; b[tot]=u; t[u]^=;
if(d[v]!=t[v]){
tot++; a[tot]=u; b[tot]=v; t[v]^=;
tot++; a[tot]=v; b[tot]=u; t[u]^=;
}
}
}
}
int main()
{
int N,M,u,v,root=-;
scanf("%d%d",&N,&M);
rep(i,,M){
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
rep(i,,N) scanf("%d",&d[i]);
rep(i,,N) if(d[i]==) root=i;
if(root==-) return puts(""),;// root=1;
dfs(root,);
rep(i,,N) if(!vis[i]&&d[i]==) F=;
if(!F) return puts("-1"),;
if(t[root]!=d[root]) tot--;
printf("%d\n",tot+);
printf("%d ",root);
rep(i,,tot) printf("%d ",b[i]);
return ;
}
D .Little Pony and Elements of Harmony
FWT,不会,占位。
E .Little Pony and Lord Tirek
题意:N个马,给定了开始的能量值s[],以及能力上限m[],以及单位时间的能力上升值r[]。Q次操作,每次给出[L,R],吸走这个区间的马的能力和sum,求sum,马的能力被吸走后变为0。
思路:想不到线段树就可以做。。。。tql ,注意r可能为0,不要除0,免得RE。
主要一点就是,区间更新,区间时间一样了,我们就可以均摊复杂度了,即tag相同的区间利用预处理,不同的继续下推。
我们先预处理,把每个节点按照达到上限的时间排序,然后得到前缀和,用前缀和来快速得到,这个区间给定时间差后的sum。
时间复杂度O(N(logN)^2),空间O(NlogN);
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=2e9;
int s[maxn],m[maxn],r[maxn],t[maxn],vis[maxn<<];
int T[][maxn]; ll pre[][maxn],v[][maxn];
struct in{
int m,r,t;
in(){}
in(int mm,int rr,int tt):m(mm),r(rr),t(tt){}
bool friend operator<(in w,in v){
return w.t<v.t;
}
}fcy[maxn];
void build(int dep,int Now,int L,int R)
{
rep(i,L,R) fcy[i]=in(m[i],r[i],t[i]);
sort(fcy+L,fcy+R+);
rep(i,L,R){
T[dep][i]=fcy[i].t;
pre[dep][i]=fcy[i].m;
v[dep][i]=fcy[i].r;
if(i>L){
pre[dep][i]+=pre[dep][i-];//满的部分前缀和
v[dep][i]+=v[dep][i-]; //速度前缀和
}
}
if(L==R){ vis[Now]=; return; }
vis[Now]=-; int Mid=(L+R)>>;
build(dep+,Now<<,L,Mid);
build(dep+,Now<<|,Mid+,R);
}
ll query(int dep,int Now,int L,int R,int ql,int qr,int times)
{
if(vis[Now]==){
vis[Now]=times;
if(s[L]+1LL*times*r[L]>=m[L]) return 1LL*m[L];
return 1LL*s[L]+times*r[L];
}
if(ql<=L&&qr>=R&&vis[Now]>){
int p=upper_bound(T[dep]+L,T[dep]+R+,times-vis[Now])-T[dep]; p--;
ll res=((p>=L)?pre[dep][p]:); //满的
res+=(v[dep][R]-((p>=L)?v[dep][p]:))*(times-vis[Now]); //未满
vis[Now]=times;
return res;
}
if(vis[Now]>=) vis[Now<<]=vis[Now<<|]=vis[Now];
int Mid=(L+R)>>; ll res=;
if(ql<=Mid) res+=query(dep+,Now<<,L,Mid,ql,qr,times);
if(qr>Mid) res+=query(dep+,Now<<|,Mid+,R,ql,qr,times);
if(vis[Now<<]==vis[Now<<|])
vis[Now]=vis[Now<<]; else vis[Now]=-;
return res;
}
int main()
{
int N,M,ts,L,R;
scanf("%d",&N);
rep(i,,N){
scanf("%d%d%d",&s[i],&m[i],&r[i]);
if(!r[i]) t[i]=inf;
else t[i]=m[i]/r[i]+(m[i]%r[i]?:);
}
build(,,,N);
scanf("%d",&M);
rep(i,,M){
scanf("%d%d%d",&ts,&L,&R);
ll ans=query(,,,N,L,R,ts);
printf("%lld\n",ans);
}
return ;
}
CF453(Div1 简单题解)的更多相关文章
- CF449 (Div. 1简单题解)
A .Jzzhu and Chocolate pro:现在给定一个大小为N*M的巧克力,让你横着或者竖着切K刀,都是切的整数大小,而且不能切在相同的地方,求最大化其中最小的块. (N,M,K<1 ...
- CF446 (Div. 1)简单题解
A .DZY Loves Sequences pro:给定长度为N的序列,你最多可以改变一个数的值,问最长严格上升子序列长度. N<1e5. sol:分几种情况,一种的不改变: 一种是改变,然后 ...
- 运用kmp算法解决的一些问题的简单题解
学习kmp算法我最后是看的数据结构书上的一本教材学会的..我认为kmp相对于普通的BF算法就是避免了非常多不必要的匹配.而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存 ...
- NCPC 2016:简单题解
A .Artwork pro:给定N*M的白色格子,然后Q次黑棒,输出每次加黑棒后白色连通块的数量.(N,M<1e3, Q<1e4) sol:倒着离线做,并查集即可. (在线做法:http ...
- CF1132.Educational Codeforces Round 61(简单题解)
A .Regular Bracket Sequence 题意:给定“((” , “()” , “)(”, “))”四种,问是否可以组成合法括号匹配 思路:设四种是ABCD,B可以不用管,而C在A或 ...
- CF444(Div. 1简单题解)
A .DZY Loves Physics 题意:给定带点权和边权的无向图,现在让你选一些点,使得 点权和/被选点对间的边权和 最大. 思路:不难证明,选择边和对应的两点是最优的. #include&l ...
- POJ 2299 Ultra-QuickSort 简单题解
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 68874 Accepted: 25813 ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- AtCoder Regular Contest 075 2017年6月4日 C、D、E题解
http://arc075.contest.atcoder.jp/assignments 昨晚做的atcoder,今天写个简单题解. F题不会做,800point的,就跪了,要等zk大佬来做.zk能做 ...
随机推荐
- python3 get/post/使用代理/自定义header/自定义Cookie
说明:urllib发送http请求并不是很人性化,更推荐使用在urllib基础上封装的.python2和python3都兼容的requests模块,移步查看. 一.get请求 get请求就是在构造Re ...
- globals() 和 locals() 函数
globals() 和 locals() 函数 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字. 如果在函数内部调用 locals(),返回的 ...
- 003-RHEL7-Linux系统维护管理命令使用
系统维护管理命令: date 查看日期,设置日期 只有超级用户才能用date命令设置时间 date --help 显示时间的帮助命令 date{选项} 显示时间格式(以+开头,后面接时间格式) ...
- Win10系列:UWP界面布局基础11
样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...
- 分布式链路追踪(Sleuth、Zipkin)
技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...
- js 中class选择器,addClass,removeClass,hasClass,toggleClass,getByClass
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 计算机基础part1
一:计算机的基本组成 1.计算机由输入单元.控制单元.算法逻辑单元.输出单元.存储单元,五大单元组成 二:概念篇 CPU:中央处理器,其内含有指令集(取码-解码-执行的过程) CPU同一时刻只能干一件 ...
- Java中数据类型相互转化
1 将String 转换成int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String], ...
- webpack分离打包css和less
github仓库:https://github.com/llcMite/webpack.git 为什么要分离打包? 答:刚开始学webpack的时候就很郁闷,明明没几个文件,打包出来体积特 ...
- Introduction to Cryto & Crptocurrencies Lecture 1
Lecture 1.2 Hash Pointer & Data Structure Use Case 1. 什么是Block Chain呢? 想象一个像链表一样的结构,只不过与通常的指向下一块 ...