20240621【省选】模拟

T1 寄了。

T1

Bob 赢的条件有两个:树有完美匹配且 kn21。前一个显然,证后一个的话考虑一段长为 4 的链,能发现如果 Alan 先选了叶节点,那么 Bob 无论选哪里都是输,这个时候 Bob 只需要切断正中间的边就能必赢,也就是整棵树中要有 n21 条边要被切掉。然后就没了。

T2

先按 a 从小到大排序,然后枚举 ax,将 n 个人分为 aiaxai<ax 两类。首先对于第一类是肯定要满足 bi,ci 的最大值小于 bx,cx 的,所以答案是 p(qmaxb)(rmaxc)
对于第二类,若 bi<bx,则无论 cx 的取值都满足条件。若 bibx,则需 cx>ci,然后就直接:



(我懒)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls now<<1
#define rs now<<1|1
const ll N=5*114514,M=1919810;
ll n,p,q,r;
ll sb[N],sc[N],ans;
struct xx{
	ll a,b,c;
}a[N];
bool cmp(xx x,xx y){
	return x.a<y.a;
}
struct tree{
	ll l,r,len;
	ll sum,max,tag;
}t[4*N];
void pushup(ll now){
	t[now].sum=t[ls].sum+t[rs].sum;
	t[now].max=max(t[ls].max,t[rs].max);
}
void pushdown(ll now){
	ll k=t[now].tag;
	if(!k) return;
	t[ls].sum=k*t[ls].len;
	t[rs].sum=k*t[rs].len;
	t[ls].max=t[rs].max=k;
	t[ls].tag=t[rs].tag=k;
	t[now].tag=0;
}
void build(ll now,ll l,ll r){
	t[now].l=l,t[now].r=r;
	t[now].len=r-l+1; //我勒个骚刚 
	if(l==r){
		t[now].sum=t[now].max=1;
		return;
	}
	ll mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(now);
}
void update(ll now,ll x,ll y,ll k){
	if(t[now].l>=x&&t[now].r<=y){
		t[now].sum=k*t[now].len;
		t[now].max=t[now].tag=k;
		return;
	}
	pushdown(now);
	ll mid=(t[now].l+t[now].r)>>1;
	if(x<=mid) update(ls,x,y,k);
	if(y>mid) update(rs,x,y,k);
	pushup(now);
}
ll query_pos(ll now,ll k){
	if(t[now].l==t[now].r) return t[now].l;
	pushdown(now);
	if(t[rs].max<=k) return query_pos(ls,k);
	else return query_pos(rs,k);
}
ll query_sum(ll now,ll x,ll y){
	if(x>t[now].r||y<t[now].l||x>y) return 0;
	if(t[now].l>=x&&t[now].r<=y) return t[now].sum;
	pushdown(now);
	ll mid=(t[now].l+t[now].r)>>1,ans=0;
	if(x<=mid) ans+=query_sum(ls,x,y);
	if(y>mid) ans+=query_sum(rs,x,y);
	return ans;
}
ll query_po(ll val){
	if(query_sum(1,1,1)<=val) return 0;
	else return query_pos(1,val);
}
void Firefly(ll tar,ll val){
	if(!tar||!val) return;
	if(query_sum(1,1,1)<=val) update(1,1,tar,val);
	else{
		ll pos=query_pos(1,val);
		if(pos<tar) update(1,pos+1,tar,val);
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>p>>q>>r;
	for(int i=1;i<=n;++i) cin>>a[i].a>>a[i].b>>a[i].c;
	a[++n].a=0;
	sort(a+1,a+n+1,cmp);
	build(1,1,q);
	a[++n].a=p;
	for(int i=n;i>=1;--i){
		sb[i]=max(sb[i+1],a[i].b);
		sc[i]=max(sc[i+1],a[i].c);
	}
	for(int i=1;i<n;++i){
		Firefly(a[i].b,a[i].c+1);
		if(a[i].a==a[i+1].a) continue;
		ll y=sb[i+1]+1,z=sc[i+1]+1,pos=query_po(z)+1,res=0;
		if(pos<y) res=(q-y+1ll)*(r-z+1ll);
		else res=(q-pos+1ll)*(r-z+1ll)+(pos-y)*(r+1ll)-query_sum(1,y,pos-1);
		ans+=res*(a[i+1].a-a[i].a);
	}
	cout<<ans;
	return 0;
}

T3

数学题,甚至还有期望,会不了一点。

posted @   和蜀玩  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示