75pts WA求助
查看原帖
75pts WA求助
989792
lrx___楼主2025/1/28 22:06

应该不会是炸 int 吧。

#include <bits/stdc++.h>
#ifndef ONLINE_JUDGE
#define debug(...) fprintf(stderr,__VA_ARGS__)
#else
#define debug(...)
#endif
using namespace std;
using namespace chrono;
typedef signed char i8;typedef short i16;typedef int i32;typedef long long i64;typedef unsigned char u8;typedef unsigned short u16;typedef unsigned u32;typedef unsigned long long u64;typedef float f32;typedef double f64;typedef long double f96;
template<typename A,typename B>void to_max(A& a,B b){if(a<b)a=b;}
template<typename A,typename B>void to_min(A& a,B b){if(b<a)a=b;}
#define __use_fast_io
namespace fast_io{
#ifndef __cplusplus
#define __cplusplus 201402L
#endif
const unsigned is(1<<21),os(1<<14);bool ne;char i[is],o[os],*ib(i),*ie(i),*ob(o),*oe(o+os),a[20],&c(*a),*b;void f(){ob-=fwrite(o,1,ob-o,stdout);}void p(char c){if(ob==oe)f();*ob++=c;}template<typename T>void _write(T&r){if(r==0)return p('0');if(r<0)p('-'),r=~(r-1);for(b=a;r;r/=10)*++b=(r%10)^'0';while(b!=a)p(*b--);}
#define g (ib==ie&&(ie=(ib=i)+fread(i,1,is,stdin),ib==ie)?-1:*ib++)
void reads(char*s){for(c=g;~c&&isspace(c);c=g);for(*s++=c,c=g;~c&&!isspace(c);c=g)*s++=c;*s=0;}template<typename T>void read(T&r){ne=false;for(c=g;~c&&(c<'0'||c>'9');c=g)ne=(c=='-');for(r=c^'0',c=g;isdigit(c);c=g)r=(r<<3)+(r<<1)+(c^'0');if(ne)r=~(r-1);}template<>void read<char>(char&r){for(c=g;~c&&isspace(c);c=g);r=c;}template<>void read<string>(string&r){r.clear();for(c=g;~c&&isspace(c);c=g);for(r.push_back(c),c=g;~c&&!isspace(c);c=g)r.push_back(c);}
#undef g
#if(__cplusplus>=201703L)
template<typename...Args>void read(Args&...args){(read(args),...);}template<typename...Args>void _write(Args&...args){(_write(args),...);}
#else
template<typename T,typename...args>void read(T&a,args&...b){read(a);read(b...);}template<typename T,typename...args>void _write(T&a,args&...b){_write(a);_write(b...);}
#endif
template<>void _write<char>(char&r){p(r);}template<>void _write<char*>(char*&r){for(;*r;p(*r++));}template<>void _write<const char*>(const char*&r){for(;*r;p(*r++));}template<>void _write<string>(string&r){const char*s(r.data());_write(s);}template<typename...args>void write(args...a){_write(a...);}struct _des{~_des(){f();}}d;}using fast_io::read;using fast_io::reads;using fast_io::write;

