首页 > 其他分享 >2023.10.12

2023.10.12

时间:2023-10-12 20:34:36浏览次数:34  
标签:10 le int 2023.10 dep ch 12 define

大抵是没有挂分。

简单题+博弈+图论+树论,典。


xor

一个 \(n\times n\) 的空矩阵 \(A\),进行如下操作:

给定 \(r,c,l,s\),对于 \(x\in[r,r+l)\),\(y\in[c,x-r+c]\),给 \(A_{x,y}\) 加上 \(s\),也就是以 \((r,c)\) 为左上角的下三角区域。

最后问整个矩形的异或和。

\(n\le 1000\),\(q\le 3\times 10^5\),\(s\le 10^9\).


肯定是先求出每个位置的值。

容易想到每行差分,所以维护差分的列差分和斜线差分即可。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define N 1010
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
using namespace std;
int read(){
	int x=0,w=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*w;
}
int n,q,dlt;
ll a[N][N];
ll b[N][N],c[N<<1][N];
pii getpos(int i,int j){
	i-=dlt;
	if(i==0)return mp(j,j);
	if(i<0)return mp(1+(j-(1-i)),j);
	return mp((i+1)+(j-1),j);
}
bool check(pii x){
	return x.fi>0&&x.fi<=n&&x.se>0&&x.se<=n;
}
int main(){
	freopen("xor.in","r",stdin);
	freopen("xor.out","w",stdout);
	n=dlt=read(),q=read();
	for(int x,y,l,s;q;q--){
		x=read(),y=read(),l=read(),s=read();
		b[x][y]+=s,b[min(n+1,x+l)][y]-=s;
		c[x-(y+1)+dlt][y+1]-=s,c[x-(y+1)+dlt][min(n+1,y+l+1)]+=s;
	}
	pii tp;
	for(int i=0;i<=dlt*2;i++)
		for(int j=1;j<=n;j++){
			c[i][j]+=c[i][j-1];
			tp=getpos(i,j);
			if(check(tp))a[tp.fi][tp.se]=c[i][j];
		}
	for(int j=1;j<=n;j++)
		for(int i=1;i<=n;i++)
			b[i][j]+=b[i-1][j],a[i][j]+=b[i][j];
	ll ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]+=a[i][j-1],ans^=a[i][j];
	printf("%lld\n",ans);
	
	return 0;
}

game

两人博弈。初始有一个集合 \(S=\{a_n\}\).

第 \(i\in[1,m]\) 轮 有一个参数 \(b_i\),操作者仅能只留下或全部舍弃 \(S\) 中所有 \(b_i\) 的倍数。

令操作结束后 \(S\)(可空)中的元素和为 \(x\),先手欲最小化 \(x\),后手欲最大化 \(x\).

问最后的 \(x\).

\(n\le 2\times 10^4\),\(m\le 2\times 10^5\),\(|a_i|\le 4\times 10^{14}\),\(1\le b_i\le 4\times 10^{14}\).


部分分刷爽的一集。没什么必要写就不写了。

结论

对于先手,若每次选择集合大小更小的一侧,\(\log n\) 次可使答案为 \(0\),后手同理。

也就是说当 \(m> 2\log n\) 时答案必为 \(0\),接下来考虑一个有时间复杂度保证的算法。

使用二叉树构建整个博弈过程。

  • insert

若当前节点不存在,创建一个新节点。当其为 \(b_{dep}\) 的倍数时,插入右子树,反之插入左子树。

  • query

查询当前轮数下的最大/最小权值。在左右子树中查询,并按照先后手决策计算答案。

每次决策会将集合划分为两个不交集合,故时间复杂度 \(O(nm)\).

总时间复杂度 \(O(n\log n)\).

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define N 20010
#define M 200010
#define L 30
using namespace std;
ll read(){
	ll x=0,w=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*w;
}
int n,m;
ll a[N],b[M];
struct Tree{
	ll s[N*L];
	int lc[N*L],rc[N*L],tot;
	void insert(int &p,int dep,ll val){
		if(!p)p=++tot;
		if(dep>m)return s[p]+=val,void();
		if(val%b[dep])insert(lc[p],dep+1,val);
		else insert(rc[p],dep+1,val);
	}
	ll query(int p,int dep){
		if(!p)return 0;
		if(dep>m)return s[p];
		ll r1=query(lc[p],dep+1),r2=query(rc[p],dep+1);
		return (dep&1)?min(r1,r2):max(r1,r2);
	}
}T;
int rt;
int main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++)b[i]=read();
	if(m>28)return puts("0"),0;
	for(int i=1;i<=n;i++)
		T.insert(rt,1,a[i]);
	printf("%lld\n",T.query(rt,1));
	
	return 0;
}

