// 好久没更博客了,最近打了很多场练习赛&校内PK赛,大概自闭忙于补题吧

// 9.26 周四练习赛

A. Kolkhozy

题意

有 n 个数 \(f[i]\) ,有 q 次询问(l, r, x, m),求 [l, r] 区间内有多少项满足 \(f[i] \%m=x\)。

思路

直接暴力的话复杂度 \(O(q\cdot n)\) ,注意到此题空间给了1024MB,如果能预处理一部分,可以\(O(q \cdot logn)\) 解决。

对于m比较大的情况,我们发现直接找[l, r]区间内等于 \(x + k*m\) 的个数即可,那么可以统计每个点值出现的位置,二分检查是否包含在 [l, r]区间,复杂度 \(O(q \cdot maxf[i]/m \cdot logn)\) ,取 m = 300 在时空复杂度上均可行。

vector牛逼就完事了!

AC代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
typedef long long ll; using namespace std;
vector<int> ans[310][310];
int f[50010];
int maxf;
vector<int> cnt[50010]; int n, q;
int main() {
cin>>n>>q;
maxf = 0;
for(int i=1;i<=n;i++) {
scanf("%d", &f[i]);
cnt[f[i]].push_back(i);
maxf = max(maxf, f[i]);
} for(int m=2;m<=300;m++) {
for(int i=1;i<=n;i++) {
ans[m][f[i]%m].push_back(i);
}
} int l, r, x, m;
while(q--) {
scanf("%d %d %d %d", &l, &r, &x, &m);
if(m==1) {
if(x==0)
printf("%d\n", r-l+1);
else
printf("0\n");
continue;
} if(m<=300) {
int L = lower_bound(ans[m][x].begin(), ans[m][x].end(), l) - ans[m][x].begin();
int R = upper_bound(ans[m][x].begin(), ans[m][x].end(), r) - ans[m][x].begin();
printf("%d\n", R - L);
continue;
} ll ans = 0;
for(int v=x;v<=maxf;v+=m) {
int L = lower_bound(cnt[v].begin(), cnt[v].end(), l) - cnt[v].begin();
int R = upper_bound(cnt[v].begin(), cnt[v].end(), r) - cnt[v].begin();
ans += R - L;
}
printf("%lld\n", ans);
} return 0;
}

 

F. Forbechenko v Rodvsky

题意

1/3 在十进制下的小数表示为 0.33333…,在3进制下为 0.1。给定 \(A \over B\) ,求最小的进制使其表示成小数的位数是有限的。

思路

很好想,可以发现A,B约分之和,最小的进制就是B的素因子之积。

那么问题转化为质因数分解。然后一看过了那么多写了个暴力根号n的算法T了。

队友翻到了Pollard-Rho的板子,然后敲上去就A啦。

