[帝皇杯day 1] [NOIP2018模拟赛]小P的loI(暴力+素筛),【NOIP模拟赛】创世纪(贪心),无聊的数对(线段树)

文章目录

  • T1:小P的lol
    • title
    • solution
    • code
  • T2:创世纪
    • title
    • solution
    • code
  • T3:无聊的数对
    • title
    • solution
    • code

T1:小P的lol

title

在这里插入图片描述
在这里插入图片描述

solution

此题非常水…
先用素数筛,筛出[1,n][1,n][1,n]中的质数
质数越小,倍数的分布就越密集
所以质数一定是从小开始往大的取
然后就是暴力跑,考试的时候我以为暴力会TTT,一直在思考打容斥,幸好最后交的是暴力,嘻嘻~
在这里插入图片描述

code

#include <cstdio>
#define MAXN 10000005
int n, k, cnt, ans;
int prime[MAXN];
bool vis[MAXN], flag[MAXN];void init() {for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) {vis[i] = 1;prime[++ cnt] = i;}for( int j = 1;j <= cnt && i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) break;}}
}int main() {scanf( "%d %d", &n, &k );init();if( k == n - 1 ) return ! printf( "%d", cnt );for( int i = 1;i <= cnt;i ++ ) {for( int j = prime[i];j <= n;j += prime[i] ) {if( flag[j] == 0 ) {flag[j] = 1;ans ++;if( ans >= k ) return ! printf( "%d", i );}}}return 0;
}

T2:创世纪

title

applepi手里有一本书《创世纪》,里面记录了这样一个故事……

上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放到一个新的空间中去以建造世界。每种世界元素都可以限制另外一种世界元素,所以说上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素能够限制它,这样上帝就可以保持对世界的控制。
由于那个著名的有关于上帝能不能制造一块连自己都不能举起的大石头的二律背反命题,我们知道上帝不是万能的,而且不但不是万能的,他甚至有事情需要找你帮忙——上帝希望知道他最多可以投放多少种世界元素,但是他只会O(2^N) 级别的算法。虽然上帝拥有无限多的时间,但是他也是个急性子。你需要帮助上帝解决这个问题。

输入格式
第一行是一个整数N,表示世界元素的数目。
第二行有 N 个整数A1, A2, …, AN。Ai 表示第i 个世界元素能够限制的世界元素的编号。

输出格式
一个整数,表示最多可以投放的世界元素的数目。

样例
样例输入
6
2 3 1 3 6 5
样例输出
3

数据范围与提示
样例说明
选择2、3、5 三个世界元素即可。分别有1、4、6 来限制它们。

数据范围与约定
对于30% 的数据,N≤10。
对于60% 的数据, N≤10^5。
对于 100% 的数据,N≤10^6,1≤Ai≤N,Ai≠i。

solution

贪心
考场上通过找规律我发现了
环的点大小为奇数,产生的贡献是cnt>>1cnt>>1cnt>>1
环的点大小为偶数,产生的贡献还是cnt>>1cnt>>1cnt>>1
在这里插入图片描述
通过输入的要求,可以知道最后图一定是以链+环的形式
先处理链的形式,每两个绑一起产生1的贡献,可以类似拓扑去跑
但是链与环的交接处那个点是在环的时候去产生贡献,不要在链的时候搞
最后跑出环的大小,计算贡献
在这里插入图片描述

code

#include <cstdio>
#define MAXN 1000005
int n, l = 1, r, ans;
int v[MAXN], d[MAXN], st[MAXN];
bool vis[MAXN];int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &v[i] );d[v[i]] ++;}for( int i = 1;i <= n;i ++ )if( ! d[i] ) st[++ r] = i;while( l <= r ) {if( ! vis[st[l]] && ! vis[v[st[l]]] ) {ans ++;vis[v[st[l]]] ++;if( -- d[v[v[st[l]]]] == 0 )st[++ r] = v[v[st[l]]];}vis[st[l ++]] = 1;}for( int i = 1;i <= n;i ++ )if( ! vis[i] ) {int cnt = 0, j = i;while( v[j] != i )vis[j] = 1, j = v[j], cnt ++;vis[j] = 1;ans += ( cnt + 1 ) >> 1;}printf( "%d", ans );return 0;
}

T3:无聊的数对

title

在这里插入图片描述
在这里插入图片描述

solution

要求i⊗j=ki\otimes j=kij=kkkk的二进制中1的个数为奇数
此时i,ji,ji,j的要求是一奇一偶
在这里插入图片描述
证明如下:

先温习一下二进制的异或法则
1⊗1=01\otimes1=011=0
0⊗0=00\otimes0=000=0
1⊗0=11\otimes0=110=1


如果i,ji,ji,j二进制的第ppp位不相等,有一个为111,异或后还是111
111的个数奇偶性不改变

