ACM-ICPC 2018 徐州赛区网络赛

 去年博客记录过这场比赛经历:该死的水题

 一年过去了,不被水题卡了,但难题也没多做几道。水平微微有点长进。

 

 

D. Easy Math

题意:

  给定 \(n\), \(m\) ,求 \(\sum _{i=1}^{m} \mu(in)\) 。其中 $ 1 \le n \le 1e12$ , $ 1 \le m \le 2e9$ ,\(\mu(n)\) 为莫比乌斯函数。

 

思路:

  容易知道,\(i\) 与 \(n\) 不互质时, \(\mu(in)\) 恒为0。又由于互质时,\(\mu(in) = \mu(i) \mu(n)\) 。

  设 $$F(n,m)=\sum_{i=1}^{m}\mu(i\cdot n)$$

  则有$$F(n,m)=\mu(n)\cdot\sum_{i=1}^{m}\mu (i)\cdot[gcd(i,n)1]$$

  由$$\sum_{d|n}^{ } \mu(d)=[n1]$$

\[F(n,m)=\mu(n)\cdot\sum_{i=1}^{m}\mu (i) \cdot \sum_{d|gcd(i,n)}^{ }\mu(d)
\]

\[F(n,m)=\mu(n)\cdot\sum_{d|n}^{d\leqslant m}\mu(d)\cdot\sum_{i=1}^{\left \lfloor \frac{m}{d} \right \rfloor}\mu(i\cdot d)
\]

\[F(n,m)=\mu(n)\cdot\sum_{d|n}^{d\leqslant m}\mu(d)\cdot F(d,\left \lfloor \frac{m}{d} \right \rfloor)
\]

 推出递推式后,可以递归求解。

 当n=1时,有 \(muSum(n)=\sum_{i=1}^{m}\mu(i)\) ,这个和式利用莫比乌斯反演(杜教筛),结果为 \(muSum(n)=1-\sum_{i=2}^{n}muSum(\left \lfloor \frac{n}{i} \right \rfloor)\),详见我的博客

 

AC代码:

#include<iostream>
#include<cstdio>
#include<unordered_map>
using namespace std;
const int maxn = 2000000;
typedef long long ll; ll prime[maxn+5];
int tot;
bool vis[maxn+5];
ll mu[maxn+5];
ll Smu[maxn+5]; void getP(int n) {
vis[1] = 1;
mu[1] = 1;
prime[0] = 1;
for(int i=2;i<=n;i++) {
if(!vis[i]) {
prime[++tot] = i;
mu[i] = -1;
} for(int j=1;j<=tot && i*prime[j]<=n;j++) {
vis[i*prime[j]] = 1;
if(i%prime[j])
mu[i*prime[j]] = -mu[i];
else {
mu[i*prime[j]] = 0;
break;
}
}
} for(int i=1;i<=maxn;i++) {
Smu[i] = Smu[i-1] + mu[i];
}
} unordered_map<int, ll> Sum;
ll muSum(ll n) {
if(n<=maxn) return Smu[n];
if(Sum.count(n)) return Sum[n]; ll res = 0;
for(ll l=2,r;l<=n;l=r+1) {
r = n/(n/l);
res += (r+1-l) * muSum(n/l);
}
return Sum[n] = 1-res;
}
ll getmu(ll n) {
if(n<=maxn) return mu[n];
ll k = 1;
for(ll i=2;i*i<=n;i++) {
if(n%i==0) {
if(n%(i*i)==0)
return 0;
k *= -1;
n /= i;
}
}
if(n>1)
k *= -1;
return k;
}
ll f(ll m, ll n) {
if(m==0) return 0;
if(m==1) return getmu(n);
if(n==1) return muSum(m); ll res = 0;
for(ll d=1;d*d<=n && d<=m;d++) {
if(n%d==0) {
res += getmu(d)*f(m/d, d);
if(n/d<=m) res += getmu(n/d)*f(m/(n/d), n/d);
}
}
return getmu(n)*res;
} ll m, n;
int main() {
getP(maxn);
cin>>m>>n;
cout<<f(m, n)<<endl; return 0;
}

 

F. Features Track

题意:

 给出 \(n\) 个时刻(帧)猫的状态,每个状态用 \(<a, b>\) 表示。如果相同的状态在多个连续时刻出现,则构成了一种运动。求最长的这种运动。

 

思路:

 签到题,SLT map pair的使用。注意状态去重!!!

 

AC代码:

