首页 > 其他分享 >NOIP 模拟 4

NOIP 模拟 4

时间:2024-11-07 17:20:50浏览次数:5  
标签:ch NOIP int 最大值 long times 模拟 define

T1 玩游戏

神秘贪心。
先拆成两个序列 \(a,b\),需要保证时刻有前缀和 \(sum_i+sum_j\le 0\),首先两边贡献如果能为非正数,先看能否往两边跳,如果都跳不了无解,其实就是贪心地跳到前缀和比当前小的地方。跳到贡献为正数时,来到了两个序列前缀和的最低点,考虑从两边往中间跳每次也是往低跳,查看最后能否相遇即可,这题有一车假做法,之前学长的题解没有几个能过的,这是一种简介的写法 by lxyt-415x。

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pii std::pair<int,int>
#define eb emplace_back
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
std::mt19937 myrand(std::chrono::high_resolution_clock::now().time_since_epoch().count());
inline int R(int n){return myrand()%n+1;}
inline int read(){char ch=getchar();int x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);return x*f;}
const int N=2e5+10,mod=998244353,inf=1e9;
inline void Min(int &x,int y){if(x>y)x=y;}
inline void Max(int &x,int y){if(x<y)x=y;}
int n,m,a[N],pa,pd,ia,ib,b[N];
inline void work(){
	pa=pd=ia=ib=0;
	while((ia<n&&a[ia+1]+b[pd]<=0)||(ib<m&&a[pa]+b[ib+1]<=0)){
		if(ia<n&&a[ia+1]+b[pd]<=0&&a[++ia]<=a[pa])pa=ia;
		if(ib<m&&a[pa]+b[ib+1]<=0&&b[++ib]<=b[pd])pd=ib;
	}
}
signed main(){
    // freopen("in.in","r",stdin);freopen("out.out","w",stdout);
    std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
    int T=read();while(T--){
    	m=read(),n=read();for(int i=1;i<=n;++i)a[n-i+1]=read();m-=n--;
		for(int i=1;i<=m;++i)b[i]=read(),b[i]+=b[i-1];
		for(int i=1;i<=n;++i)a[i]+=a[i-1];
		work();int _=pa,__=pd;std::reverse(a+1,a+n+1);std::reverse(b+1,b+m+1);a[++n]=b[++m]=0;
		work();puts((_+pa>=n&&__+pd>=m)?"Yes":"No");
    }
}

T2 排列

简单观察发现 \(k\) 不超过 \(\log n\),然后一个区间内的最大值会将这个区间分成不想关的两部分,根据这个性质设计 \(f_{i,j,0/1,0/1}\) 表示长度为 \(i\) 的区间,需要操作 \(j\) 次后消完,区间左边一个是否比区间最大值大,区间右边一个是否比区间最大值大的方案数,注意,\(f_{i,j,0,0}\) 表示的是操作 \(j\) 次后只剩一个数的方案数,转移就是考虑最大值的位置关系,枚举区间内最大值位置 \(k\),容易发现这个东西需要前缀和优化,所以直接考虑意义为不超过 \(j\) 次的方案数即可。如下:

\[\begin{aligned} f_{i,j,0,0}&=f_{k-1,j,0,1}\times f_{i-k,j,1,0}\times{i\choose k-1}\\ f_{i,j,0,1}&=f_{k-1,j,0,1}\times f_{i-k,j-1,1,0}\times{i\choose k-1}\\ f_{i,j,1,0}&=f_{k-1,j-1,1,1}\times f_{i-k,j,1,0}\times{i\choose k-1}\\ f_{i,j,1,1}&=(f_{k-1,j,1,1}\times f_{i-k,j,1,1}-(f_{k-1,j,1,1}-f_{k-1,j-1,1,1})\times(f_{i-k,j,1,1}-f_{i-k,j-1,1,1}))\times{i\choose k-1}\\ \end{aligned} \]

第一种情况比较简单,第二,三种情况就是有最大值的一遍保证操作次数不超过 \(j-1\) 次,从而在 \(j\) 次内将区间内最大值消掉。第四种情况限制同第二,三种情况,但是只需要保证被一遍消掉即可,所以再减去两边都是 \(j\) 次的情况即可,答案就是 \(f_{n,k,0,0}-f_{n,k-1,0,0}\),时间复杂度 \(\mathcal{O}(n^2\log n)\)。

T3 最短路

不会,贺也没贺懂。

T4 矩形

我去,怎么没改这个,反正就是直接上扫描线并查集维护连通块即可,明天补。

总结

