TCPThree_C杯 Day2

T1

我已经被拉格朗日插值蒙蔽了双眼,变得智障无比。

第一反应就是拉格朗日插值,然后就先放下了它。

模数那么小,指数那么大,这是一套noip模拟题,拉格朗日,你脑袋秀逗了?

无脑暴力20分贼开心。

正解:

因为模数很小,所有大于模数的数可以先mod再算,就相当于多次用了从0到mod-1的答案。

对于0到mod-1(相当于1到mod)可以只算素数,由于这个函数是积性函数,所以可以在 线性筛素数 的时候顺便求i的k次方

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=3e6+10;
long long n,m,mod,ans;
long long f[maxn];

long long rs;
long long qp(long long x,long long k) {
	if(x<=1) return x;
	rs=1;
	while(k&&rs) {
		if(k&1) rs=rs*x%mod;
		x=x*x%mod;k>>=1;
	}
	return rs;
}

bool ok[maxn];
int prime[maxn/5],tot_p;
void get_p() {
	f[1]=1;
	for(int i=2;i<=mod;++i) {
		if(!ok[i]) prime[++tot_p]=i,f[i]=qp(i,m);
		for(int j=1;j<=tot_p&&prime[j]<=mod/i;++j) {
			ok[i*prime[j]]=1;f[i*prime[j]]=f[i]*f[prime[j]]%mod;
			if(i%prime[j]==0) break;
		}
	}
}

int main() {
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	cin>>mod>>m>>n;
	get_p();
	for(int i=1;i<=mod;++i) f[i]=(f[i-1]+f[i])%mod;
	ans=(f[mod]*(n/mod)+f[n%mod])%mod;
	cout<<ans;
	fclose(stdin);fclose(stdout);
	return 0;
}

  

T2

二分,线段覆盖,很裸,具体见代码:

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e5+10;
const double pi=acos(-1);
int n;double L,R,maxh=0;
double dn[maxn][4];

struct Node{
	double x,y;
}node[maxn];

bool cmp(const Node& a,const Node& b) {
	return a.y<b.y;
}

bool check(double h) {
	int tot=0;double x,minl=1e4,maxr=-1e4;
	for(int i=1;i<=n;++i) {
		if(dn[i][2]<h) continue;
		x=tan(pi*dn[i][3]/180.0)*(dn[i][2]-h);
		if(dn[i][1]-x>R||dn[i][1]+x<L) continue;
		node[++tot].x=dn[i][1]-x;
		node[tot].y=dn[i][1]+x;
		minl=min(minl,node[tot].x);
		maxr=max(maxr,node[tot].y);
	}
	if(minl>L||maxr<R) return 0;
	sort(node+1,node+tot+1,cmp);
	minl=1e4;
	for(int i=tot;i>1;--i) {
		minl=min(minl,node[i].x);
		if(node[i-1].y<minl&&(node[i-1].y<R&&minl>L)) return 0;
	}
	return 1;
}

int main() {
	freopen("light.in","r",stdin);
	freopen("light.out","w",stdout);
	cin>>n>>L>>R;
	for(int i=1;i<=n;++i)
	{
		scanf("%lf%lf%lf",&dn[i][1],&dn[i][2],&dn[i][3]);
		maxh=max(maxh,dn[i][2]);
	}
	double l=0,r=maxh,mid;
	while(r-l>=1e-7) {
		mid=(l+r)/2.0;
		if(check(mid)) l=mid;
		else r=mid;
	}
	printf("%.7lf",l);
	fclose(stdin);fclose(stdout);
	return 0;
}

  

T3:

我写的线段树你不会杀了我吧(所以竟然比pyh跑得快)。

我建了n颗线段树(不要问我为什么建这么多),但是并不用把所有节点开完,每次修改的时候再新建节点。

对于第i颗线段树的第j个位置表示把前i个数合并,且合并后最大数为j,需要的最小合并次数。

我们知道,如果最后合并出来的东西是确定的,无论合并顺序是否相同,合并次数是确定的。

具体地说:如果我把第 x 到第 y 共( y - x +1)个数合并需要合并( y - x )次。

那么我们每次从前到后扫一遍,扫到一个 i ,我们从 i - 1 到 0逆序枚举 j ,我们把从第 j+1到i的所有数合并,(在第j颗线段树里面查询<=合并后的值的最小合并次数)并计算答案(插入第i颗线段树)。

关于优化:就是为什么从 i - 1 到 0逆序枚举 j ,我们知道如果存在一个 k ( k > j )所以sum[i]-sum[k]<sum[i]-sum[j],那么如果第i颗线段树中 最大数为sum[i]-sum[k]的点的需要的最小合并次数比 最大数为sum[i]-sum[j]的点的需要的最小合并次数 要小,那么再更新最大数为sum[i]-sum[j]的点就不必要了。

zyh说这道题有nlog算法,%%%,不会。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1500+10,INF=1e6;
int n,a[maxn],sum[maxn],maxnum=0,ans,tot;

int aa;char cc;
int read() {
	aa=0;cc=getchar();
	while(cc<‘0‘||cc>‘9‘) cc=getchar();
	while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
	return aa;
}

struct Node{
	int l,r,minnum,son[2];
}node[maxn*4000];

