/*
for me,开训第一天
/beacuse 文化课太差被抓去补文化课了...
看一眼题 : AK局?
但是,Wa on test #10 in problem C
290! (就差那么一咪咪)
膜 _AK的_郝竟成 (id确实是这个) 说AK就AK了...
  他踩了STD 阿!
(我)下午溜出去社会实践3h(with hjc)
*/

今天的题目好像都是一眼题:

Problem A  百万小小兵(Millian)

问[1,n]和n不互质的数有几个?

Solution: 在某同学在计算打表的时间的时候,默默的打开C++,写了n-Phi(n) 写完。

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e6+;
bool pr[N];
int prime[N];
int cnt=;
int phi[N];
void EouLaSha(int lim)
{
pr[]=pr[]=true;
for (int i=;i<=lim;i++) {
if (!pr[i]) prime[cnt++]=i;
for (int j=;j<cnt&&i*prime[j]<=lim;j++) {
pr[i*prime[j]]=true;
if (i%prime[j]==) break;
}
}
}
int Phi(int x)
{
EouLaSha(1e6);
int p=,ph=x;
for (;;){
int nowprime=prime[p];
if (nowprime>x||p==cnt) break;
if (x%nowprime==) ph=ph/nowprime*(nowprime-);
while (x%nowprime==) x/=nowprime;
p++;
}
if (x>) ph=ph/x*(x-);
return ph;
}
signed main()
{
int n; cin>>n;
cout<<n-Phi(n)<<'\n';
return ;
}

Problem B 弹药分配(TNT)

维护一个数组w[],有两个操作:

1 a b k c : 把i∈[a,b]中,且i满足(i-a)%b==k的 w[i] += c

2 p :  询问w[p]的值

其中 n<=4e5,m<=4e5,答案不超过maxlongint

对于所有数据 , k∈[1,10]

Hint : 随机数据(真的!) 暴力(考试时A了,我把它卡了)

Solution: 其实这个问题是分段线段树的问题,显然k的取值很小,首先mod k 有10种情况,mod k = t,t的取值有10种情况

就开100棵树状数组,其中(i,j,k)表示一棵树状数组描述(k=i%j)这颗树状数组,然后树状数组维护差分前缀和(就是原数组w)

考虑区间操作a,b,k,c 拆成 a-1单点模数是k余数是a%k 单点加上c,仅仅考虑对(i,k,a%k),只从i=a开始改变i,其他2参数不变。

拆成b单点模数是k,余数是a%k 单点减去c,仅仅考虑(i,k,a%b)只从i=b开始改变i,其他两个参数不变。

这是基于一个区间的变化只会在和这段区间中的点i∈[a,b]和a取模相等的才有贡献(这是显然的)这里相当于更新i∈[a,b]和a取模相等这一个树状数组。

然后注意=0的越界情况,一直上不去(这里把倒过来建树状数组【后缀和】)

# include <bits/stdc++.h>
# define fp(i,s,t) for (int i=s;i<=t;i++)
# define lowbit(x) (x&(-x))
using namespace std;
const int N=7e4+;
int c[N][][],a[N];
//c[i][j][mod] 表示i%j=mod差分前缀和
int n,m;
inline int read(int &x)
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
x=w?-X:X;
}
inline void write(int x)
{
if (x<) {x=-x;putchar('-');}
if (x>) write(x/);
putchar(''+x%);
}
void update(int x,int k,int mod,int opx)
{
if (x==) return;
for (;x;x-=lowbit(x)) {
c[x][k][mod]+=opx;
}
}
int query(int x,int k)
{
int ret=;
for (;x<=n;x+=lowbit(x)) {
for (int j=;j<=;j++)
ret+=c[x][j][k%j];
}
return ret;
}
int main()
{
read(n);
fp(i,,n) read(a[i]);
read(m);
while (m--) {
int t; read(t);
if (t==) {
int l,r,k,val;
read(l); read(r); read(k); read(val);
update(l-,k,l%k,-val); update(r,k,l%k,val);
} else {
int l; read(l);
write(query(l,l)+a[l]); putchar('\n');
}
}
return ;
}

 Problem C  家园重建

给出n个点m条边的无向图, 求取边权最大的边构成的图,满足每个联通块都最多只有1个环。

对于100%的数据 n<=300

Solution: 首先没算好复杂度,点是n<=300,若是完全图边数就是n2条,想的应该不是O(n3)算法,至少是O(n2),导致一开始没出来,当然后面出来了

我们考虑这样一个贪心,首先假设构造同样的图形(指形态一样即每个连通块的元素个数一样),显然是选每个联通块中的最大边权(Kruscal算法)

然后考虑吧可以多出1个环,那么就用并查集维护,如果这两个点u,v之间有一条边了,而且是剩下边里面最大的,我判断u,v可不可以加,如果可以的话就加入,不行的话就下一条边,至加完。

首先如果u所在连通块和v所在连通块有环了,那么不可能(超过1个环的限制)

其次如果u和v本身联通,但无环那么可以连边(标记父亲有环)

如果u和v本身不连通,且无环,那么连边、合并(不标记父亲属于最大生成树)

