首页 > 其他分享 >2023年石门中学NOIP模拟测试(2023.10.16)

2023年石门中学NOIP模拟测试(2023.10.16)

时间:2023-10-16 15:58:46浏览次数:42  
标签:p2 ch NOIP 16 int 2023.10 p1 mod define

T1

image

\(\sum n\leq 2\times 10^6,x\leq 10^9\)

简单来说,让你在给出的序列中构造差分序列不出现 \(x\) 的一组解。

签到题。

对 \(x\) 分类讨论,排个序,调整一下,注意 \(x=0\) 时 交叉构造以及 \(a_i=0\) 情况即可。

Code
#include<bits/stdc++.h>
#define il inline 
#define rint register int
#define ll long long
#define pii pair<int,int>
using namespace std;
const int N=1e5+10,INF=2147483647;
char *p1,*p2,buf[N];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#define gc() getchar()
il int rd(){
	int x=0,f=1;
	char ch=gc();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=gc();
	return x*f;
}
int n,m;
int a[N],ans[N];
struct dat{
	int s,id;
}g[N];
void Main(){
	n=rd(),m=rd();
	for(int i=1; i<=n; ++i)a[i]=rd();
	if(m==0){
		sort(a+1,a+1+n,[&](int &a,int &b){return a<b;});
		int cnt=0;
		for(int i=1; i<=n; ++i){
			int now=i;
			while(now<n&&a[now]==a[now+1])++now;
			g[++cnt].s=now-i+1;g[cnt].id=i;
			i=now;
		}
		sort(g+1,g+1+cnt,[&](dat x,dat y){return a[x.id]<a[y.id];});
		bool fl=1;
		for(int i=1; i<=cnt; ++i){
			if(n-g[i].s<g[i].s-1+(a[g[i].id]==0)){
				fl=0;break;
			}
		}
		if(fl){
			puts("yes");
			priority_queue<pii>q;
			for(int i=1; i<=cnt; ++i)q.push({g[i].s,a[g[i].id]});//cout<<a[g[i].id]<<' '<<g[i].s<<endl;
			int tot=0;
			while(q.size()>=2){
				pii x=q.top();q.pop();
				pii y=q.top();q.pop();
				//printf("%d %d ",x.second,y.second);
				if(ans[tot]==x.second)swap(x,y);
				ans[++tot]=x.second,ans[++tot]=y.second;
				--x.first,--y.first;
				if(y.first)q.push(y);
				if(x.first)q.push(x);
			}
			if(!q.empty()){
				int x=q.top().second,fl=0;
				ans[tot+1]=-INF;
				for(int i=0; i<=tot; ++i){
					if(i)printf("%d ",ans[i]);
					if(ans[i]!=x&&ans[i+1]!=x&&!fl){
						printf("%d ",x);
						fl=1;
					}
				}
			}else{
				for(int i=1; i<=tot; ++i){
					printf("%d ",ans[i]);
				}
			}
			puts("");
		}else{
			puts("no");
		}
	}
	else{
		if(m<0)sort(a+1,a+1+n,[&](int a,int b){return a<b;});
		else sort(a+1,a+1+n,[&](int a,int b){return a>b;});
		int fl=0;
		for(int i=2; i<=n; ++i){
			if(a[1]-a[i]!=m&&a[i]!=m)fl=i;
		}
		if(a[1]!=m){
			puts("yes");
			for(int i=1; i<=n; ++i)printf("%d ",a[i]);
			puts("");
		}
		else if(fl){
			puts("yes");
			printf("%d ",a[fl]);
			for(int i=1; i<=n; ++i)if(i!=fl)printf("%d ",a[i]);
			puts("");
		}else{
			puts("no");
		}
	}
}
signed main(){
	freopen("dif.in","r",stdin);
	freopen("dif.out","w",stdout);
	int T=rd();
	while(T--)Main();
	return 0;
}

T2

image

\(n\leq 10^6\)

啊?一眼淀粉质板子。好,然后你就发现 \(n\log^2 n\) oj 上$ 3s$ 跑不过 \(10^6\),尊嘟假嘟 o_0?

还能 \(n\log n\) 啊,那没事了。

\(\log^2\) 的:

