Individual Contest #1 and Private Training #1
第一次的增补赛,也是第一场个人排位赛,讲道理打的和屎一样,手速题卡了好久还WA了好多发,难题又切不出来,这种情况是最尴尬的吧!
Individual Contest #1:
Ploblem D:
题意:给你一个含有N个元素的数组和操作次数m,然后求出经过m次操作后,从区间X到Y的总和;操作如下:{1,6,9}==>{1,7,6,15,9}(多CASE)
题目链接:https://www.codechef.com/problems/CHSPARR
思路:
首先,最容易想到的是单纯的模拟每一次这样的操作然后用数组存起来,再去算区间X到Y的总和。可是,当N和m取最大的时候,数组元素数量会达到10^15,直接GG!所以得换个套路!
对于原始数组{1,6,9},元素对应的下标各自为1,2,3。以1,6为例,{1,6}==>{1,7,6}==>{1,8,7,13,6}==>{1,9,8,15,7,20,13,19,6},元素6的标和m的变化为:i(0),2*i-1(1),4*i-3(2),8*i-7(3)
把两者联系起来你可以发现经过m次变换后元素6的下标为:i*2^m-(2^m-1)==>(i-1)*2^m-1。
接着继续模拟:{1,6}==>{1,7(1+6),6}==>{1,8(1,1+6),7(1+6),13(1+6,6),6},你会发现,如果把1和6中间的所有新增加的元素看成一个整体s,那个他每一次都会
向左向右复制一遍,再加上他本身,就是3*s,同时端点处的1和6也会每一次都增加一次,如果能将s和(1+6)联系起来,那么1和6之间的元素总和不就可以直接求了吗!到这里也可以看出
来是倍数关系。设数组k表示分别经过1-m次操作后对应的系数,则k[m]=k[m-1]*3+1。这样的话如果X和Y里面有包含一个或多个完整的中间元素块,就可以直接求出来了!
那多出来的那部分怎么办呢?你会发现对于元素a(i)和元素b(j),元素a+b一定在(i+j)/2的位置。所以直接分治,每一次都缩小规模找到完整块++,代码如下:
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define mod 1000000007
using namespace std;
typedef long long LL;
using namespace std;
LL a[],k[],n,m,x,y;
void init()
{
k[]=;
for(int i=;i<=;i++)
{
k[i]=(k[i-]*+)%mod;
}
}
LL f(LL num)
{
if(num==)return ;
int i,j,mm;
LL res=,p=<<m,q,h,mid,l,r;
q=num/p;
for(i=;i<=q;i++)
{
res=(res+(a[i]+a[i+])*k[m]+a[i])%mod;
}
h=num%p;
l=a[q+];
r=a[q+];
mm=m;
while(h>&&mm>)
{
mm--;
mid=<<mm;
if(h>=mid)
{
res=(res+(*l+r)*k[mm]+l)%mod;
h-=mid;
l=l+r;
}
else
{
r=l+r;
}
}
//if(h!=0)res+=r;
return res%mod;
}
int main()
{
#ifdef Local
freopen("data.txt","r",stdin);
#endif
int i,j,T;
LL ans;
cin>>T;
init();
while(T--)
{
cin>>n>>m>>x>>y;
for(i=;i<=n;i++)
{
scanf("%lld",&a[i]);
}
ans=f(y)-f(x-);
if(ans<)ans+=mod;
printf("%lld\n",ans);
}
}
Ploblem H:
题意:给你一棵N节点的树和K种颜色的颜料,对这样的一棵树进行染色,使得任意两个相同颜色的联通节点之间所有节点颜色相同,求出所有的染色方法。
题目链接:https://www.codechef.com/problems/COLTREE
思路 I:
其实就是给你一棵树,让你切分成m棵子树,每棵子树的染色相同,有多少种染色方法。切成m棵子树,其实就是选择m-1条边去切断,所有就是C(n-1,m-1),
然后对于m棵子树进行K种染色,其实就是A(K,m),所有方法数就是C(n-1,m-1)*A(K,m)。然后对于规模不大的大组合数取模,用杨辉三角把除变加进行
处理就可以了。
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define mod 1000000007
using namespace std;
typedef long long LL;
LL C[][];
LL A(int n,int m)
{
LL res=;
for(int i=n;i>n-m;i--)
{
res=(res*i)%mod;
}
return res;
}
void init()
{
memset(C,,sizeof(C));
for(int i=;i<=;i++)C[i][]=;
for(int i=;i<=;i++)
{
for(int j=;j<=i;j++)
{
if(j==)C[i][j]=i;
else if(i==j)C[i][j]=;
else C[i][j]=(C[i-][j]+C[i-][j-])%mod;
}
}
}
int main()
{
#ifdef Local
freopen("data.txt","r",stdin);
#endif
int n,m,u,v,T,i,j;
LL ans;
init();
cin>>T;
while(T--)
{
ans=;
cin>>n>>m;
for(i=;i<n-;i++)scanf("%d%d",&u,&v);
for(i=;i<=min(n,m);i++)
{
ans=(ans+C[n-][i-]*A(m,i))%mod;
}
cout<<ans<<endl;
}
}
思路 II:树形DP(等我学会了再更...)
Private Training #1
Problem C (UVALive 6602 Counting Lattice Squares)
题意:给你一个(n+1)*(m+1)的点矩阵,然后让你在点阵里面找出,所有面积为奇数的正方形的个数?
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4613
思路:
首先,面积为奇数的正方形,可以直接由边长为奇数K得来,也可以由类似这样sqrt(K)的边得来。然后对于第二种情况的K,可以由a+b的和为奇数的情况得来,即
K=sqrt(a*a+b*b)&&(a+b)%2==1。接着你会发现,边长为sqrt(K)的正方形需要的空间是边长为(a+b)的正方形,所以边长为sqrt(K)的情况可以把它当做边长为
(a+b)的一类型,且该区域一共可以画2个不同的边长为sqrt(K)的正方形。然后对于一个(n+1)*(m+1)的点矩阵,一共可以切成(n-i+1)*(m-i+1)种边长为i的正方
形,但是对于边长i,它可以由不同的a+b组合而来,假设i=5,那么5=1+4=2+3,6=1+5=2+4=3+3,所以最后的公式就是(n-i+1)*(m-i+1)*(i/2*2(2种画法)+1(本身))
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define mod 1000000007
using namespace std;
typedef long long LL;
int main()
{
#ifdef Local
freopen("data.txt","r",stdin);
#endif
int i,j;
LL ans,s,n,m;
while(~scanf("%lld %lld",&n,&m))
{
if(!n&&!m)break;
ans=;
for(i=;i<=min(n,m);i+=)
{
ans+=((n-i+)*(m-i+)*(i/*+));
}
cout<<ans<<endl;
} }
Ploblem J:(UVALive 6609 Minimal Subarray Length)
题意:给你一个含有N个元素的数组和一个价值X,使得数组中连续一段数字和大于等于X的长度最小,如果找不到则输出-1
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4620
思路:
先用预处理出元素1-i(i<=n)的元素总和sum[i],再用RMQ预处理出dp[i][j]表示区间从i开始,长度为2^j的最大sum,然后再对于每一个i(1-n)二分(query(l,r)-sum[i-1])
>=X,的最短长度,复杂度是n(logn)。
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define mod 1000000007
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
LL dp[][],sum[];
void RMQ(int n)
{
int i,j;
for(i=;i<=n;i++)dp[i][]=sum[i];
for(j=;(<<j)<=n;j++)
{
for(i=;(i+(<<j))<=n;i++)
{
dp[i][j]=max(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
}
LL query(int l,int r)
{
int p=;
while(<<(p+)<=(r-l+))p++;
return max(dp[l][p],dp[r-(<<p)+][p]);
}
int main()
{
#ifdef Local
freopen("data.txt","r",stdin);
#endif
int i,j,T,n;
LL k;
cin>>T;
while(T--)
{
memset(sum,,sizeof(sum));
cin>>n>>k;
for(i=;i<=n;i++)
{
scanf("%lld",&sum[i]);
sum[i]+=sum[i-];
}
RMQ(n);
int ans=INF;
for(i=;i<=n;i++)
{
int l=i,r=n;
while(l<=r)
{
int m=(l+r)/;
if((query(i,m)-sum[i-])>=k)
{
r=m-;
}
else l=m+;
}
if(r<=n&&sum[r]-sum[i-]>=k)ans=min(ans,r-i+);
if(l<=n&&sum[l]-sum[i-]>=k)ans=min(ans,l-i+);
}
if(ans==INF)cout<<-<<endl;
else cout<<ans<<endl;
}
return ;
}
To Be Continue!
Individual Contest #1 and Private Training #1的更多相关文章
- SCAU Individual Contest #1
总结一下就是自己太弱.每次打比赛遇到比较难题就喜欢瞎开题,结果都是每题想一下,然后就是结束了. A:题意让你用小写字母构造一个总共有K个的回文串,比如aba的话就是{a}{b}{a}{aba}四个,比 ...
- 计蒜客 18492.Upside down primes-米勒拉宾判大素数 (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 K)
K. Upside down primes 传送门 这个题就是把大数按字符串输进去,判断一下是不是素数,然后反转180度,先判断反转之后的东西是不是一个数,如果是的话,再把这个数判一下是不是素数,如果 ...
- 计蒜客 18487.Divisions-大数的所有因子个数-Miller_Rabin+Pollard_rho-超快的(大数质因解+因子个数求解公式) (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 F)
这一场两个和大数有关的题目,都用到了米勒拉宾算法,有点东西,备忘一下. 题目传送门 F. Divisions 传送门 这个题是求一个数的所有因子个数,但是数据比较大,1e18,所以是大数的题目,正常的 ...
- 计蒜客 18488.Extreme Sort (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 E)
E.Extreme Sort 传送门 代码: #include<iostream> #include<cstdio> #include<cstring> #incl ...
- JSU 2013 Summer Individual Ranking Contest - 5
JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...
- 2016 Multi-University Training Contests
2016 Multi-University Training Contest 1 2016 Multi-University Training Contest 2 2016 Multi-Univers ...
- 深度学习Deep learning
In the last chapter we learned that deep neural networks are often much harder to train than shallow ...
- java包(package)的命名规范
Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由 ...
- eclipse下package的命名规范
Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...
随机推荐
- 配置wamp开发环境【1】
新手在PHP网站建设时,会使用使用PHP的集成开发环境,这样利于开发和理解!但是做为一个网站开发人员,会独立的配置开发环境这是必须的……因为集成的环境毕竟是固定的,不利于自己的开发.好,废话少说咱现在 ...
- js原型解析
我们都知道javascript因为具有了继承以及变量等等一系列的特性之后才被人们认为具有一门编程语言的资格,在后续的不断发展中,js在原生的基础上扩展了基于jquery等等的库,甚至衍生了像node. ...
- cocos2dx arpg单机手游
这只是一个DEMO. ARPG 单机手游, 个人DEMO. 支持剧情编辑, 支持气泡对话, 支持人物图像对话, 支持随时角色切换, 支持NPC跟随, 共同作战, 支持LUA扩展, 支持BUFF技能, ...
- 使用jquer获取当前时间,并赋值到input上。
今天,做一个项目,需要将自动获取的时间能够赋值到input上.我一开始试用javascript写的,写之后使用很多办法都赋值失败,最后使用了jquery写了出来,下面附上代码. <script ...
- 自定义流程gooflow.08 demo在线演示
一.功能简介 gooflow功能清单1.自定义流程绘制2.自定义属性添加3.支持3种步骤类型 普通审批步骤 自动决策步骤 手动决策步骤 4.决策方式(支持js决策,sql语句决策) 5.审批人员参与方 ...
- tornado学习精要
最简单的应用在程序的最顶部,我们导入了一些Tornado模块.虽然Tornado还有另外一些有用的模块,但在这个例子中我们必须至少包含这四个模块. 12341234包括了一个有用的模块(tornado ...
- PHP实现简易的模板引擎
PHP实现简易的模板引擎 1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Mode ...
- phpcms v9使用GET调用指定id文章内容、页面数据方法
不知道大家有没有相同的体会?在使用Phpcms V9建站调用数据的时候,基础的数据用默认的模板的调用语句就好了,但复杂不常见的数据怎么调用呢?我们技术可能会研究半天,怀着探索的精神不断尝试.孜孜不倦. ...
- Java: 实现顺序表和单链表的快速排序
快速排序 快速排序原理 快速排序(Quick Sort)的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到 ...
- 到底该如何入门Keras、Theano呢?(浅谈)
目前刚刚开始学习Theano,可以说是一头雾水,后来发现Keras是对Theano进行了包装,直接使用Keras可以减少很多细节程序的书写,它是模块儿化的,使用比较方便,但更为细节的内容,还没有理解, ...