每次合并的时候注意把没环的合到有环的上面就行(判断有无环只要看父亲就行了!)

复杂度O(n2 log n2)

# include <bits/stdc++.h>
# define int long long
# define fp(i,s,t) for (int i=s;i<=t;i++)
using namespace std;
const int N=;
struct rec{int x,y,w;}e[N*N];
int f[N],n,m,ans;
bool cir[N];
bool cmp(rec a, rec b){return a.w>b.w;}
inline int read(int &x)
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
x=w?-X:X;
}
int father(int x)
{
if (x==f[x]) return x;
return f[x]=father(f[x]);
}
signed main()
{
read(n);read(m);
fp(i,,m) read(e[i].x),read(e[i].y),read(e[i].w),e[i].x++,e[i].y++;
sort(e+,e++m,cmp);
fp(i,,n) f[i]=i;
fp(i,,m) {
int u=e[i].x,v=e[i].y,w=e[i].w;
int fx=father(u),fy=father(v);
if (fx!=fy) {
if (cir[fx]&&cir[fy]) continue;
ans+=w;
if (cir[fx]) f[fy]=fx;
else f[fx]=fy;
} else {
if (cir[fx]) continue;
ans+=e[i].w;
cir[fx]=true;
}
}
cout<<ans<<'\n';
return ;
}

HGOI 20190217 题解的更多相关文章

  1. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  2. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  3. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

  4. HGOI 20180224 题解

    /* The Most Important Things: ljc chat with fyh on QQTa说期末考Ta数学74分感觉不好但是我觉得fyh是地表最强的鸭~~(of course en ...

  5. HGOI 20190218 题解

    /* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...

  6. HGOI 20181103 题解

    problem:把一个可重集分成两个互异的不为空集合,两个集合里面的数相乘的gcd为1(将集合中所有元素的质因数没有交集) solution:显然本题并不是那么容易啊!考场上想了好久.. 其实转化为上 ...

  7. HGOI 20181101题解

    /* 又是爆0的一天(不知道今年高考难不难,反正今天(信息学)真的难!) */ solution:对于两个数相加,有一个显然的结论就是要么不进位(相对于位数大的),要么(进最多一位) 然后对于整个数组 ...

  8. HGOI 20191108 题解

    Problem A 新婚快乐 一条路,被$n$个红绿灯划分成$n+1$段,从前到后一次给出每一段的长度$l_i$,每走$1$的长度需要$1$分钟. 一开始所有红绿灯都是绿色的,$g$分钟后所有红绿灯变 ...

  9. HGOI 20191107 题解

    Problem A 树状数组 给出下列$C++$代码: 设区间加操作$modify(l,r)$为调用两次$update(r,1)$和$update(l-1,-1)$ 设$f(l,r)$表示在初始$cn ...

随机推荐

  1. 算法相关——Java排序算法之冒泡排序(二)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  2. 【强化学习】python 实现 q-learning 例二

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134855.html 问题情境 一个2*2的迷宫,一个入口,一个出口,还有一个陷阱.如图 ...

  3. postgresql总结

    这篇博客主要对PostgreSQL进行总结,内容偏基础. 这里先附上一个PostgreSQL的中文资源:PostgreSQL 8.1 中文文档.英文不好的同学可以看看这个. 安装PostgreSQL ...

  4. Linux下分布式系统以及CAP理论分析

    CAP理论被很多人拿来作为分布式系统设计的金律,然而感觉大家对CAP这三个属性的认识却存在不少误区,那么什么是CAP理论呢?CAP原本是一个猜想,2000年PODC大会的时候大牛Brewer提出的,他 ...

  5. Python数据类型-7

    什么数据类型. int 1,2,3用于计算. bool:True,False,用户判断. str:存储少量数据,进行操作 'fjdsal' '二哥','`13243','fdshklj' '战三,李四 ...

  6. (第十二周)final预发布视频

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 Final阶段视频发布 平台:优酷 链接:http://v.youku.com/v_show/id_XMTg0 ...

  7. 《Linux内核分析》第八周学习总结

    <Linux内核分析>第八周学习总结                                      ——进程的切换和系统的一般执行过程 姓名:王玮怡  学号:20135116 ...

  8. Linux内核分析——期中总结

    期中总结 一.MOOC课程 (一)计算机是如何工作的 1.冯诺依曼体系结构的核心思想是存储程序计算机. 2.CPU在实际取指令时根据cs:eip来准确定位一个指令. 3.寄存器模式,以%开头的寄存器标 ...

  9. 转发:Android开发?用C#!!

    转发自 最近偶然在QQ技术群里见到有人提起用C#开发Android,当时我感觉到很诧异:Android不是只能用Java开发吗?何时可以使用C#了?那个群友便告知我:mono. 百度一下吧!搜到了mo ...

  10. Maven相关问题解决.docx

    1. 问题 2. 原因 出现.lastUpdated结尾的文件的原因:由于网络原因没有将Maven的依赖下载完整,导致. 解决方案: 1.删除所有以.lastUpdate结尾的文件 a)1.切换到ma ...