【UOJ Round #3】
枚举/二分
C题太神窝看不懂……
核聚变反应强度
QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵。。。
正解是先找到a[1]的所有质因数啊……然后在刚刚那个算法的“枚举gcd的约数”的时候直接枚举这些质因数就好了……
//UOJ Round3 A
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline LL getint(){
LL r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=(v<<)+(v<<)-''+ch;
return r*v;
}
const int N=1e6+;
/*******************template********************/ int n,tot,cnt;
LL a[N],b[N],prime[N];
bool vis[N];
inline LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
n=getint();
F(i,,n) a[i]=getint();
for(LL i=;i*i<=a[];i++)
if (!vis[i]){
prime[++tot]=i;
for(LL j=i+i;j*j<=a[];j+=i) vis[j]=;
}
F(i,,tot) if (a[]%prime[i]==) b[++cnt]=prime[i];
LL tmp;
F(i,,n){
tmp=gcd(a[],a[i]);
if (tmp==) {printf("-1 "); continue;}
bool sign=;
F(j,,cnt)
if (tmp%b[j]==){
printf("%lld ",tmp/b[j]);
sign=;
break;
}
if (sign) printf("1 ");
}
return ;
}
铀仓库
题解好神啊……如果要直接计算T时间以内能搬几个箱子,那么我们需要枚举s,然后再算每个s在T时间内能搬多少。
一看就感觉要爆呀。。。
解决方法是二分= =将最优性问题转化成判定性问题,现在我们的问题就是:给定一个箱子数量K,问最短的时间是多少。
这样的话我们仍旧可以枚举s,但是由于箱子数是固定的,所以我们根据s-1的答案可以比较方便地得到s的答案。
实现细节方面:我们在放弃左端点箱子而去搬右端点箱子的时候,需要维护一下是哪边先归零……然而我写分类讨论写了好长啊……而@delayyy神犇很简短的就处理完了……事实上我好像想多了……并不需要分类讨论……只要每次取最小值?。。。就可以了……
//UOJ Round3 B
//orz delayyy
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=5e5+;
/*******************template********************/ int n,a[N],x[N],use[N];
LL t,s[N];
inline LL d(int i,int j){return x[j]-x[i];}
inline LL sum(int l,int lc,int r,int rc){
return l==r ? rc-lc : s[r-]-s[l]+a[l]-lc+rc;
}
bool check(LL K){
int l=,lc=,r=n+,rc=; LL cur=,sa=;
F(i,,n){
if (sa+a[i]<=K) sa+=a[i],cur+=d(,i)*a[i];
else {r=i,rc=K-sa,cur+=d(,i)*rc; break;}
}
if (cur<=t) return ; F(i,,n){
cur+=d(i-,i)*(sum(l,lc,i,)-sum(i,,r,rc));
while(r<=n && d(l,i)>d(i,r)){
int z=min(a[l]-lc,a[r]-rc);
cur+=(d(i,r)-d(l,i))*z;
if (lc+=z,lc>=a[l]) ++l,lc=;
if (rc+=z,rc>=a[r]) ++r,rc=;
}
if (cur<=t) return ;
}
return ;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
n=getint(); scanf("%lld",&t); t/=;
F(i,,n) x[i]=getint();
F(i,,n) a[i]=getint(),s[i]=s[i-]+a[i]; LL L=,R=s[n],mid,ans=;
while(L<=R){
mid=L+R>>;
if (check(mid)) ans=mid,L=mid+;
else R=mid-;
}
printf("%lld\n",ans);
return ;
}
【UOJ Round #3】的更多相关文章
- 【UOJ Round #5】
构造+贪心/数论 为什么只有两个标题呢……因为第二题我不会…… 怎样提高智商 构造题……然而一开始半天我都yy不出来…… 后来我想:这题应该不会特别麻烦,而且既然样例只给了1,可能再给大一点就让人发现 ...
- 【UOJ Round #1】
枚举/DP+排列组合 缩进优化 QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$ 然而 ...
- 【UOJ Round #8】
A 一道不错的题,虽然大家都觉得是水题,然而蒟蒻我想出来的好慢……Orz alpq 发现其实就是一个网格图,每一个大块都是同一颜色……横纵坐标互不干扰…… //UOJ Round #8 A #incl ...
- 【CS round 34】Minimize Max Diff
[题目链接]:https://csacademy.com/contest/round-34/task/minimize-max-diff/ [题意] 给你n个数字; 数组按顺序不下降; 让你删掉k个数 ...
- 【CS Round 34】Max Or Subarray
[题目链接]:https://csacademy.com/contest/round-34/summary/ [题意] 让你找一个最短的连续子串; 使得这个子串里面所有数字or起来最大; [题解] 对 ...
- UOJ #30【CF Round #278】Tourists
求从$ x$走到$ y$的路径上可能经过的最小点权,带修改 UOJ #30 $ Solution:$ 如果两个点经过了某个连通分量,一定可以走到这个连通分量的最小值 直接构建圆方树,圆点存原点的点权 ...
- UOJ #30. 【CF Round #278】Tourists
Description Cyberland 有 n 座城市,编号从 1 到 n,有 m 条双向道路连接这些城市.第 j 条路连接城市 aj 和 bj.每天,都有成千上万的游客来到 Cyberland ...
- 【57.97%】【codeforces Round #380A】Interview with Oleg
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【42.86%】【Codeforces Round #380D】Sea Battle
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
随机推荐
- 常见Java库漏洞汇总
1.ActiveMQ 反序列化漏洞(CVE-2015-5254) ref:https://www.nanoxika.com/?p=408 Apache ActiveMQ是美国阿帕奇(Apache)软件 ...
- 使用Vmware安装linux且配置终端可以连接虚拟机总结
首先是下载一个linux镜像,我下载的是:ubuntu-16.04.2-desktop-amd64.iso 1.使用vmware安装linux,都使用默认的配置就行了,最多改一下主机名什么的,密码最好 ...
- Android View事件分发-从源码分析
View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...
- HTML5开启浏览器桌面通知 Web Notification
说明: 1.Chrome要求必须https才可以开启浏览器通知 2.显示图片在本服务器,不支持跨越 3.自定义声音Chrome不播放,Firefox正常播放 代码如下: <!-- /** * @ ...
- listview重新计算高度
将xml中的ListView改用下面的ListViewForScrollView //ScrollView中嵌入ListView,让ListView全显示出来 public class ListVie ...
- BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
题目链接 后缀数组做法见这. 直接SAM+map.对于每个节点其产生的不同子串数为len[i]-len[fa[i]]. //15932kb 676ms #include <map> #in ...
- 笔记本光驱位置装SSD固态硬盘(亲自试验)
我的笔记本买的早了,2010年的联想Z460,速度有点慢,本来想换台电脑,想想还是算了,没有太大必要.固态硬盘便宜了,于是在原来的光驱位置装了一个256G的SSD固态硬盘,现在的性能能达到刚买来时的1 ...
- Codeforces Round #370 (Div. 2) B. Memory and Trident 水题
B. Memory and Trident 题目连接: http://codeforces.com/contest/712/problem/B Description Memory is perfor ...
- Graph database_neo4j 底层存储结构分析(2)
3 neo4j存储结构 neo4j 中,主要有4类节点,属性,关系等文件是以数组作为核心存储结构:同时对节点,属性,关系等类型的每个数据项都会分配一个唯一的ID,在存储时以该ID 为数组的 ...
- Fiddler可以支持Websocket抓包了
今天试了一下,Fiddler已经可以支持客户端Websocket抓包了,并且查看的方式也非常方便. websocket作为一个标准的应用层的协议,在CS端程序用起来也比传统的tcp协议方便了,比较常见 ...