bestcoder杯回顾
题目列表:hdu5214~5223
5214:
当时第一反应是由递推公式推出通项公式,事实证明这就是作!大!死!
因为通项公式是这样的:L[n]=a^(n-1)*(b+L[1])-b
于是就需要快速幂。然而用了快速幂还是慢。。。【实际上是被卡在了7000ms多一点点。。。】
其实直接放到数组里一项一项递推就行。。速度并不慢还省事
另外本题还有一个point:被mod的那个数字很奇怪,所以直接用unsigned int存就行。不仅省空间还不用mod了(溢出相当于自动mod)
当时没想起来这个于是用了long long,于是数组存不下,于是T^T
#include <iostream>
#include <cstdio>
#include <cstring>
#define LL unsigned int
//#define MOD 4294967296
using namespace std;
LL N,L1,R1,a,b,c,d,T;
LL ll[],rr[];
LL li,ri; int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d%d%d",&N,&L1,&R1,&a,&b,&c,&d);
ll[]=L1; rr[]=R1;
if(L1>R1) swap(L1,R1);
LL minl=L1,minr=R1,maxl=L1,maxr=R1;
for(LL i=;i<=N;i++)
{
ll[i]=ll[i-]*a+b;
rr[i]=rr[i-]*c+d;
li=ll[i],ri=rr[i];
if(li>ri) swap(li,ri);
if (ri<minr)
{
minl=li;
minr=ri;
}
if (li>maxl)
{
maxl=li;
maxr=ri;
}
}
bool ok=false;
//cout<<minl<<","<<minr<<" "<<maxl<<","<<maxr<<endl;
for(LL i=;i<=N;i++)
{
li=ll[i]; ri=rr[i];
if(li>ri) swap(li,ri);
//cout<<li<<","<<ri<<endl;
if((li>minr)&&(ri<maxl))
{
ok=true;
break;
}
}
if (ok) printf("YES\n"); else printf("NO\n");
}
return ;
}
5222:
并查集+拓扑排序
对于双向边联通的那些点,可以看作一个点。(因为它们任意两点之间都可以到达)
最后把这个union作为一个点,和剩下的单向边放一起构图。然后拓扑排序判断有没有环。
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define MAXN 10000000
int f[MAXN]; //father
int d[MAXN]; //->i
int nxt[MAXN];
int head[MAXN];
int ev[MAXN];
int cnt;
int N,M1,M2,T,x,y; int find(int x)
{
if (f[x]!=x)
f[x]=find(f[x]);
return f[x];
} void iunion(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if (fx!=fy)
f[fx]=fy;
} void addedge(int x,int y) //x->y
{
d[y]++; //d[i]:点i的入度
ev[cnt]=y; //ev[i]:第i条边的destination
nxt[cnt]=head[x]; //nxt[i]:第i条边的下一条边
head[x]=cnt; //head[i]:由i节点出发的第一条边的序号
cnt++;
} void topsort()
{
int res=;
vector<int>vec;
for(int i=; i<=N; i++)
if(i==find(i))
{
++res;
if(d[i]==)
vec.push_back(i);
}
for(int i=; i<vec.size(); i++)
{
int u=vec[i];
for(int j=head[u]; ~j; j=nxt[j])
{
int v=ev[j];
d[v]--;
if(!d[v])
vec.push_back(v);
}
}
int last=vec.size();
if(last!=res)
printf("YES\n");
else printf("NO\n");
} int main()
{
cin>>T;
while(T--)
{
scanf("%d%d%d",&N,&M1,&M2);
for(int i=; i<=N; i++) f[i]=i;
bool ok=false;
for(int i=; i<=M1; i++)
{
scanf("%d%d",&x,&y);
int fx=find(x),fy=find(y);
if(fx==fy) ok=true;
else f[fx]=fy;
}
cnt=;
memset(d,,sizeof(d));
memset(head,-,sizeof(head));
for(int i=; i<=M2; i++)
{
scanf("%d%d",&x,&y);
int tx=find(x),ty=find(y);
addedge(tx,ty);
}
if(ok)
{
printf("YES\n");
}
else
topsort(); } return ;
}
5223:
这题当时交给队友了。。。。
题意:给出若干L,R,A,表示gcd(p[L],p[L+1],...,p[R])=A。要求解出原数组p[]
sol:首先来看几个有代表性的情况:
1 9 7 1 9 6 1 9 8 1 9 3 1 9 4 1 9 8 1 5 3
2 5 3 2 5 4 2 5 4 2 5 7 2 5 6 2 5 4 2 7 7
stupid stupid stupid stupid stupid ok ok
对所有的L,R,A,令p[i]=lcm(p[i],A)(L<=i<=R)。最后再验证一遍
其实最后验证的时候求区间的gcd可以用优化的方法(类似RMQ的那个)。本题数据小懒得用了= =
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long LL p[]; //array
int L[],R[]; //Li,Ri
LL A[]; //Ansi
int T,N,Q; LL gcd(LL a,LL b) //辗转相除法,返回gcd(a,b)
{
if (b==) return a;
return gcd(b,a%b);
} LL lcm(LL a,LL b)
{
LL t=gcd(a,b);
t=a*b/t;
return t;
} LL ggcd(int l,int r)
{
LL aa=p[l];
for(int i=l+;i<=r;i++)
aa=gcd(aa,p[i]);
return aa;
} LL llcm(int l,int r)
{
LL aa=p[l];
for(int i=l+;i<=r;i++)
aa=lcm(aa,p[i]);
return aa;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&Q);
for(int i=;i<=;i++)p[i]=;
for(int i=;i<=Q;i++)
{
scanf("%d%d%I64d",&L[i],&R[i],&A[i]);
//LL t=llcm(L[i],R[i]);
//t=lcm(t,A[i]);
for(int j=L[i];j<=R[i];j++)
p[j]=lcm(p[j],A[i]);
//p[j]=t;
}
bool ok=true;
for (int i=;i<=Q;i++)
{
LL t=ggcd(L[i],R[i]);
// printf("%d,%d = %I64d\n",L[i],R[i],t);
if (t!=A[i]) ok=false;
}
// for(int i=1;i<=N;i++)
// printf("%d ",p[i]);
// printf("\n");
if(ok)
{
for(int i=;i<N;i++)
printf("%I64d ",p[i]);
printf("%I64d\n",p[N]);
}
else
printf("Stupid BrotherK!\n");
}
return ;
}
bestcoder杯回顾的更多相关文章
- IDDD 实现领域驱动设计-一个简单业务用例的回顾和理解
上一篇:<IDDD 实现领域驱动设计-由贫血导致的失忆症> 这篇博文是对<实现领域驱动设计>第一章后半部分内容的理解. Domain Experts-领域专家 这节点内容是昨天 ...
- 4星|《情感驱动》:可口可乐营销VP的案例回顾与经验总结
情感驱动 作者是西班牙人,1963年出生,可口可乐前营销VP. 作者大学是法律专业,毕业后5年,在西班牙开了一个律师事务所,干了1年后去读MBA.1988年进入宝洁工作,1996年跳槽到可口可乐,辗转 ...
- 【BestCoder】【Round#42】
模拟+链表+DP Orz AK爷faebdc A Growin要跟全部的n个人握手共2n杯香槟,再加上每对关系的两杯香槟,直接统计邻接矩阵中1的个数,再加2n就是answer //BestCoder ...
- 如何获取(GET)一杯咖啡——星巴克REST案例分析
英文原文:How to GET a Cup of Coffee 我们已习惯于在大型中间件平台(比如那些实现CORBA.Web服务协议栈和J2EE的平台)之上构建分布式系统了.在这篇文章里,我们将采取另 ...
- [转帖]期待下一个十年|CIS 2019温馨回顾(附PPT下载)
期待下一个十年|CIS 2019温馨回顾(附PPT下载) https://www.freebuf.com/fevents/222236.html shidongqi2019-12-06共26587人围 ...
- 程序语言与编程实践2-> 蓝桥杯C/C++备赛记录1 | 入门了解与首周训练
寒假前班主任帮我们报了名,是得好好准备准备.作为一个CSer,coding能力一定不能太弱.我反思,好久没写C/C++代码了,净是些随手写的python脚本,刚开始上手题目bug一大堆. 由于也不是啥 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
随机推荐
- 实验三 敏捷开发与XP实践
实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验 ...
- MyBatis拦截器原理探究
MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...
- PRML读书会第七章 Sparse Kernel Machines(支持向量机, support vector machine ,KKT条件,RVM)
主讲人 网神 (新浪微博: @豆角茄子麻酱凉面) 网神(66707180) 18:59:22 大家好,今天一起交流下PRML第7章.第六章核函数里提到,有一类机器学习算法,不是对参数做点估计或求其分 ...
- [MCSM]伪随机数和伪随机数生成器
1. 几个问题 为什么需要随机数? 伪随机数伪在哪里? 为何要采用伪随机数代替随机数?这种代替是否有不利影响? 如何产生(伪)随机数? 以下内容将围绕这几个问题依次说明. 2. 参考 http://e ...
- TortoiseSVN安装使用(转)
TortoiseSVN是windows平台下Subversion的免费开源客户端. 一般我们都是先讲讲服务器的配置,然后再讲客户端的使用,但是在TortoiseSVN上,却可以反过来.因为,如果你的要 ...
- web安全——代理(nginx)
场景 过滤非正常用户使用的http请求. 限制正常用户使用的范围(下载速度.访问频率等). 通过架构规划来提升安全. 能自动解决http请求问题. 解决方案 代理自身的安全 千万不要使用root启动! ...
- 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1766 Solved: 946[Submit][Status ...
- STL中algorithm里的查找
首先,选择查找算法时,区间是否排序是一个至关重要的因素.可以按是否需要排序区间分为两组: A. count,find B. binary_search,lower_bound,upper_bound, ...
- Linux(Ubuntu)下如何安装JDK
一.下载 首先,当然是要下载了. 按照需要选择不同的版本.笔者选择的是 jdk-7u45,如图: 二. 解压 将下载下来的 .tar.gz 文件解压. 使用如下命令解压: sudo tar zxvf ...
- c#学习<一> 基础知识
http://www.25hoursaday.com/CsharpVsJava.html ECMA-334 关键字 累计103 个,其中关键字77个,上下文关键字26个.(c#5.0) 标识符 1. ...