首页 > 其他分享 >[TJOI2019]甲苯先生的滚榜

[TJOI2019]甲苯先生的滚榜

时间:2023-04-28 20:59:20浏览次数:49  
标签:rt cnt last 先生 int top return TJOI2019 甲苯

[TJOI2019]甲苯先生的滚榜
又双叒叕来水博客了

几乎就是一个板子,虽然有两个关键字,但是实际上可以压成一个。
k=a*mo-b 其中a为过题数,b为罚时,mo=2e6,因为b<1.5e6。所以我们可以用这样一个二元组来表示。

虽然说相同的二元组可以对应不同的人,但实际上是谁不重要,重要的是有哪些数。然后就是基本的delete和insert操作,然后查询可以和insert合到一起写,这样会快一些。

刚开始看到10s,心想这不随便过,然而我还t了几发QAQ,加了快速输出和一点优化才卡到8s。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<ctime>
#define fo(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (int (i)=(b);(i)>=(a);(i)--)
using namespace std;
typedef unsigned int ui ;
typedef long long ll;
ui last,m,n,seed;
ui randNum( ui& seed , ui last , const ui m){ 
    seed = seed * 17 + last ; return seed % m + 1; 
}

const int N=1e5+5;
const int mo=2e6;
int ls[N],rs[N],p[N],cnt,rt,s[N],l,r,x,y,t,z,temp;
ll v[N],k,a,b,h[N];
int ss[N],top;
int New(ll x){
	
	++cnt;
	
	p[cnt]=rand();
	v[cnt]=x;
	ls[cnt]=rs[cnt]=0;
	s[cnt]=1;
	return cnt;
}
void upd(int x){
	s[x]=s[ls[x]]+s[rs[x]]+1;
}
int build(int n){
	int x,last;
	top=0;
	fo(i,1,n) {
		x=New(0);
		last=0;
		while (top && p[ss[top]] < p[x]) {
			upd(ss[top]);
			last=ss[top];
			top--;
		}
		if (top) {
			rs[ss[top]]=x;
		}
		ls[x]=last;
		ss[++top]=x;
	}
	while (top) 
		upd(ss[top--]);
	
	return ss[1];
}
void split(int u,ll x,int &l,int &r){
	if (!u) {
		l=r=0; return;
	}
	if (v[u]<=x) {
		l=u;
		split(rs[u],x,rs[u],r);
	}
	else{
		r=u;
		split(ls[u],x,l,ls[u]);
	}
	upd(u);
}
int merge(int l,int r){
	if (!l || !r) return l+r;
	if (p[l]>p[r]) {
		rs[l]=merge(rs[l],r);
		upd(l);
		return l;
	}
	else{
		ls[r]=merge(l,ls[r]);
		upd(r);
		return r;
	}
}
void del(ll x){
	split(rt,x,l,r);
	split(l,x-1,l,z);
	
	cnt=z-1;
	
	z=merge(ls[z],rs[z]);
	rt=merge(l,z);
	rt=merge(rt,r);
}
int tot,c[10];
inline void W(int x){
	if (!x) {
		puts("0");
		return;
	}
	
	tot=0;
	while (x){
		c[++tot]=x%10;
		x/=10;
	}
	fd(i,tot,1) {
		putchar(c[i]+'0');
	}
	putchar('\n');
	
}
void ins(ll x){
	z=New(x);
	split(rt,x,l,r);
	
	last=m-1-s[l];
	W(last);
	
	rt=merge(l,z);
	rt=merge(rt,r);
}


int main(){
	srand(time(NULL));
//	freopen("data.in","r",stdin);
//	freopen("data.out","w",stdout);
	
	int T;
	last=7;
	scanf("%d",&T);
	while (T--) {
		
		cnt=0;
		cin >> m >> n >> seed;
		fo(i,1,(int)m) h[i]=0;
		
		rt=build(m);
	
		fo(i,1,(int)n){
			x=randNum(seed,last,m);
			y=randNum(seed,last,m);
			
			k=h[x];
			if (k%mo){
				a=k/mo+1;
				b=a*mo-k;
			}
			else{
				a=k/mo;
				b=0;
			}
			a++;
			b+=y;
			
			h[x]=a*mo-b;
			
			del(k);
			ins(h[x]);
		}
	}
	return 0;
}

标签:rt,cnt,last,先生,int,top,return,TJOI2019,甲苯
From: https://www.cnblogs.com/ganking/p/17363117.html

相关文章

  • 读蒋梦麟先生的《西潮》
    在这样的心理状态之下,中国未能发展纯粹科学是毫不足奇的,因为纯粹科学是知识兴趣的表现,而非实际应用的产物。我们曾经建造长城和运河,也曾建造伟大的水利工程;我国建筑式样的宏丽,我们的宫殿和庙宇,都曾获得举世人士的激赏。这些工程足与世界上最伟大的工程成就相提并论。但是它们......
  • 葬我在拥你的春天 - 轩先生
    葬我在拥你的春天文/轩先生十三四岁的夏天,我在路上捡到了一把真枪。因为年少无知,我扣动扳机,没有人死,也没有人受伤,还以为开了空枪。后来30岁或者更老,我在路上走着,隐约风声在耳边响起,我回头,子弹正中眉心。今天听到一首很轻快又很温馨的钢琴曲,循环了好久好久,走在人头攒动的棠下街......
  • 先生的礼物 - 三毛
    先生的礼物-三毛每次圣诞节或者情人节什么的,我从不寄望得到先生什么礼物。先生说,这种节日本意是好的,只是给商人利用了。又说,何必为了节日才买东西送来送去呢?凡事但凭一......
  • [JZOJ5542] 董先生的钦点
    Descriptionn<=2000Solution假设我们考虑上空集设所有a的总和是sum那么对于每一个集合,它和它的补集之和都等于sum,那么中位数就是sum/2现在没有空集了那么中位数一定是......
  • 《擦屁股先生》词:你挚爱的强哥
    《擦屁股先生》词:你挚爱的强哥曲:姚中仁我似乎快要疯癫又过了差不多的一天需求差不多在变我花了差不多的时间bug差不多在改锅要差不多的甩活要差不多的拖总监差不多在......
  • 身边老板亲身验证铺先生转不出店,店还能交给铺先生转吗?
     张老板经营着一家餐饮店,因为种种原因,他将店铺交给了铺先生转让,转店已经有一个星期了,没有一个人来看店,为此他很惆怅。 这天,对面开便利店的钱老板见张老板生意不大好,他......
  • 深度优先生成树和广度优先生成树的详解版
    其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是图的生成树或者生成森林。图1无向图 例如,图1中的无向图是由V1~V7的顶点和编号分......
  • 铺先生是骗子?骗了金钱、时间、信任,可事实如此吗?
     经营一家餐饮店有五年多的李老板,因为种种原因通过网上联系了“铺先生”转店,自签约合同以来,对方从未帮助李老板推荐找店老板,甚至连之前说好的推广也从未做过。 门店转......
  • luogu P5339 [TJOI2019]唱、跳、rap和篮球 (容斥,指数型母函数,NTT)
    https://www.luogu.com.cn/problem/P5339要求不含1234的方案,反过来求含至少一个1234的方案。钦定存在i个位置有1234,位置的方案是Cn-3i,i.其他n-4i个位置的方案是多重集......
  • 有一天,青蛙先生看到路上有只破鞋子。3
    有一天,青蛙先生看到路上有只破鞋子。http://ds.163.com/article/63387619880c710001954ef5/?2022/10/06_=2022/10/05http://ds.163.com/feed/63387619880c710001954ef5/?202......