如果相等
1)两个都为000,异或为000,也不会对111的奇偶性造成改变
2)两个都为111,那么异或后变成000,个数减掉222,奇偶性没改变
综上,i,ji,ji,j111的奇偶性是永远不会改变的
奇数+奇数=偶数,偶数+偶数=偶数,奇数+偶数=奇数
所以必须要一奇一偶,证明完毕!
在这里插入图片描述
再观l,rl,rl,r十分庞大,已经超出intintint边界
但是不要怕,静态区间求个数之类的题,最喜欢丢线段树上面了
我们就维护一棵线段树,把区间操作丢上去
然后分别统计二进制111为奇数的个数和二进制111为偶数的个数
进行乘法操作,直接用根的信息即可
注意: 被完全覆盖的区间记得打懒标记,因为这个区间被完全包含了,是不会产生新贡献的

这道题其实也就这样吧…
在这里插入图片描述

code

#include <cstdio>
#define ll long long
#define MAXN 100005
int n, cnt, root;
ll l, r;
//odd表示区间[l,r]内二进制中1为奇数的个数
//even表示区间[l,r]内二进制中1为偶数的个数 
ll find( ll x ) {if( x & 1 ) return ( x + 1 ) >> 1;return ( x >> 1 ) + __builtin_parityll( x );
}bool flag[MAXN];
int lson[MAXN << 2], rson[MAXN << 2];
ll odd[MAXN], even[MAXN];void modify( int &t, ll l, ll r, ll L, ll R ) {if( flag[t] ) return;if( ! t ) t = ++ cnt;if( L <= l && r <= R ) {flag[t] = 1;odd[t] = find( r ) - find( l - 1 );even[t] = r - l + 1 - odd[t];return;}ll mid = ( l + r ) >> 1ll;if( L <= mid ) modify( lson[t], l, mid, L, R );if( mid < R ) modify( rson[t], mid + 1, r, L, R );odd[t] = odd[lson[t]] + odd[rson[t]];even[t] = even[lson[t]] + even[rson[t]];
}int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {ll l, r;scanf( "%lld %lld", &l, &r );modify( root, 1, ( 1ll << 32 ) - 1, l, r );printf( "%lld\n", odd[1] * even[1] );}return 0;
}

终于时隔多年,我补完了完整的一场狂欢赛!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6144 [USACO20FEB]Help Yourself P(DP+线段树)

P6144 [USACO20FEB]Help Yourself P 将线段按照了 \(r\) 排序&#xff0c;设右端点为 \(r\) 的答案为 \(f_r\)&#xff0c;发现这样转移非常困难。 \(\color{yellow}{\bigstar\texttt{Trick}}\)&#xff1a;区间覆盖的题要按照左端点排序&#xff0c;记右端点为 \(r\) 时的答案…

Desert King POJ - 2728

题意&#xff1a; 给定N个平面上的点的坐标和它们的权值&#xff0c;任意两点之间的边的价值是它们的距离&#xff0c;费用是两点权值之差的绝对值&#xff0c;求该图的一棵生成树&#xff0c;使得该树所有边的费用之和与价值之和的比值最小&#xff08;只需求这个比值即可&am…

洛谷P3338:力(FFT)

传送门 解析 算是比较适合的FFT入门题了吧 一个重要的trick&#xff1a; 当函数无法表示成卷积时&#xff0c;可以把函数翻转过来 然后调一调就又是卷积了 一个重要的注意事项是FFT的lim一定是两多项式相乘结果多项式的项数&#xff01; 即使后面的项根本没有用也一样 其他的…

CF650E-Clockwork Bomb【并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF650E 题目大意 给出nnn个点的两棵树&#xff0c;你每次可以选择第一棵树上的一条边改成另一条边&#xff0c;但是改完之后必须还是一棵树&#xff0c;求最少的步数把第一棵树改成第二棵树。 1≤n≤51051\leq n\leq 5\times…

