社区讨论

数据过水(?)

P8592『JROI-8』颅脑损伤 2.0(加强版)参与者 10已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mhqm6yx9
此快照首次捕获于
2025/11/09 02:25
4 个月前
此快照最后确认于
2025/11/09 02:25
4 个月前
查看原帖
今天联考数据保证随机所以 O(n2)O(n^2) dp 没写单调队列优化,写了个暴力从后往前更新后缀max,如果不优就break掉。
然后发现也通过了数据不保证随机的这道题。
这个东西应该不难卡吧。
CPP
#include<bits/stdc++.h>
#define il inline
#define ui unsigned int
#define ll long long
#define ull unsigned ll
#define lll __int128
#define db double
#define ldb long double
#define pii pair<int,int>
#define vi vector<int>
#define vpii vector<pii>
#define fir first
#define sec second
#define gc getchar
#define pc putchar
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define pct __builtin_popcount
#define mst(a,x) memset(a,x,sizeof a)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
const int N=5e6+10,M=1<<22,INF=0x3f3f3f3f,MOD=998244353;
const ll INFll=0x3f3f3f3f3f3f3f3f;
il int rd() {int x=0,f=1; char ch=gc(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f;}
il ll rdll() {ll x=0; int f=1; char ch=gc(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f;}
il void wr(int x) {if(x==INT_MIN) return printf("-2147483648"),void(); if(x<0) return pc('-'),wr(-x); if(x<10) return pc(x+'0'),void(); wr(x/10),pc(x%10+'0');}
il void wrll(ll x) {if(x==LLONG_MIN) return printf("-9223372036854775808"),void(); if(x<0) return pc('-'),wrll(-x); if(x<10) return pc(x+'0'),void(); wrll(x/10),pc(x%10+'0');}
il void wr(int x,const char *s) {wr(x),printf("%s",s);}
il void wrll(ll x,const char *s) {wrll(x),printf("%s",s);}
il int vmod(int x) {return x>=MOD?x-MOD:x;}
il int vadd(int x,int y) {return vmod(x+y);}
il int vsub(int x,int y) {return vmod(x-y+MOD);}
il int vmul(int x,int y) {return 1ll*x*y%MOD;}
il int qpow(int x,int y) {int r=1; for(;y;y>>=1,x=vmul(x,x)) if(y&1) r=vmul(r,x); return r;}
il void cadd(int &x,int y) {x=vmod(x+y);}
il void csub(int &x,int y) {x=vmod(x-y+MOD);}
il void cmul(int &x,int y) {x=vmul(x,y);}
il void cmax(int &x,int y) {x<y&&(x=y);}
il void cmaxll(ll &x,ll y) {x<y&&(x=y);}
il void cmin(int &x,int y) {x>y&&(x=y);}
il void cminll(ll &x,ll y) {x>y&&(x=y);}
int n,m,l[N],r[N],ps[M];
ll f[M],s[M];
ui sd,w[N];
ui rnd(ui &x) {
	x^=(x<<13)&0xFFFFFFF;
	x^=x>>17;
	x^=(x<<5)&0xFFFFFFF;
	x+=100;
	return x;
}
struct LIST {;
	int id,hd[M];
	struct NODE {int to,ne; ui w;} e[N];
	il void add(int u,int v,ui w) {e[++id]={v,hd[u],w},hd[u]=id;}
} l1,l2;
int d[N],ln;
void QwQ() {
	n=rd();
	int lim=0;
	for(int i=1;i<=n;i++) l[i]=rd(),r[i]=rd(),w[i]=r[i]-l[i],d[++ln]=l[i],d[++ln]=r[i];
	sort(d+1,d+1+ln),ln=unique(d+1,d+1+ln)-d-1;
	for(int i=1;i<=n;i++) {
		l[i]=lb(d+1,d+1+ln,l[i])-d,r[i]=lb(d+1,d+1+ln,r[i])-d;
		l1.add(l[i],r[i],w[i]),l2.add(r[i],l[i],w[i]);
		cmax(lim,l[i]);
	}
	m=ln;
	for(int i=0,mx=-1;i<=m;i++) {
		for(int _=l2.hd[i],j;_;_=l2.e[_].ne) j=l2.e[_].to,cmax(mx,j);
		ps[i]=min(mx,i);
	}
	mst(f,0x3f),mst(s,0x3f);
	for(int i=0;i<=m;i++) {
		for(int _=l1.hd[i],j;_;_=l1.e[_].ne) {
			j=l1.e[_].to;
			if(!i||!~ps[i-1]) cminll(f[j],l1.e[_].w);
			else cminll(f[j],s[ps[i-1]]+l1.e[_].w);
		}
		for(int j=i;~j&&s[j]>f[i];j--) s[j]=f[i];
	}
	wrll(s[lim],"\n");
}
signed main() {
//	freopen("rules.in","r",stdin),freopen("rules.out","w",stdout);
	int T=1; while(T--) QwQ();
}

回复

9 条回复,欢迎继续交流。

正在加载回复...