有事一点不会场,暴力还挂了,T1 又是一个一车假做法的神秘贪心,没会过这种题,T2 就是 DP 魅力时刻,简直什么都能刻画,T3 理解不了几点,还没找到一个说的详细的题解,又打出了退役水平。

标签:ch,NOIP,int,最大值,long,times,模拟,define
From: https://www.cnblogs.com/Ishar-zdl/p/18533159

相关文章

  • NOIP 模拟 6
    T1新的阶乘(factorial)线性筛出质数和每个数的最小质因数,然后直接算即可。T2博弈树(tree)结论:当且仅当起点为直径中心时,后手必胜。证明:先考虑只在直径上的博弈,如果起点在直径的一端,先手必胜,设直径长为\(len\),如果在端点的下一个位置,先手可以移动\(len-2\)到对称位置,此时后手......
  • NOIP 模拟 5
    T1选彩笔(rgb)观察到值域较小,考虑静态值域三维偏序,人话:三维前缀和。三维前缀和的式子:get(i,j,k,x,y,z)=s[i][j][k]-s[i][j][z-1]-(s[i][y-1][k]-s[i][y-1][z-1])-(s[x-1][j][k]-s[x-1][y-1][k]-s[x-1][j][z-1]+s[x-1][y-1][k-1]);,直接几何意义推的,但是高维前缀和有通式。然后二分......
  • noip模拟8
    A图书管理之前考过。。。但是我忘了咋写了,然后随便胡了个动态开点权值数上去,\(O(n^2\logn)\)拿了\(80\)。。。维护一个桶,检测到进来的两个数在中位数同侧,则中位数移动,否则不移动,然后就好了?。。。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn;cons......
  • NOIP2024集训Day71 贪心
    NOIP2024集训Day71贪心B.[CCO2015]饥饿的狐狸显然的,要求出最大美味值,应该先交错吃温度最大的和最小的饼干。所以我们给所有饼干按照温度排序,交替选择左右端点吃,如果喝水能够达到更大那就先喝水再吃,反正水管够。分两种情况,即左右端点谁先开始,再取个\(\operatorname{max}\)。......
  • lanqiaoOJ 1110:小王子单链表 ← 数组模拟实现
     【题目来源】https://www.lanqiao.cn/problems/1110/learning/【题目描述】小王子有一天迷上了排队的游戏,桌子上有标号为1-10的10个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把哪个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排......
  • 基于Arduino的数码管显示变阻器模拟量读取值
    题目要求采集变阻器模拟量信号在数码管中显示,要求有二位小数电路连接数码管连接:数码管的七个段(a-g)分别连接到Arduino的引脚2到8。数码管的小数点(dp)连接到Arduino的引脚9。数码管的4个控制引脚连接到Arduino的引脚10到11。变阻器连接:变阻器的模拟输出引脚连接到Arduin......
  • 多校A层冲刺NOIP2024模拟赛18
    多校A层冲刺NOIP2024模拟赛18T1选彩笔(rgb)签到题,但是没签上。。。没想到三维前缀和,直接上了个bitset。就是直接二分答案,然后枚举这三维每维的区间的起点,前缀和查数量是否大于等于$K$即可,也可以把二分答案改为第一维的双指针,少一个$log$。T2兵蚁排序(sort)比T1还签......
  • CSP2024 前集训:NOIP2024加赛 2
    前言T2开太晚了,没打完,别的没怎么挂。哦对,T1以为埃筛复杂度是\(nlog^2\),实际上是\(n\ln(\ln(n))\),结果以为复杂度是错的,然后本地不开O2都飞快,我甚至还在惊叹本地竟然能跑\(5e9\)……还有我之前不知道树的直径的中点时唯一的……T1新的阶乘直接埃筛做完了。点击查......
  • NOIP2024 模拟赛 #15 总结
    Larunatrecy:信心赛。赛时T1求中位数,想起前两天做过的[ABC203D]Pond,考虑了二分答案。看出二分答案后不会做了,罚坐\(20\)min。然后发现我傻逼了,选出一个区间翻转,可以通过钦定右端点,找到最优的左端点得到,神仙Heldivis就出过一道这样的题。写完后调了下二分边界过了大样......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛18
    前言不知道咋回事儿?脑子里一直放歌。然后T3空间给了256,开了256.23死了。T1选彩笔显然可以二分答案,所以现在有了\(O(nv^3\logv)\)的做法,去重后可以拿到\(80pts\),发现直接三维前缀和就可以做到\(O(v^3\logv)\)。点击查看代码#include<bits/stdc++.h>#definell......