[2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421

文章目录Priest Johns Busiest DaycodePeaceful CommissioncodeLets go homecodeBomb GamecodeEliminate the ConflictcodeBit MagiccodePriest John’s Busiest Day 题目 司仪必须在婚礼开始或结束时出现&#xff0c;考虑把第iii场婚礼拆成两个点 iii&#xff1a;表示司仪在婚…

.NET Core中的一个接口多种实现的依赖注入与动态选择

最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式&#xff0c;为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中&#xff0c;但是在服务调用的时候总是获取到最后注入的那个方法的实现&#xff0c;这时候就在想能不能实现动态的选…

Sightseeing Cows POJ - 3621

题意&#xff1a; L个点&#xff0c;P边的点边带权的有向图&#xff0c;求一个环点权和与边权和比值的最大值。 题解&#xff1a; 01分数规划判负环 详细看这里 还是套用01分数规划模型&#xff0c;点权为value[i],边权为cost[u],一个环为C&#xff0c;问题要求最大化 最…

CF559E Gerald and Path(DP)

CF559E Gerald and Path 设 \(dp(i,p)\) 表示完成前 \(i\) 条线段的覆盖&#xff0c;最右端位于 \(p\) 点的最大收益。 转移&#xff1f;向下一条线段转移时加上他们中间的距离&#xff1f;发现这样没有办法统计 \(p\) 点以前的空位了&#xff01; \(\color{yellow}{\bigstar\t…

多项式乘法:练习总结

文章目录前言力代码礼物代码差分和前缀和代码开拓者的知识代码总结前言 这两天由于国庆集训全是阴间的生成函数&#xff0c;所以就学了一点点相关的内容 其实就学了个FFT和NTT 也算是点开了一个小小的技能点吧 进入多项式才发现里面世界的广阔 然而由于这玩意没有一个是NOIP考…

CF1444C-Team-Building【可撤销并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF1444C 题目大意 给出nnn个点mmm条边的一张图&#xff0c;总共kkk个颜色&#xff0c;每个点有一个颜色。 询问有多少无序颜色对(x,y)(x,y)(x,y)满足x≠yx\neq yx​y且颜色为xxx或yyy的点构成的生成子图是一个二分图。 1≤…

C# Memory Cache 踩坑记录

背景前些天公司服务器数据库访问量偏高,运维人员收到告警推送,安排我团队小伙伴排查原因.我们发现原来系统定期会跑一个回归测试,该测运行的任务较多,每处理一条任务都会到数据库中取相关数据,高速地回归测试也带来了高频率的数据库读取.解决方案1我们认为每个任务要取的数据大…

模板:无旋treap

文章目录前言操作合并分裂插入删除查找第k大查询x的排名前驱后继完整代码所谓无旋treap&#xff0c;就是不带旋转的treap 前言 现在“理论上”我会四种平衡树了 之前说无旋treap功能弱&#xff0c;是我狗眼看银低了qwq 这玩意区间上该搞的也能搞 而且确实是非常的 好写&#x…

[贪心专题]CF549G,CF351E,CF226D,CF1276C,CF1148E,CF798D

文章目录T1&#xff1a;CF1276C Beautiful RectangletitlesolutioncodeT2&#xff1a;CF226D The tabletitlesolutioncodeT3&#xff1a;CF549G Happy LinetitlesolutioncodeT4&#xff1a;CF798D Mike and distributiontitlesolutioncodeT5&#xff1a;CF351E Jeff and Permut…

51nod1766-树上的最远点对【结论,线段树】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1766 题目大意 给出nnn个点的一棵树&#xff0c;mmm次询问给出两个区间&#xff0c;要求在两个区间中各选一个点使得他们之间距离最大。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 结论就是两…

P3385 【模板】负环

P3385 【模板】负环 题意&#xff1a; 给定一个 n 个点的有向图&#xff0c;请求出图中是否存在从顶点 1 出发能到达的负环。 负环的定义是&#xff1a;一条边权之和为负数的回路。 题解&#xff1a; 先说结论&#xff1a; 判断给定的有向图中是否存在负环。 利用 spfa 算…

LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)

解析 和国王游戏一样的做法 容易写出cmp函数的依据&#xff1a; min(u.a,v.b)<min(u.b,v.a)但是这个题的比较函数有一个取min的操作 这个东西会有一个问题&#xff1a;不满足不可比性的传递性 通俗的说&#xff0c;xy,yz,但是x不一定z 比如说如果y的a和b都很小&#xff0c…

【数位DP】CF 54C,509C,431D,628D,855E,1245F,95D

这一次有题解了&#xff01;&#xff01;T1&#xff1a;CF54C First Digit LawtitlesolutioncodeT2&#xff1a;CF509C Sums of DigitstitlesolutioncodeT3&#xff1a;CF431D Random TasktitlesolutioncodeT4&#xff1a;CF628D Magic NumberstitlesolutioncodeT5&#xff1a;…

CF1007E Mini Metro(DP 化散为整,将状态压缩)

CF1007E Mini Metro 有 \(N\) 个站台&#xff0c;从左往右编号为 \(1,2,\cdots,n\)&#xff0c;每个站台初始时(\(0\) 时刻)有 \(a_i\) 个人&#xff0c;从 \(0\) 时刻初开始游戏。 每个时刻&#xff0c;会依次发生如下事件&#xff1a; 你可以选择召唤 \(0\) 辆、一辆或多辆向…

AT2070-[ARC061D]3人でカードゲーム/Card Game for Three【计数,组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/AT2070 题目大意 有三堆卡牌各有n,m,kn,m,kn,m,k张&#xff0c;每张上写了a/b/ca/b/ca/b/c&#xff0c;对于第1/2/31/2/31/2/3堆卡牌。然后开始从第一堆拿牌&#xff0c;然后根据拿到的牌在对应的堆拿牌。 如果到一堆拿牌时…

C#如何安全、高效地玩转任何种类的内存之Memory(三)

前言我们都知道&#xff0c;.Net Core是微软推出的一个通用开发平台&#xff0c;它是跨平台和开源的&#xff0c;由一个.NET运行时、一组可重用的框架库、一组SDK工具和语言编译器组成&#xff0c;旨在让.Net developers可以更容易地编写高性能的服务应用程序和基于云的可伸缩服…