constexpr int N(3e5+5);
int n,m,q,sta[N<<5],top;
struct node{
	int ch[2],fa;
	i64 sz,l,r;
	node():fa(0){
		ch[0]=ch[1]=0;
	}
	node(i64 _l,i64 _r,int _fa=0):fa(_fa),sz(_r-_l+1),l(_l),r(_r){
		ch[0]=ch[1]=0;
	}
}t[N<<5];
#define ls(u) t[u].ch[0]
#define rs(u) t[u].ch[1]
#define fa(u) t[u].fa
#define sz(u) t[u].sz
#define le(u) t[u].l
#define ri(u) t[u].r
#define dir(u) (rs(fa(u))==u)
i64 new_node(i64 l,i64 r,int fa=0){
	int u(sta[--top]);
	t[u]=node(l,r,fa);
	return u;
}
struct splay_tree{
	int root;
	splay_tree():root(0){}
	void push_up(int u){
		sz(u)=sz(ls(u))+sz(rs(u))+ri(u)-le(u)+1;
	}
	void init(){
		root=new_node(0,0);
		rs(root)=new_node(N,N,root);
		push_up(root);
	}
	void init(i64 l,i64 r){
		root=new_node(0,0);
		rs(root)=new_node(N,N,root);
		ls(rs(root))=new_node(l,r,rs(root));
		push_up(rs(root));
		push_up(root);
	}
	void rotate(int u){
		bool d(dir(u));
		int f(fa(u)),g(fa(f));
		t[f].ch[d]=t[u].ch[d^true];
		if(t[f].ch[d]){
			fa(t[f].ch[d])=f;
		}
		t[u].ch[d^true]=f;
		if(g){
			t[g].ch[dir(f)]=u;
		}else{
			root=u;
		}
		fa(f)=u;fa(u)=g;
		push_up(f);push_up(u);
	}
	void splay(int u,int p=0){
		for(int f;(f=fa(u))!=p;rotate(u)){
			if(fa(f)!=p){
				rotate(dir(u)^dir(f)?u:f);
			}
		}
	}
	int kth_node(i64 k){
		int u(root);
		i64 l,r;
		while(true){
			l=sz(ls(u))+1;
			r=l+ri(u)-le(u);
			if(k<l){
				u=ls(u);
			}else if(k<=r){
				return u;
			}else{
				k-=r;
				u=rs(u);
			}
		}
		return -1;
	}
	void split(i64 pos){
		int u(kth_node(pos));
		i64 l,r;
		splay(u);
		pos-=sz(ls(u));
		pos+=le(u)-1;
		if(ri(u)!=pos){
			l=pos+1;r=ri(u);
			ri(u)=pos;
			u=rs(u);
			while(ls(u)){
				u=ls(u);
			}
			ls(u)=new_node(l,r,u);
			splay(ls(u));
		}
	}
	i64 erase(i64 pos){
		++pos;
		split(pos-1);
		split(pos);
		int u(kth_node(pos-1)),v(kth_node(pos+1));
		i64 res;
		splay(u);splay(v,u);
		res=le(ls(v));
		sta[top++]=ls(v);
		ls(v)=0;
		push_up(v);push_up(u);
		return res;
	}
	void add(i64 pos,i64 id){
		++pos;
		int u(kth_node(pos-1));
		splay(u);
		u=rs(u);
		while(ls(u)){
			u=ls(u);
		}
		ls(u)=new_node(id,id,u);
		splay(ls(u));
	}
}tree[N],last_col;

void reset_nodes(){
	int i;
	for(i=(N<<5)-1;i;--i){
		sta[top++]=i;
	}
}
void corner_solve(){
	int i,x,y;
	i64 res;
	last_col.init(1,n);
	for(i=1;i<=q;++i){
		read(x,y);
		res=last_col.erase(x);
		last_col.add(n,res);
		write(res,'\n');
	}
}
int main(){
	reset_nodes();
	int i,x,y;
	i64 res,res1;
	read(n,m,q);
	if(m==1){
		corner_solve();
		return 0;
	}
	last_col.init();
	for(i=1;i<=n;++i){
		tree[i].init((i-1ll)*m+1,(i64)(i)*m-1);
		last_col.add(i,(i64)(i)*m);
	}
	for(i=1;i<=q;++i){
		read(x,y);
		if(y==m){
			res=last_col.erase(x);
			last_col.add(n,x);
		}else{
			res=tree[x].erase(y);
			res1=last_col.erase(x);
			tree[x].add(m-1,res1);
			last_col.add(n,res);
		}
		write(res,'\n');
	}
	return 0;
}

2025/1/28 22:06
加载中...