Code
#include<bits/stdc++.h>
#define il inline 
#define rint register int
#define int long long
#define pii pair<int,int>
#define lb(i) (i&-i)
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
using namespace std;
const int N=1e6+10,INF=2147483647,mod=1e9+7;
char *p1,*p2,buf[N];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#define gc() getchar()
il int rd(){
	int x=0,f=1;
	char ch=gc();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=gc();
	return x*f;
}
int n;
int a[N],ran[N],len;
vector<int>e[N];
int rt,S,siz[N],rt_mx;
bool vis[N];
il void Dfs_rt(int x,int f){
	siz[x]=1;
	int mx=0;
	for(auto y:e[x]){
		if(y==f||vis[y])continue;
		Dfs_rt(y,x);
		siz[x]+=siz[y];
		mx=max(mx,siz[y]);
	}
	mx=max(mx,S-siz[x]);
	if(mx<rt_mx)rt_mx=mx,rt=x;
}
vector<pii>P,OP;
il void get_dis(int x,int f,int dep,int val){
	P.push_back({dep,lower_bound(ran+1,ran+1+len,val)-ran});
	for(auto y:e[x]){
		if(y==f||vis[y])continue;
		get_dis(y,x,dep+1,max(val,a[y]));
	}
}
int sum[N],g[N],ss[N];
il void add(int x,int y,int fl){
	for(int i=x; i; i-=lb(i))(sum[i]+=fl*(ran[x]-y)+mod)%=mod;
	for(int i=x; i<=len; i+=lb(i))(g[i]+=fl+mod)%=mod,(ss[i]+=fl*y+mod)%=mod;
}
il int query(int x){
	int s=0;for(int i=x; i<=len; i+=lb(i))(s+=sum[i])%=mod;
	return s;
}
il int query2(int x){
	int s=0;for(int i=x; i; i-=lb(i))(s+=g[i])%=mod;return s;
}
il  int que(int x){
	int s=0;for(int i=x; i; i-=lb(i))(s+=ss[i])%=mod;return s;
}
int ans;
void solve(int x){
//	cout<<"RT"<<rt<<endl;
	Dfs_rt(rt,0);
	vis[x]=1;
	int tot=0;
	OP.clear();
	for(int y:e[x]){
		if(vis[y])continue;
		P.clear();
		get_dis(y,x,1,max(a[y],a[x]));
		for(auto t:P){
			(ans+=ran[t.second]-t.first+mod)%=mod;
	//		cout<<ans<<endl;
			int s1=query(t.second),s2=query2(t.second-1);//s2:前面<自己 num     s1: >= sum
			(ans+=s1-(tot-s2+mod)*t.first%mod+mod)%=mod;
	//		cout<<ans<<endl;
			(ans+=s2*(ran[t.second]-t.first+mod)%mod-que(t.second-1)+mod)%=mod;
		//	cout<<t.first<<' '<<ran[t.second]<<' '<<ans<<' '<<s1<<' '<<s2<<endl;
		}
		for(auto t:P)
		add(t.second,t.first,1),OP.push_back(t);
		tot+=P.size();
	}
	for(auto t:OP)add(t.second,t.first,-1);
	for(auto y:e[x]){
		if(vis[y])continue;
		rt_mx=INF,S=siz[y];
		Dfs_rt(y,x);
		solve(rt);
	}
}
void Main(){
	n=rd();
	for(int i=1; i<=n; ++i)ran[i]=a[i]=rd();
	sort(ran+1,ran+1+n);
	len=unique(ran+1,ran+1+n)-ran-1;
	for(int u,v,i=1; i<n; ++i){
		u=rd(),v=rd();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	S=n,rt_mx=INF;
	Dfs_rt(1,0);
	solve(rt);
	cout<<ans*2%mod;
}
signed main(){
	freopen("travel.in","r",stdin);
	freopen("travel.out","w",stdout);
	int T=1;
	while(T--)Main();
	return 0;
}

单 \(\log\) 的:

Code

发现自己 \(\text{Implement}\) 一坨屎...

标签:p2,ch,NOIP,16,int,2023.10,p1,mod,define
From: https://www.cnblogs.com/J1mmyF-blog/p/17767500.html

相关文章

  • [NOIP2010 提高组] 乌龟棋
    题目背景小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。题目描述乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数)。棋盘第11格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中MM张爬行卡片,分成44种不同的类型(MM张......
  • P1019 [NOIP2000 提高组] 单词接龙
    P1019[NOIP2000提高组]单词接龙注意:1.相邻不包含2.每个单词最多使用两次3.如果两部分可以接龙,直接退出,因为如果再继续,长度一定变短(因为相邻的会抵销)4.加个特殊字符,这样就可以不用特判了因为n很小,直接暴力枚举1.如果两个可以接龙直接合并(注意相邻相同要抵消)2.暴力枚举每个单......
  • 23.10.16
    树的操作:1、树的构建Nodebuild(Nodep,int&k,strings){if(s[k]=='#'){k++;returnNULL;}p=newnode();p->ch=s[k++];p->lc=build(p->lc,k,s);p->rc=build(p->rc,k,s);returnp;}用字......
  • 【Linux 网络编程】为什么 IP 地址通常以192.168开头?——私有 IP 地址段
    首先,192.168并不是设置局域网IP地址的唯一选择。很多企业都选择10.或者172.16开头规划局域网。三个私有IP地址段网络中的主机需要通信,需要使用一个IP地址,目前我们普遍使用的IPv4的地址,分为A、B、C、D、E五类,其中A、B、C类是我们常见的IP地址段。在这三类地址中,大多数为公有地......
  • 前台端分离 技术架构 系统架构图 20231016
       ......
  • 20231015NOIP训练赛
    20231015NOIP训练赛时间安排7:50-8:10写T18:10-11:50写T2总结T2写了分段但是因为太过自信然后全删了题解T1板子题,建一个超级源点即可T2数学题,用组合数计算,然后再用前缀和优化T3先建出S到T的最短路图,然后在在这个DAG上进行DP,注意还要再建出T到S的最短路图再跑一遍。T......
  • ARC167D Good Permutation 题解
    题意给定一个长度为\(N\)的排列\((P_1,P_2,\cdots,P_N)\)。称一个排列\(P\)为“好排列”当且仅当对于所有\(1\leqx\leqN\),都能通过不停地使\(x\leftarrowP_x\)将\(x\)变成\(1\)。通过最小次数操作将\(P\)变成“好排列”,每次操作为交换\(P\)中的两个数\(P_i\)......
  • 2023.10.15——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午休息,下午校内算法比赛;我了解到的知识点:1.写对四道;明日计划:学习......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第五周学习总结
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 一周总结(2023.10.2-2023.10.15)
    2023.10.2考试。T1是简单的,T2是一个比较简单的dp,状态等东西都是对的,但是因为有一个地方没有取模而只交了暴力。受不鸟。T3是概率dp,考场上想了比较久想出来并实现了。T4是一个容斥计数题,大概理解了但是没有补。考场上千万要注意细节,以免丢掉不该丢的分。2023.10.3还是考试......