点击查看代码
#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
#include<algorithm>
using namespace std; typedef pair<int, int> pii;
map<pii, int> S; int id;
const int maxn = 100100;
vector<int> arr[maxn]; int ID(pii a) {
if(S.find(a)!=S.end()) return S[a];
return S[a]=++id;
} int main() {
int t; cin>>t;
while(t--) {
int n, k, maxid = 0;
scanf("%d", &n);
for(int i=1;i<=n;i++) {
scanf("%d", &k);
while(k--) {
int a, b;
scanf("%d %d", &a, &b);
int id = ID(make_pair(a, b));
arr[id].push_back(i);
// cout<<id<<' '<<i<<endl;
maxid = max(maxid, id);
}
}
int ans = 0;
for(int i=1;i<=maxid;i++) {
if(arr[i].size()==0) continue;
else if(arr[i].size()==1) {
ans = max(ans, 1);
continue;
}
sort(arr[i].begin(), arr[i].end());
unique(arr[i].begin(), arr[i].end()); // 去重!!! int now = 1;
for(int j=1;j<arr[i].size();j++) {
if(arr[i][j]==arr[i][j-1]+1) {
ans = max(ans, ++now);
} else {
now = 1;
} }
}
printf("%d\n", ans); id = 0;
S.clear();
for(int i=1;i<=maxid;i++)
arr[i].clear();
} return 0;
}

 

H. Ryuji doesn't want to study

题意:

 有 \(n\) 本书,每本书分别有 \(a[i]\) 的知识点。看书从 \(l\) 到 \(r\) 能得到的知识点为 \(a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r]\) ,其中 \(L = r - l + 1\) 。有 次询问,询问分为两种 1. 询问\([l, r]\) 区间的知识点。 2. 将第 \(b\) 本书知识点改为 \(c\) 。

 

思路:

​ 稍微推导一下公式,可以发现可以维护两段前缀和 \(sum1[n] = \sum_{1}^{n} a_i\) 与 \(sum2[n] = \sum_{1}^{n} ia_i\) ,那么\(ans[l, r] = (sum2[r]-sum2[l-1]) - (n-r)(sum2[r]-sum2[l-1])\) ,于是用树状数组很快就写出来了。

​ 注意add函数里应该为 \(x\le n\) ,开始写小于WA了一发。。。

​ 改成线段树,爆了 ll 又WA了一次

 

AC代码:

树状数组写法

#include<iostream>
#include<cstdio>
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef long long ll;
const int maxn = 100100; ll C1[maxn];
ll C2[maxn];
int n, q;
ll arr[maxn]; void add(ll C[], int x, ll val) {
while(x<=n) {
C[x] += val;
x += lowbit(x);
}
} ll sum(ll C[], int x) {
ll res = 0;
while(x) {
res += C[x];
x -= lowbit(x);
}
return res;
} int main() {
cin>>n>>q;
for(int i=1;i<=n;i++) {
ll val;
scanf("%lld", &val);
arr[i] = val;
add(C1, i, val);
add(C2, i, val*(n+1-i));
} while(q--) {
int op;
ll l, r;
scanf("%d %lld %lld", &op, &l, &r);
if(op==1) {
ll Sum1 = sum(C2, r) - sum(C2, l-1);
ll Sum2 = sum(C1, r) - sum(C1, l-1);
printf("%lld\n", Sum1 - Sum2*(n-r));
} else {
add(C1, l, r-arr[l]);
add(C2, l, (r-arr[l])*(n+1-l));
arr[l] = r;
}
}
return 0;
}

 

线段树写法

点击查看代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std; #define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
#define MID (l+r)>>1
const int maxn = 100010;
typedef long long ll; ll t1[maxn<<2];
ll t2[maxn<<2];
ll arr[maxn];
int n; void build(ll t[], bool f, int rt, int l, int r) {
if(l==r) {
if(f)
t[rt] = arr[l];
else
t[rt] = arr[l]*(n+1-l);
return;
}
int mid = MID;
build(t, f, lson);
build(t, f, rson);
t[rt] = t[rt<<1] + t[rt<<1|1];
} void update(ll t[], int pos, ll val, int rt, int l, int r) {
if(l==r) {
t[rt] += val;
return;
} int mid = MID;
if(pos<=mid)
update(t, pos, val, lson);
else
update(t, pos, val, rson); t[rt] = t[rt<<1] + t[rt<<1|1];
} ll query(ll t[], int L, int R, int rt, int l, int r) {
if(L<=l && R>=r) {
return t[rt];
} ll ans = 0;
int mid = MID;
if(L<=mid)
ans += query(t, L, R, lson);
if(mid<R)
ans += query(t, L, R, rson);
return ans;
} int main() {
int q;
scanf("%d %d", &n, &q);
for(int i=1;i<=n;i++) {
scanf("%lld", &arr[i]);
} build(t1, 1, 1, 1, n);
build(t2, 0, 1, 1, n); while(q--) {
int op;
ll l, r;
scanf("%d %d %d", &op, &l, &r);
if(op==1) {
ll sum1 = query(t1, l, r, 1, 1, n);
ll sum2 = query(t2, l, r, 1, 1, n);
sum2 -= sum1 * (n-r);
printf("%lld\n", sum2);
} else {
update(t1, l, r-arr[l], 1, 1, n);
update(t2, l, (r-arr[l])*(n+1-l), 1, 1, n); arr[l] = r;
}
}
return 0;
}

 

