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 简单题解)的更多相关文章

  1. CF449 (Div. 1简单题解)

    A .Jzzhu and Chocolate pro:现在给定一个大小为N*M的巧克力,让你横着或者竖着切K刀,都是切的整数大小,而且不能切在相同的地方,求最大化其中最小的块. (N,M,K<1 ...

  2. CF446 (Div. 1)简单题解

    A .DZY Loves Sequences pro:给定长度为N的序列,你最多可以改变一个数的值,问最长严格上升子序列长度. N<1e5. sol:分几种情况,一种的不改变: 一种是改变,然后 ...

  3. 运用kmp算法解决的一些问题的简单题解

    学习kmp算法我最后是看的数据结构书上的一本教材学会的..我认为kmp相对于普通的BF算法就是避免了非常多不必要的匹配.而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存 ...

  4. NCPC 2016:简单题解

    A .Artwork pro:给定N*M的白色格子,然后Q次黑棒,输出每次加黑棒后白色连通块的数量.(N,M<1e3, Q<1e4) sol:倒着离线做,并查集即可. (在线做法:http ...

  5. CF1132.Educational Codeforces Round 61(简单题解)

    A .Regular Bracket Sequence 题意:给定“((” , “()” ,  “)(”,  “))”四种,问是否可以组成合法括号匹配 思路:设四种是ABCD,B可以不用管,而C在A或 ...

  6. CF444(Div. 1简单题解)

    A .DZY Loves Physics 题意:给定带点权和边权的无向图,现在让你选一些点,使得 点权和/被选点对间的边权和 最大. 思路:不难证明,选择边和对应的两点是最优的. #include&l ...

  7. POJ 2299 Ultra-QuickSort 简单题解

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 68874   Accepted: 25813 ...

  8. 图论 SRM 674 Div1 VampireTree 250

    Problem Statement      You are a genealogist specializing in family trees of vampires. Vampire famil ...

  9. AtCoder Regular Contest 075 2017年6月4日 C、D、E题解

    http://arc075.contest.atcoder.jp/assignments 昨晚做的atcoder,今天写个简单题解. F题不会做,800point的,就跪了,要等zk大佬来做.zk能做 ...

随机推荐

  1. URL to load resources from the classpath in Java

    In Java, you can load all kinds of resources using the same API but with different URL protocols: fi ...

  2. 关于JAVA的一些知识点

    1.java.lang.Runtime.getRuntime().availableProcessors() Returns the number of processors available to ...

  3. Sql server中 如何用sql语句创建视图

    1.视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,可以需要一些与其有关的数据,而与 ...

  4. mac ci框架安装使用 memcached存session

    mac 安装memcached brew info memcached brew install memcached brew install memcached 安装过程具体不详细多讲 memcac ...

  5. Entrust - Laravel 用户权限系统解决方案

    Zizaco/Entrust 是 Laravel 下 用户权限系统 的解决方案, 配合 用户身份认证 扩展包 Zizaco/confide 使用, 可以快速搭建出一套具备高扩展性的用户系统. Conf ...

  6. mybatis-ResultMappingResolver类信息

    ResultMappingResolver类介绍 一个ResultMap元素对应一个ResultMap对象 resultMap元素中的idArg/result/association/collecti ...

  7. C++解析四-友员函数、内联函数、静态成员

    友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友元可以是一个函 ...

  8. u-boot的内存分布

    cpu会自动从NAND flash 中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000).cpu是从0x000 ...

  9. tomcat 服务器线程问题

    http://blog.csdn.net/wtopps/article/details/71339295 http://blog.csdn.net/wtopps/article/details/713 ...

  10. 四:(之五)Dockerfile语法梳理和实践

    *5.Dockerfile语法梳理和实践 5.1 尽量使用官方的image作为base image 5.2 metadata:指明作者 版本 描述 5.3 每一条run都能形成一个分层,避免无用分层应 ...