社区讨论
线段树分治求卡常
P11619[PumpkinOI Round 1] 种南瓜参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj1n0kw
- 此快照首次捕获于
- 2025/11/03 19:15 4 个月前
- 此快照最后确认于
- 2025/11/03 19:15 4 个月前
RT T了2个点
CPP#include<bits/stdc++.h>
namespace whaleL{
using namespace std;
#define pii pair<int, int>
#define fi first
#define se second
#define ull unsigned long long
#define ll long long
#define db double
#define re return
#define con continue
#define brk break
#define emp emplace
#define emb emplace_back
#define bk back()
#define pbk pop_back()
#define mpr make_pair
#define lwb lower_bound
#define upc upper_bound
#define all(x)x.begin(),x.end()
#define mms(a,b)memset(a,b,sizeof(a))
#define sml(a,b)(a=min(a,b))
#define big(a,b)(a=max(a,b))
#define fo(i,j,n)for(int i=(j);i<=(n);i++)
#define fr(i,j,n)for(int i=(j);i>=(n);i--)
#define fu(i,j,n)for(int i=(j);i<(n);i++)
#define f(i,n)fo(i,1,n)
#define r(i,n)fr(i,n,1)
#define u(i,n)fu(i,0,n)
#define il inline
#define tln template<typename m>
#define tls template<typename m,typename...ms>
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//------------------------------fast IO------------------------------//
#ifdef _WIN32
#define getchar _getchar_nolock
#define putchar _putchar_nolock
#elif __linux__
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
#define isd(c)((c)>47&&(c)<58)
#define iss(c)((c)<33)
#define getc(c) for(c=getchar();iss(c);c=getchar());
il void sf(){}il void ot(){}il void dt(){}il void ut(){putchar('\n');}
tln il void sf(m&x){char f=1,c=getchar();x=0;for(;!isd(c);c=getchar())(c=='-')?f=-1:0;for(;isd(c);c=getchar())x=x*10+c-48;x*=f;}
tln il void dt(m x){x<0?x=-x,putchar('-'):0;static short s[51],t(0);do s[++t]=x%10;while(x/=10);for(;t;)putchar(s[t--]|48);}
il void sf(pii &x){sf(x.fi);sf(x.se);}
il void sf(char&x){getc(x);}
il void dt(char x){putchar(x);}
il void sf(char*x){char c;getc(c);for(;!iss(c);c=getchar())*x++=c;*x=0;}
tln il void dt(m*x){while(*x)putchar(*x++);}
il void sf(string&x){x.clear();char c;getc(c);for(;!iss(c);c=getchar())x=x+c;}
il void dt(string x){printf("%s", x.c_str());}
il void sf(db&x){scanf("%lf", &x);}
il void dt(db x){printf("%lf", x);}
il void sf(long db&x){scanf("%Lf", &x);}
il void dt(long db x){printf("%Lf", x);}
tls il void sf(m&x,ms&...y){sf(x);sf(y...);}
tls il void dt(m x,ms...y){dt(x);dt(y...);}
tls il void ot(m x,ms...y){dt(x);putchar(' ');ot(y...);}
tls il void ut(m x,ms...y){dt(x);putchar(' ');ut(y...);}
//-------------------------------debug-------------------------------//
// #define cerr cout
il void P(){cerr<<'\n';}
tls void P(m a,ms...b){cerr<<a<<' ';P(b...);}
il void S(string s,int a){cerr<<s<<a<<" : ";}
tln il void pc(m*a,m*b){for(cerr<<"{";a!=b;(a!=b)&&(cerr<<',',0))cerr<<*a++;cerr<<"}\n";}
tln il void pc(m a,m b){for(cerr<<"{";a!=b;(a!=b)&&(cerr<<',',0))cerr<<*a++;cerr<<"}\n";}
#undef cerr
#ifndef ONLINE_JUDGE
#define err()(S("err Line ",__LINE__),exit(0))
#define p(x...)(S("["#x"] Line ",__LINE__),P(x))
#define pa(x,y)(S("["#x" ~ "#y"] Line ",__LINE__),pc(x,y))
#define g(x...) do{x;}while(0);
#else
#define err()0
#define p(...)0
#define pa(...)0
#define g(...)
#endif
#ifndef DISFILE
#define file(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout)
#else
#define file(x)
#endif
const ull MOD = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const db eps = 1e-8;
struct Mod {ull m,b;Mod(ull m):m(m),b(((__uint128_t)1<<64)/m){}ull Mods(ull a){ull q=((__uint128_t)a*b)>>64;ull r=a-q*m;re r<m?r:r-m;}}mo(MOD);
#define mod(x)mo.Mods(1ll*x)
};using namespace whaleL;
const int N = 2e5 + 233;
#define int ll
#define ls (k << 1)
#define rs (k << 1 | 1)
#define mid (l + r >> 1)
#define lson ls, l, mid
#define rson rs, mid + 1, r
#define fson 1, 1, n
#define LSON lson, ql, qr
#define RSON rson, ql, qr
#define FSON fson, ql, qr
struct qus{
int u, v, end;
}qu[N];
int n, q;
namespace s1{
int t[N << 2];
il void modify(int k, int l, int r, int ql, int qr, int c) {
if (l == r) {t[k] = c; re;}
if (ql <= mid) modify(LSON, c);
else modify(RSON, c);
t[k] = max(t[ls], t[rs]);
}
il int ask(int k, int l, int r, int ql, int qr) {
if (l == r) re t[k];
if (ql <= mid) re ask(LSON);
re ask(RSON);
}
il int query(int k, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr)
re t[k];
int res = 0;
if (ql <= mid) big(res, query(LSON));
if (mid < qr) big(res, query(RSON));
re res;
}
il void modify(int ql, int c) {modify(fson, ql, ql, c);}
il bool query(int ql, int qr) {
if (ql == qr) re false;
int u = query(fson, ql + 1, qr);
re qr < u;
}
il int ask(int q) {re ask(fson, q, q);}
}
namespace s2{
int t[N << 2];
il void modify(int k, int l, int r, int ql, int qr, int c) {
if (l == r) {t[k] = c; re;}
if (ql <= mid) modify(LSON, c);
else modify(RSON, c);
t[k] = min(t[ls], t[rs]);
}
il int ask(int k, int l, int r, int ql, int qr) {
if (l == r) re t[k];
if (ql <= mid) re ask(LSON);
re ask(RSON);
}
il int query(int k, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr)
re t[k];
int res = 0x3f3f3f3f;
if (ql <= mid) sml(res, query(LSON));
if (mid < qr) sml(res, query(RSON));
re res;
}
il void modify(int ql, int c) {modify(fson, ql, ql, c);}
il bool query(int ql, int qr) {
if (ql == qr) re false;
int u = query(fson, ql, qr - 1);
re ql > u;
}
il int ask(int q) {re ask(fson, q, q);}
}
vector<pii> t[N << 2];
il void modify(int k, int l, int r, int ql, int qr, pii c) {
if (ql <= l && r <= qr) {t[k].emb(c); re;}
if (ql <= mid) modify(LSON, c);
if (mid < qr) modify(RSON, c);
}
il void modify(int ql, int qr, pii c) {modify(1, 1, q, ql, qr, c);}
il void solve(int k, int l, int r, bool tag) {
vector<pii> x;
for (int i = 0, u, v, siz = t[k].size(); i < siz; i ++) {
u = t[k][i].fi, v = t[k][i].se;
x.emb(s1::ask(u), s2::ask(v));
tag = tag | s1::query(u, v) | s2::query(u, v);
if (v > x[i].fi)
s1::modify(u, v);
if (u < x[i].se)
s2::modify(v, u);
}
if (l == r) {
if (tag) ut("No");
else ut("Yes");
}
else {
solve(lson, tag);
solve(rson, tag);
}
for (int i = t[k].size() - 1, u, v; ~i; i --) {
u = t[k][i].fi, v = t[k][i].se;
s1::modify(u, x[i].fi);
s2::modify(v, x[i].se);
}
}
signed main() {
mms(s2::t, 0x3f);
sf(n, q);
int op, u, v;
f(i, q) qu[i].end = q;
f(i, q) {
sf(op, u);
if (op == 1) sf(v), qu[i].u = u, qu[i].v = v;
else qu[u].end = i - 1;
}
f(i, q) {
if (qu[i].u)
modify(i, qu[i].end, mpr(qu[i].u, qu[i].v));
}
solve(1, 1, q, 0);
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...