I. Characters with Hash

题意:

  水题,签到。

 

AC代码:

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std; char str[1000100];
int main() {
int t; cin>>t;
while(t--) {
int n; char c;
cin>>n>>c;
scanf("%s", str);
int s = 0;
while(s<n && str[s]==c) ++s;
if(s==n) {
printf("1\n");
continue;
}
if(abs(str[s]-c)>=10) {
printf("%d\n", (n-s)*2);
} else {
printf("%d\n", (n-s)*2-1);
}
}
return 0;
}

ICPC 2018 徐州赛区网络赛的更多相关文章

  1. ACM-ICPC 2018 徐州赛区(网络赛)

    目录 A. Hard to prepare B.BE, GE or NE F.Features Track G.Trace H.Ryuji doesn't want to study I.Charac ...

  2. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  3. 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)

    H.Ryuji doesn't want to study 27.34% 1000ms 262144K   Ryuji is not a good student, and he doesn't wa ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)

    传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

    262144K   Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track

    262144K   Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 I. Characters with Hash

    Mur loves hash algorithm, and he sometimes encrypt another one's name, and call him with that encryp ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 D 杜教筛 前缀和

    链接 https://nanti.jisuanke.com/t/31456 参考题解  https://blog.csdn.net/ftx456789/article/details/82590044 ...

随机推荐

  1. 程序‘vim’已包含在下列软件包中

    解决方法: 输入:sudo apt-get install ctags 输入:sudo apt-get install vim 输入:sudo ./config.sh (亲测有效)输入:vim tes ...

  2. Delphi 数学函数:常用的几个数学函数(Power、Abs、Int、Trunc、Round、Frac、sqr、sqrt)

    Delphi 常用的几个数学函数 1 Power函数,求次方 定义:function Power(X,Y): (Same type as parameter); 说明:X可以是整型,也可以是实型:返回 ...

  3. MaxCompute问答整理之9月

    本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.如何查看information_schema的tables? 在使用OD ...

  4. kafka的简单命令

    启动kafka自带的zookeeper ./bin/zookeeper-server-start.sh config/zookeeper.properties & 启动kafka ./bin/ ...

  5. <Java编程思想>读书笔记(1)-对象导论、一切都是对象

    1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...

  6. NApache+JBOSS架构方案

    NApache+JBOSS架构方案在技术上是可行的: 在公司的3台电脑上安装APACHE,在我的电脑上安装一个jboss,按照apache与jboss的通信要求配置(参考集群配置),就可以实现IE访问 ...

  7. CSS3:教程

    ylbtech-CSS3:教程 1.返回顶部 1. CSS3 教程 CSS 用于控制网页的样式和布局. CSS3 是最新的 CSS 标准. 本教程向您讲解 CSS3 中的新特性. 开始学习 CSS3! ...

  8. socket的多线程实现

    步骤: 1.服务端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建socket并请求与服务端对话: 3.服务端接收客户端的请求,创建socket与客户端进行专线连 ...

  9. Java High Level REST Client 中文API(仅供参考)

    1.初始化 兼容性 Java High Level REST Client需要Java 1.8,并依赖于Elasticsearch核心项目,客户端版本与客户端开发的Elasticsearch版本相同, ...

  10. USACO2008 Cow Cars /// oj23323

    题目大意: N (1 ≤ N ≤ 50,000)头牛被编号为1-N,牛i可以在M(1 ≤ M ≤ N)条不同的高速路上以Si (1 ≤ Si ≤ 1,000,000) km/h的速度飞驰 为了避免相撞 ...