/*
The Most Important Things:
ljc chat with fyh on QQ
Ta说期末考Ta数学74分感觉不好
但是我觉得fyh是地表最强的鸭~~(of course encourge her)
About Today's Training:
玄学错误,没有开longlong+没有算好空间(还不如暴力)
还是得继续加油.
本来以为今天是AK局来着呢..
*/

Problem A password

求$\sum\limits _{i=1} ^n i^2 2^i$ 的值,对于100%的数据$n\leq 10^9$

公式题,考虑答案$\sum\limits _{i=1} ^n i^2 2^i = (n^2 - 2n+3)2^{n+1}-6$

其实就两次数列错位相减就行了。

$S_n = 1 \times 2+4 \times 2^2 + 9 \times 2^3 + ... + n^2 2^n$

那么$2S_n=1 \times 2^2 + 4 \times 2^3 + 9 \times 2^4 + ... + n^2 2^{n+1}$

相减,$S_n = 2S_n-S_n= n^22^{n+1}-(1\times 2+ 3\times 2^2 + ... + (2n-1) \times 2^n)= n^22^{n+1}-T_n $

其中$T_n = 1 \times 2 + 3\times 2^2 + ... + (2n-3) \times 2^{n-1} + (2n-1) \times 2^n $

那么$2T_n = 1 \times 2^2 + 3\times 2^3 + ... + (2n-3) \times 2^{n} + (2n-1) \times 2^{n+1} $

相减,$T_n=2T_n-T_n = (2n-1)2^{n+1}-2-2-2(2^2+2^3+2^4+...+2^n)$

使用等比数列求和公式,得,$T_n = (2n-1)2^{n+1}-2-8 \times (2^{n-1}-1)= (2n-3)2^{n+1} + 6$

带入可知,$S_n= n^2 2^ {n+1}-(2n-3)2^{n+1}-6=(n^2-2n+3)2^{n+1}-6$

然后输出就行,复杂度$O(log_2 n)$

# include<bits/stdc++.h>
# define int long long
# define pow Pow
using namespace std;
const int mo=;
int pow(int x,int n)
{
int ans=;
while (n) {
if (n&) ans=ans*x%mo;
x=x*x%mo;
n>>=;
}
return ans%mo;
}
signed main()
{
int n; cin>>n;
n=((pow(,n+)*(((n*n%mo-*n%mo+)+mo)%mo)-)+mo)%mo;
cout<<n;
return ;
}

password.cpp

Problem B memory

给出一个含有n个元素的序列a,维护下列三种操作共m个:

1.add x k 给a[x]加上k。
2.ask x y 查询区间[x,y]内所有数的和。
3.goto t 回到第t 次操作之后的状态

对于100%的数据n,m<=1e5,空间为8MB

为什么要强调空间呢,就是不让用可持久线段树做。(我就那么做爆0了)

对于每一个操作用二叉树来维护,把每一个时间标号当做一个节点,每一个节点一定是从之前某一个节点"转移"过来

这种转移我们就在树上连边,单向边从过去那个节点连到当前节点。

离线做的时候用BIT维护区间和,同时回溯的时候回退,保证在一个节点的时候BIT中没有当前节点子树的信息。

对于每一个询问在离线dfs中处理。

复杂度$O(n log_2 n)$

# include <bits/stdc++.h>
using namespace std;
const int N=1e5+;
char s[];
int n,m;
int head[N],tot,ans[N];
struct edge{int pre,to;}a[N];
struct rec{int id,op,x,y;}q[N];
# define lowbit(x) (x&(-x))
int c[N];
void update(int x,int y){for (x;x<=n;x+=lowbit(x)) c[x]+=y;}
int query(int x) {int ret=; for (;x;x-=lowbit(x)) ret+=c[x];return ret;}
#undef lowbit
void adde(int u,int v)
{
a[++tot].pre=head[u];
a[tot].to=v;
head[u]=tot;
}
void dfs(int u)
{
if (q[u].op==) update(q[u].x,q[u].y);
else if (q[u].op==) ans[u]=query(q[u].y)-query(q[u].x-);
for (int i=head[u];i;i=a[i].pre) dfs(a[i].to);
if (q[u].op==) update(q[u].x,-q[u].y);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) {
int t; scanf("%d",&t);
update(i,t);
}
for (int i=;i<=m;i++) {
cin>>s;
if (s[]=='s') { //ask
adde(i-,i);
int x,y; scanf("%d%d",&x,&y);
q[i]=(rec) {i,,x,y};
} else if (s[]=='o') { //goto
int t; scanf("%d",&t);
adde(t,i);
} else { //add
int x,y; scanf("%d%d",&x,&y);
adde(i-,i);
q[i]=(rec) {i,,x,y};
}
}
dfs();
for (int i=;i<=m;i++)
if (q[i].op==) printf("%d\n",ans[i]);
return ;
}

memory.cpp

Problem C graph

给出n个点的坐标,保证其中至少有$\frac{1}{3}$的点在同一直线上,

求出两个点使得一条过这两个点的直线上过了至少$\frac{n}{3}$个点

对于100%的数据,$n \leq 900000,x_i,y_i \leq 10^9$

考虑随机化算法,随机选两个点,跑n个点判断这条直线可不可行,直到可行位置。

对于最差情况只有$\frac{n}{3}$符合条件,期望是$1-(1-\frac{C_{\frac{n}{3}}^2}{C_n^2})^{log_n} $

大概是99.999233084076%

复杂度$O(kn)$

# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e6+;
struct rec{double x,y;}a[N];
int n;
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
int random(int x){return 1ll*rand()*rand()%x+;}
signed main()
{
srand(time(NULL)*);
n=read();
for (int i=;i<=n;i++) a[i].x=(double)read(),a[i].y=(double)read();
while (true) {
int p1=,p2=;
while (p1==p2) p1=random(n),p2=random(n);
int x1=a[p1].x,y1=a[p1].y;
int x2=a[p2].x,y2=a[p2].y;
double k=(double)(y1-y2)/(double)(x1-x2);
double b=(double)y1-(double)k*(double)x1;
int cnt=;
for (int i=;i<=n;i++)
if (fabs((double)a[i].x*k+b-(double)a[i].y)<=1e-) {
cnt++;
if ((double)cnt/(double)n>=(double)1.0/3.0) {
cout<<p1<<' '<<p2<<'\n';
return ;
}
}
}
return ;
}

graph.cpp

Problem D volume

求$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} |a_i-a_j|$

对于100%的数据$n\leq 5\times 10^5$

排序$O(nlog_2 n)$做法:记得long long (没开long long 见祖宗)

# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=5e5+;
int a[N],n,ans;
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(x%+'');
}
inline void qsort(int l,int r)
{
if (l==r) return;
int t=rand()%(r-l)+l;
swap(a[t],a[l]);
int v=a[l]; int i=l;int j=r;
while (i<j) {
while (i<j&&a[j]>v) j--;
if (i<j) {a[i]=a[j];i++;} else break;
while (i<j&&a[i]<v) i++;
if (i<j) {a[j]=a[i];j--;} else break;
}
a[i]=v;
if (l<j) qsort(l,j-);
if (i<r) qsort(i+,r);
}
signed main()
{
n=read();
for (int i=;i<=n;i++) a[i]=read();
qsort(,n);
int ret=;
for (int i=;i<=n;i++) ret+=a[i],ans+=a[i]*i-ret;
write(ans<<);
return ;
}

volume.cpp

HGOI 20180224 题解的更多相关文章

  1. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  2. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  3. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

  4. HGOI 20190218 题解

    /* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...

  5. HGOI 20190217 题解

    /* for me,开训第一天 /beacuse 文化课太差被抓去补文化课了... 看一眼题 : AK局? 但是,Wa on test #10 in problem C 290! (就差那么一咪咪) ...

  6. HGOI 20181103 题解

    problem:把一个可重集分成两个互异的不为空集合,两个集合里面的数相乘的gcd为1(将集合中所有元素的质因数没有交集) solution:显然本题并不是那么容易啊!考场上想了好久.. 其实转化为上 ...

  7. HGOI 20181101题解

    /* 又是爆0的一天(不知道今年高考难不难,反正今天(信息学)真的难!) */ solution:对于两个数相加,有一个显然的结论就是要么不进位(相对于位数大的),要么(进最多一位) 然后对于整个数组 ...

  8. HGOI 20191108 题解

    Problem A 新婚快乐 一条路,被$n$个红绿灯划分成$n+1$段,从前到后一次给出每一段的长度$l_i$,每走$1$的长度需要$1$分钟. 一开始所有红绿灯都是绿色的,$g$分钟后所有红绿灯变 ...

  9. HGOI 20191107 题解

    Problem A 树状数组 给出下列$C++$代码: 设区间加操作$modify(l,r)$为调用两次$update(r,1)$和$update(l-1,-1)$ 设$f(l,r)$表示在初始$cn ...

随机推荐

  1. 在平衡树的海洋中畅游(三)——Splay

    Preface 由于我怕学习了Splay之后不直接写blog第二天就忘了,所以强行加了一波优先级. 论谁是天下最秀平衡树,我Splay第一个不服.维护平衡只靠旋转. 一言不合转死你 由于平衡树我也介绍 ...

  2. 2.RapidIO串行物理层的包与控制符号

    转自https://www.cnblogs.com/liujinggang/p/9932150.html 一.RapidIO串行物理层背景介绍 上篇博文提到RapidIO的物理层支持串行物理层与并行物 ...

  3. Excel 中批量处理数据(改成 json 格式)

    如下excel: 需要处理成下面的效果: 方法: 在 C2 中输入公式: ="{"""&"code"&"" ...

  4. Centos7下部署两套python版本并存环境的操作记录

    需求说明:centos7.2系统的开发机器上已经自带了python2.7版本,但是开发的项目中用的是python3.5版本,为了保证Centos系统的正常运行,以及节省机器资源(不想因此再申请另外一台 ...

  5. SoftwareEngineering Individual Project - Word frequency program

    说实话前面c#实在没怎么学过.这次写起来感觉非常陌生,就连怎么引用名空间都忘记了.在经过恶补后还是慢慢地适应了. 1.项目预计用时: 构建并写出大概的数据结构,程序框架及模块: 30min 实现文件夹 ...

  6. 2017-2018-2 1723《程序设计与数据结构》第八周作业 & 实验二 & 第一周结对编程 总结

    作业地址 第八周作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1847 (作业界面已评分,可随时查看,如果对自己的评分有意 ...

  7. 语音笔记:CTC

    CTC全称,Connectionist temporal classification,可以理解为基于神经网络的时序类分类.语音识别中声学模型的训练属于监督学习,需要知道每一帧对应的label才能进行 ...

  8. personal project

    words count program 统计文本文件的字符数,单词数和行数. 实现一个统计程序,他能正确的统计程序文件中的字符数,单词数和行数. 源码链接 https://github.com/sup ...

  9. Sprint 冲刺第三阶段第3-5天 数据库代码

    数据库代码: package com.example.brdemo; import android.app.Activity; import android.content.Intent; impor ...

  10. DrangonBorns

    团队介绍 团队名称:DrangonBorns(龙裔)      团队博客:http://www.cnblogs.com/DragonBorns/     团队队长:蒲建国     队长博客链接:htt ...