#include<cstdio>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std; typedef long long ll;
const int S= 8;
ll qmul(ll a,ll b,ll c) {
a %= c;
b %= c;
ll ret = 0;
ll tmp = a;
while(b) {
if(b&1) {
ret += tmp;
if(ret>c)ret -=c;
}
tmp<<=1;
if(tmp>c)tmp -=c;
b>>=1;
}
return ret;
}
ll qpow(ll a,ll n,ll mod) {
ll ret = 1;
ll tmp = a%mod;
while(n) {
if(n&1)
ret = qmul(ret,tmp,mod);
tmp = qmul(tmp,tmp,mod);
n>>=1;
}
return ret;
}
// 判断是否是合数
bool check(ll a,ll n,ll x,ll t) {
ll ret = qpow(a,x,n);
ll last = ret;
for(int i=1;i<=t;++i) {
ret = qmul(ret,ret,n);
if(ret==1&&last!=1&&last!=n-1)
return true;
last = ret;
}
if(ret!=1) return true;
else return false;
}
// ****************************
// Miller_Rabin算法判断是否是素数
bool Miller_Rabin(ll n) {
if(n<2)return 0;
if(n==2)return 1;
if((n&1)==0)return 0;
ll x= n-1;
ll t =0;
while((x&1)==0) {
x>>=1;
++t;
}
srand(time(NULL));
for(int i=0;i<S;++i) {
ll a = rand()%(n-1)+1;
if(check(a,n,x,t))
return 0;
}
return 1;
}
// ***************************
// pollard_rho算法进行质因数分解
ll factor[100];
int tol; ll gcd(ll a,ll b) {
ll t;
while(b) {
t = a;
a = b;
b = t%b;
}
if(a>=0)return a;
else return -a;
}
ll pollard_pho(ll x,ll c) {
ll i=1, k=2;
srand(time(NULL));
ll x0 =rand()%(x-1)+1;
ll y = x0;
while(1) {
i++;
x0 = (qmul(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if(d!=1&&d!=x) return d;
if(y==x0) return x;
if(i==k) {
y=x0;
k+=k;
}
}
}
void findfac(ll n,int k) {
if(n==1)return;
if(Miller_Rabin(n)) {
factor[tol++] = n;
return;
}
ll p =n;
int c= k;
while(p>=n)
p = pollard_pho(p,c--);
findfac(p,k);
findfac(n/p,k);
} int main() {
ll a, b;
scanf("%lld %lld", &a, &b);
b = b/gcd(a, b);
if(b==1) {
return 0* printf("2\n");
} findfac(b, 107);
sort(factor, factor+tol);
tol = unique(factor, factor+tol) - factor; ll res = 1;
for(int i=0;i<tol;i++) {
res *= factor[i];
}
printf("%lld\n", res); return 0;
}

 

G. Hunting leshys

题意

有 n 个部落(那单词啥意思我也不知道),初始每个人是一个部落,每个人有power p[i],有 两种操作,(! i, j) :i成为j的首领;(? i):询问 i 到他的最终首领(根节点)之间的最小权值。

思路

一看就是并查集,然后队友演了我,写了假算法。(并不是求整条链上的最小权值所以不可以直接压缩路径),然后告诉我并查集好像做不了,需要树链剖分。。。

然后我xjb写了就A了。(路径压缩时维护当前节点到根节点之间的最小权值)

AC代码

#include<cstdio>
#include<iostream>
typedef long long ll;
using namespace std; const int N = 1e5+10;
int arr[N];
int fa[N];
int find(int x)
{
if(x==fa[x]) return x;
int root = find(fa[x]);
arr[x] = min(arr[x], arr[fa[x]]);
return fa[x] = root;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
scanf("%d",&arr[i]);
fa[i] = i;
}
while(m--) {
char op[3];
scanf("%s", op);
if(op[0]=='?') {
int a;
scanf("%d",&a);
int fa = find(a);
printf("%d\n", arr[a]);
}
else {
int a, b;
scanf("%d%d",&a, &b);
fa[b] = a;
}
}
return 0;
}

 

H. Course recommendation

题意

队友写的,据说是SB题,题意没表述清楚白白浪费一小时。。。

 

I. Sobytiynyy Proyekt Casino

题意

看了很久,根据样例大概理解为:有 n 个 玩家,每个人有一个整数对 (ai, bi),玩家 i 离开时可以获得 \(\sum_{j=1}^{i} a_j - b_i\) 硬币,每个玩家可以在随意离开游戏。现在你可以决定玩家的顺序,求所有玩家获取的最多硬币的最小值。

思路

卡了半天,大概证明出来 按照 bi 递增的顺序安排,可以使玩家收益最小。

AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll; struct node {
ll a, b;
bool operator<(const node& n) const {
return b<n.b;
}
}arr[100010];
int main() {
int n; cin>>n;
for(int i=1;i<=n;i++) {
scanf("%lld %lld", &arr[i].a, &arr[i].b);
} sort(arr+1, arr+1+n);
ll sum = arr[1].a, ans = arr[1].a-arr[1].b;
for(int i=2;i<=n;i++) {
sum += arr[i].a;
ans = max(ans, sum-arr[i].b);
}
printf("%lld\n", ans);
return 0;
}

 

K. Poor Folk

题意

给了一堆值,求这些值不能组成的最小整数。

思路

队友A的,稍后理解一下。

AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll arr[500010];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;++i)
cin>>arr[i];
sort(arr+1,arr+1+n);
ll now = 0;
for(int i=1;i<=n;++i)
{
if(now+1<arr[i])
{
cout<<now+1<<endl;
break;
}
else
now+=arr[i];
if(i==n)
cout<<now+1<<endl;
}
return 0;
}