connect

无边的图,对于 \(1\le i<j\le n\),若 \(\gcd(i,j)\) 为合数则在 \(i,j\) 间连无向边。

试删除一个节点,最小化最大的连通块大小。多测。

\(T\le 10\),\(n\le 10^5\),\(a_i\le 10^7\).


有意义的删点显然在割点上。对于较大的 \(n\) 考虑优化建边。

令单位合数为可以表示为 \(2\) 个质数的乘积的数。

对于存在边的两点,将它们与 \(\gcd\) 的一个是单位合数的因子连边。

每个数的单位合数因子是 \(O(\log V^2)\) 的,也就是新图总边数 \(O(n\log V^2)\).

直接在原图最大的连通块里 tarjan.

遇到返祖边时,可以在栈里不断跳回去,把 \(siz\) 加回 \(u\) 里。

不训图论导致的。

点击查看代码
#include<bits/stdc++.h>
#define N 100010
#define M 2005010
#define E 6000010
#define R 10000001
using namespace std;
int read(){
	int x=0,w=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*w;
}
int p[R>>3],minp[R],id[R],cnt,P;bool vis[R];
int fa[M],sz[M],siz[M];
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int u,int v){
	u=find(u),v=find(v);
	if(u==v)return;
	fa[u]=v,sz[v]+=sz[u];
}
int dfn[M],low[M],st[M],top,tim;
void init(){
	for(int i=2;i<R;i++){
		if(!vis[i])p[++cnt]=minp[i]=i;
		for(int j=1;j<=cnt&&i*p[j]<R;j++){
			vis[i*p[j]]=true,minp[i*p[j]]=p[j];
			if(i%p[j]==0)break;
		}
	}
	for(int i=2;i<R;i++)
		if(vis[i]&&!vis[i/minp[i]])id[i]=++P;
}
int head[M],nxt[E],ver[E],tot;
void add(int u,int v){
	nxt[++tot]=head[u];
	ver[tot]=v;
	head[u]=tot;
}
int ans,node;
int n;
void tarjan(int u,int edge){
	dfn[u]=low[u]=++tim;
	st[++top]=u,siz[u]=0;
	int mx=0,scc=0;
	for(int i=head[u],v;i;i=nxt[i]){
		if(i==(edge^1))continue;
		if(!dfn[v=ver[i]]){
			tarjan(v,i),low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				int sum=0;
				for(int x=0;x!=v;)
					x=st[top--],siz[u]+=siz[x],sum+=siz[x];
				scc++,mx=max(mx,sum);
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
	if(u<=n){
		siz[u]++;
		if((edge&&scc)||(!edge&&scc>1))
				ans=min(ans,max(mx,node-siz[u]));
		else ans=min(ans,node-1);
	}
}
void solve(){
	memset(head,0,sizeof(head)),tot=1,tim=top=0;
	n=read();
	for(int i=1;i<=n+P;i++)
		fa[i]=i,sz[i]=dfn[i]=low[i]=0;
	int pr[10],c[10];
	for(int i=1,x,t;i<=n;i++){
		x=read(),sz[i]=1;
		for(int j=0;j<10;j++)pr[j]=c[j]=0;
		while(x>1){
			t=minp[x],pr[++pr[0]]=t;
			while(x%t==0)x/=t,c[pr[0]]++;
		}
		for(int j=1;j<=pr[0];j++)
			for(int k=j+(c[j]<=1);k<=pr[0];k++)
				if(1ll*pr[j]*pr[k]<R){
					int tp=id[pr[j]*pr[k]]+n;
					add(i,tp),add(tp,i);
					merge(tp,i);
				}
	}
	int mx=0,se=0,pos=0;
	for(int i=1;i<=n+P;i++){
		if(fa[i]!=i||!sz[i])continue;
		if(sz[i]>mx)se=mx,mx=sz[i],pos=i;
		else if(sz[i]>se)se=sz[i];
	}
	ans=node=mx;
	tarjan(pos,0);
	printf("%d\n",max(ans,se));
}
int main(){
	freopen("connect.in","r",stdin);
	freopen("connect.out","w",stdout);
	init();
	int T=read();
	while(T--)solve();
	
	return 0;
}

route

U161443 [NOI2021SDPTTest5]平凡

留给想做的同学。


100 + 60 + 15 + 0 = 175.

标签:10,le,int,2023.10,dep,ch,12,define
From: https://www.cnblogs.com/SError0819/p/17760486.html

相关文章

  • 10月12日总结
    一.今天做了什么今天上午学uml,然后去上体育课。体育老师上来阴阳怪气说了一顿,原因是没分组和在他说话时说话。。然后就练排球。下午上数据结构和离散数学课。感觉啥也没学到二.遇到的问题,如何解决无......
  • 2023.10.12python练习关于函数
    #让20以内的奇数写入函数里然后输出三遍defnumber():a=-1whilea<19:a+=2print(a,end="")b=1whileb<=3:b+=1number()print()#输出5次20以内的奇数并输出5次9*9乘法表,都写入一个函数里defwww():x,y=1,1z=......
  • 还有理由不升吗?Windows 12确认 2024年见:设计更高级
    对于那些想要升级Windows12的用户来说,它已经在来的路上了。Intel已经确定,Windows12将于2024年进行“更新”,新的系统将会有更大的突破,比如设计更高级等等。消息人士透露,Windows12的“以网络为中心”或“网络优先”变体主要围绕云和网络技术构建,例如PWA和Edge。此外,新系统还有......
  • 10.12日记
    1, 我们应该怎么使用数据库来实现,我们能不能用Oracle生产库,能不能用TimesTen。 不能,使用Oracle,TimesTen会加大我们项目的预算,使我们的项目用很赚钱,变成赚一点钱的项目,要在我们所有业务支撑系统中推广,每一个实例30W$东西我们坚决不用,所以数据库的机制由我们自己实现,那么必须是......
  • 2023/10/12 博沃创新 面试
    2023年应届生6个月试用期被裁第一次社招16号辞职前4天  心里空落落  对自己很失望面试计7-8min心里大受打击好菜啊1.关于BMS的实现细节上问题对于OCV值怎么校正的?答的太差了 在初始化3s内进行校正  DOD2OCV来实现  又问极化存在很长时间怎么办?没回答上......
  • java10/12今日总结
    1publicclassZoo2{34publicstaticvoidmain(Stringargs[])5{67Feederf=newFeeder("小李");89//饲养员小李喂养一只狮子1011f.feedLion(newLion());1213//饲养员小李喂养十......
  • ST12 Trace – Step by step instruction on how to use it for analysis
    ST12介绍ST12性能分析工具的使用分如下三个步骤:设置跟踪参数开始跟踪收集跟踪数据分析跟踪数据跟踪参数分类:跟踪对象(TraceFor)跟踪类型(TypeofTrace)跟踪对象ST12可以捕获4种类型的数据“User/Tasks”,“WorkProcess”,“CurrentMode”和“ForaSchedule”......
  • 2023/10/12 学习笔记2
    一、信号与数制转换1.1 信号相关概念1.1.1 信息:不同领域对信息有不同的定义,一般认为信息是人们对现实世界事物的存在方式或运动状态的某种认识。表示信息的形式可以是数值、文字、图形、声音、图像及动画等。1.1.2 数据:数据是用于描述事物的某些属性的具体量值。1.1.......
  • 10.12
    重新归来......自己没有坚持发博客,在此为我自己的没有恒心感到深深愧疚。我加入了咱们信息学院的足球队 昨天虽然被交通1:2输掉比赛但是我还是有信心我们会出圈小组赛今天学习了数据结构中的二叉树虽然假期有学但是并没有学懂还得是看教材啊二叉树的三种遍历方式先序......
  • 10 月 12 日模拟赛总结
    Before本文章在洛谷博客同步发布Contest-Link预期\(20+10+30+10=70\)。实际\(100+30+35+0=165\)。挂分\(-95\)。rk8/totrk9。菜。T1鉴定,5min写完测了几组数据没问题就跳了;T2一眼丁真鉴定为线段树,风风火火打了个线段树结果\(x\le10^9\),立即想题,结......