void chge(int pos,int t,int x) {
	node[pos].minnum=min(node[pos].minnum,x);
	if(node[pos].l==node[pos].r) return;
	int mid=(node[pos].l+node[pos].r)>>1;
	if(t<=mid) {
		if(!node[pos].son[0]) {
			node[pos].son[0]=++tot;
			node[tot].l=node[pos].l;
			node[tot].r=mid;
			node[tot].minnum=INF;
		}
		chge(node[pos].son[0],t,x);
	}
	else {
		if(!node[pos].son[1]) {
			node[pos].son[1]=++tot;
			node[tot].l=mid+1;
			node[tot].r=node[pos].r;
			node[tot].minnum=INF;
		}
		chge(node[pos].son[1],t,x);
	}
}

int q(int pos,int r) {
	if(!pos) return INF;
	if(node[pos].r<=r) return node[pos].minnum;
	int mid=(node[pos].l+node[pos].r)>>1;
	if(r<=mid) return q(node[pos].son[0],r);
	else return min(q(node[pos].son[0],mid),q(node[pos].son[1],r));
}

int main() {
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	n=read();int x,y; ans=n-1;
	for(int i=1;i<=n;++i) a[i]=read(),sum[i]=a[i]+sum[i-1];
	for(int i=1;i<=n;++i) node[i].l=1,node[i].r=sum[i],node[i].minnum=INF;
	tot=n;int ff;
	for(int i=1;i<=n;++i) {
		ff=ans;
		for(int j=i-1;j>=0;--j) {
			x=sum[i]-sum[j];
			if(j) y=q(j,x)+i-j-1; else y=i-j-1;
			if(y>=ff) continue;//优化
			chge(i,x,y);ff=y;
		}
	}
	ans=min(ans,q(n,sum[n]));
	cout<<ans;
	fclose(stdin);fclose(stdout);
	return 0;
}
/*
7
3 4 8 2 3 4 7
*/

  

时间: 2024-12-28 01:10:28

TCPThree_C杯 Day2的相关文章

Tyvj P2044 [&quot;扫地&quot;杯III day2]旅游景点

二次联通门 : Tyvj P2044 ["扫地"杯III day2]旅游景点 /* Tyvj P2044 ["扫地"杯III day2]旅游景点 并查集 先把大于K的点合并 再从头扫一遍 若当前边的两边不在同一个集合就合并 否则就割掉这条边 */ #include <cstdio> #include <iostream> const int BUF = 12312313; char Buf[BUF], *buf = Buf; inline v

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day2

T1 模拟+排序,先把n个公司贪成合法,再在剩下的天数中找最大值 注意不要统计2-t<0的天数 1 #include <cstdio> 2 #include <vector> 3 #include <iostream> 4 #include <algorithm> 5 #define ll long long 6 using namespace std; 7 long long n,m,s,k,e,t,sz,j,flag=0,ans=0,cnt[200

TYVJ NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解

肝了两题... T1一眼题,分解质因数,找出2的个数和5的个数取min输出 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=1000010,inf=1e9; int n,m,T; int fac2[m

tyvj NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解

上星期打的...题有点水,好多人都AK了 T1排个序贪心就好了 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=500010,inf=1e9; struct poi{int e,s;}a[maxn];

2015年蓝桥杯省赛B组C/C++(试题+答案)

首先说,这次我是第二次参加蓝桥杯(大学里最后一次),可这次去连个三等都没拿到,有些心灰意冷,比上一次还差, 当时看到成绩出来的时候有些失落,但是跌倒了,再站起来继续跑就可以了.可能是状态不好吧,纯属自我安慰. 接下来我把今年的题目又重新做了一遍,写下了这篇博客,如果也有需要探讨答案的,希望可以有帮助. 第一题: 第1题:统计不含4的数字 题目大意 统计10000至99999中,不包含4的数值个数. 解题分析: 第一种解法: 数学方法,这种是在网上看到的一种解法: 最高位除了0.4不能使用,其余8

苹果急了!俺也得在移动广告分一杯羹

笔者按:胳膊拧不过大腿,这是一条颠扑不破的真理.在某些"强权"规则的控制下,"忍气吞声"或许是最好的办法.但从另一方面来看,正是有了制定好的规则,事物才能按照一定的规律行事,才能在一定的范围内获取利益.但规则一旦被改写呢? 苹果公司做事一向神出鬼没,不管是发布的新品,还是投资.收购的企业,都会让业界暗自揣测其用意.其实,苹果不仅仅是在这些为人瞩目的方面奇招迭出,就连在细节上往往也会出人意表.近日,苹果就App Store中的应用审核中制定了新规则,瞬间就激起千层浪.

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

雅礼集训——day1、day2

day1: 嗯上午考试拿了100分.第一题40,第二题60.看完题的时候我就觉得第二题的部分分是最好得到的,因为数据范围只有300,而且一眼看上去就是网络流的二分图多重匹配模型?然后就建了个网络流写了些,期望得分是70分,但是第1组数据有点劲,被卡掉了,就拿了60分.正解是map+set的贪心...并不会STL 写完T2去看T1,先用DFS乱搞了一下,结果样例都没过去,我手推了一下样例,得到了一个公式,就是从一个点出发需要加上的边数=这个点通过DFS能够遍历到的点的个数-与这个点直接相连的点的个

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共