(完)

2019 USP Try-outs 练习赛的更多相关文章

  1. NOIWC 2019 冬眠记【游记】

    在我的blog查看:https://www.wjyyy.top/wc2019 Day -1 上火车了,but手机没电了. Day 0 中午1点左右到了广州东站.接站只有南站和机场有,于是坐了一个多小时 ...

  2. 自动驾驶研究回顾:CVPR 2019摘要

    我们相信开发自动驾驶技术是我们这个时代最大的工程挑战之一,行业和研究团体之间的合作将扮演重要角色.由于这个原因,我们一直在通过参加学术会议,以及最近推出的自动驾驶数据集和基于语义地图的3D对象检测的K ...

  3. 2019年台积电进军AR芯片,将用于下一代iPhone

    近日,有报道表示台积电10nm 芯片可怜的收益率可能会对 2017 年多款高端移动设备的推出产生较大的影响,其中自然包括下一代 iPhone 和 iPad 机型.不过,台积电正式驳斥了这一说法,表明1 ...

  4. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  5. 51nod百度之星2016练习赛

    今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. (5.26UPD:E题想粗来了) A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min ...

  6. VS经常报错的link error 2019

    VS经常报错的link error 2019 原因如下: 可能是找得到头文件,但是相关的dll或者lib找不到,需要在配置里面添加相应的库文件. project=>configuration.. ...

  7. YTU 2019: 鞍点计算

    2019: 鞍点计算 时间限制: 1 Sec  内存限制: 64 MB 提交: 66  解决: 30 题目描述 找出具有m行n列二维数组Array的"鞍点",即该位置上的元素在该行 ...

  8. 暑假练习赛 003 F Mishka and trip

    F - Mishka and trip Sample Output   Hint In the first sample test: In Peter's first test, there's on ...

  9. Windows Server 2019 预览版介绍

    在Windows server 2012.Windows server 2016还未完全普及的情况下,昨天Windows Server团队宣布Windows Server 2019将在2018年的下半 ...

随机推荐

  1. python内置模块-json和pickle

    安装第三方库     pip3 install requests     源码安装:下载源码,解压后切换到当前目录     执行python setup.py install   json和pickl ...

  2. git 问题整理 fetch -p 修剪远程分支

    修剪远程分支 问题描述 前提:假设现在远程有三个分支master.testA.testB 问题:使用命令 git fetch origin 获取到远程分支,然后使用命令 git branch -r 来 ...

  3. 微软引入了两种新的网络过滤系统,WFP和NDISfilter

    Windows 8是微软公司推出的最新的客户端OS,内部名称Windows NT 80.相对于Windows NT 5.x,其网络结构变化非常大,原有的TDI,NDIS系统挂接方法不再适用.在Wind ...

  4. 12、jquery的tree组件

    1. <!--jquery 的主文件...--> <script type="text/javascript" src="../../js/jquery ...

  5. 1、postman介绍与安装

    postman介绍 官方介绍:Developers use Postman to build modern software for the API-first world. 个人理解postman是 ...

  6. flex上下、左右居中

    tip:1)flex是用于div布局用的,作用于一级子元素(父元素写样式,作用于子元素) 2)弹性盒模型 3)英文解释justify-content: 对齐内容(内容一般写在主轴上)align-ite ...

  7. 剑指offer——40字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  8. 前端(十六)—— JavaScript盒子模型、JS动画、DOM、BOM

    JS盒子模型.JS动画.DOM.BOM 一.JS盒模型 1.width | height parseInt(getComputedStyle(ele, null).getPropertyValue(' ...

  9. XStream环境设置

    为Windows 2000/XP设置路径: 假设安装在c:Program Filesjavajdk目录: 在“我的电脑”右键单击并选择“属性”. 在“高级”选项卡下单击“环境变量”按钮. 现在,改变“ ...

  10. Linux 安装 python3.6

    Linux下安装Python3.6和第三方库   如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!! ...