0711S组模拟赛(A/A+)
已结束
OI
开始于: 2026-7-11 14:30
3
小时
主持人:
46
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k;
struct edge{ll u,v,w;}E[200010];
bool cmp(edge A,edge B){return A.w<B.w;}
ll fa[200010];
ll get(ll x){
if(fa[x] == x) return x;
return fa[x] = get(fa[x]);
}
int main(){
freopen("speed.in", "r", stdin);
freopen("speed.out", "w", stdout);
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&E[i].u,&E[i].v,&E[i].w);
for(int i=1;i<=n;i++) fa[i]=i;
sort(E+1,E+1+m,cmp);
ll ans1=abs(E[1].w-k);
for(int i=2;i<=m;i++) ans1=min(ans1,abs(E[i].w-k));
ll ans=0;
ll cnt=0;
for(int i=1;i<=m;i++){
ll fu = get(E[i].u);
ll fv = get(E[i].v);
if(fu != fv){
fa[fu] = fv;
if(E[i].w > k) ans+=E[i].w-k;
cnt++;
}
if(cnt==n-1){
if(E[i].w < k) ans=ans1;
break;
}
}
printf("%lld\n",ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
inline void work() {
set<pair<int,int> > st;
int mx = 2e9, pos = 2e9, last = -1;
bool ok = true;
int n, m;
cin >> n >> m;
while(m--) {
string op;
int p, q;
cin >> op;
if (op == "min") {
if (!ok) cout << "bad" << endl;
else if (last != -1) {
auto ptr = st.lower_bound({last, 0});
if ((prev(ptr) -> first) == (ptr -> first) - 1) cout << (ptr -> first) << endl;
else cout << (prev(ptr) -> first) + 1 << endl;
} else {
if (st.size() == 0) cout << "0" << endl;
else {
auto ptr = *st.begin();
cout << (ptr.first + ptr.second + 1) % 2 << endl;
}
}
} else if (op == "max") {
if (!ok) cout << "bad" << endl;
else if (mx == 2e9) cout << "inf" << endl;
else cout << mx << endl;
} else {
cin >> p >> q;
if (abs(p - 1) > q) {ok = false; continue;}
if (p > 1) pos = min(pos, q);
if (p > 1) mx = min(mx, q - abs(p - 1));
st.insert({q, p});
auto ptr = st.find({q, p});
if (ptr != st.begin() && next(ptr) != st.end() && last == (next(ptr) -> first)) last = -1;
if (ptr != st.begin()) {
auto pre = *prev(ptr);
if ((pre.first + pre.second) % 2 != (p + q) % 2) last = max(last, q);
if (abs(pre.second - p) > abs(pre.first - q)) {ok = false; continue;}
}
if (next(ptr) != st.end()) {
auto nxt = *next(ptr);
if ((nxt.first + nxt.second) % 2 != (p + q) % 2) last = max(last, nxt.first);
if (abs(nxt.second - p) > abs(nxt.first - q)) {ok = false; continue;}
}
if (last > pos) {ok = false; continue;}
}
}
}
int main() {
freopen("drunkard.in", "r", stdin);
freopen("drunkard.out", "w", stdout);
cin.tie(0);
ios::sync_with_stdio(false);
work();
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define N 100007
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define mid ((l + r) / 2)
ll a[N], b[N];
struct SEG1 {
bool tag[N << 2][3];
void build(int rt, int l, int r) {
if (l == r) {
tag[rt][0] = (b[l] == 0);
tag[rt][1] = (b[l] > 0);
tag[rt][2] = (b[l] < 0);
return;
}
build(ls, l, mid);
build(rs, mid + 1, r);
rep(i, 0, 2) tag[rt][i] = tag[ls][i] && tag[rs][i];
}
void upd(int rt, int l, int r, int p) {
if (l == r) {
tag[rt][0] = (b[l] == 0);
tag[rt][1] = (b[l] > 0);
tag[rt][2] = (b[l] < 0);
return;
}
p <= mid ? upd(ls, l, mid, p) : upd(rs, mid + 1, r, p);
rep(i, 0, 2) tag[rt][i] = tag[ls][i] && tag[rs][i];
}
bool query(int rt, int l, int r, int L, int R, int op) {
if (L <= l && r <= R) return tag[rt][op];
bool ret = true;
if (L <= mid) ret = ret && query(ls, l, mid, L, R, op);
if (R > mid) ret = ret && query(rs, mid + 1, r, L, R, op);
return ret;
}
} seg1;
pair<ll, int> max(pair<ll, int> a, pair<ll, int> b) {
if (a.first > b.first) return a;
return b;
}
struct SEG2 {
int mxpos[N << 2];
ll mx[N << 2], tag[N << 2];
void pushdown(int rt) {
if (tag[rt]) {
mx[ls] += tag[rt];
mx[rs] += tag[rt];
tag[ls] += tag[rt];
tag[rs] += tag[rt];
tag[rt] = 0;
}
}
void pushup(int rt) {
if (mx[ls] > mx[rs]) {
mx[rt] = mx[ls];
mxpos[rt] = mxpos[ls];
} else {
mx[rt] = mx[rs];
mxpos[rt] = mxpos[rs];
}
}
void build(int rt, int l, int r) {
tag[rt] = 0;
if (l == r) {
mx[rt] = a[l];
mxpos[rt] = l;
return;
}
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(rt);
}
void upd(int rt, int l, int r, int L, int R, int x) {
if (L <= l && r <= R) {
mx[rt] += x;
tag[rt] += x;
return;
}
pushdown(rt);
if (L <= mid) upd(ls, l, mid, L, R, x);
if (R > mid) upd(rs, mid + 1, r, L, R, x);
pushup(rt);
}
pair<ll, int> maxpos(int rt, int l, int r, int L, int R) {
if (L <= l && r <= R) return make_pair(mx[rt], mxpos[rt]);
pushdown(rt);
pair<ll, int> ret = {-1e18, 0};
if (L <= mid) ret = max(ret, maxpos(ls, l, mid, L, R));
if (R > mid) ret = max(ret, maxpos(rs, mid + 1, r, L, R));
return ret;
}
} seg2;
int main() {
freopen("peak.in", "r", stdin);
freopen("peak.out", "w", stdout);
cin.tie(0);
ios::sync_with_stdio(false);
int n; cin >> n;
rep(i, 1, n) cin >> a[i];
rep(i, 2, n) b[i] = a[i] - a[i - 1];
seg1.build(1, 2, n);
seg2.build(1, 1, n);
int q; cin >> q;
rep(i, 1, q) {
int op, l, r;
cin >> op >> l >> r;
if (op == 1) {
int x; cin >> x;
b[l] += x;
b[r + 1] -= x;
seg1.upd(1, 2, n, l);
seg2.upd(1, 1, n, l, r, x);
if (r + 1 <= n) seg1.upd(1, 2, n, r + 1);
} else if (op <= 4) {
if (l == r) cout << 1 << endl;
else cout << seg1.query(1, 2, n, l + 1, r, op - 2) << endl;
} else {
int pos = seg2.maxpos(1, 1, n, l, r).second;
if (pos == l || pos == r) {cout << 0 << endl; continue;}
bool resl = seg1.query(1, 2, n, l + 1, pos, 1);
bool resr = seg1.query(1, 2, n, pos + 1, r, 2);
cout << (resl && resr) << endl;
}
}
return 0;
}
#include<bits/stdc++.h>
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int mod=998244353,maxn=100005;
struct sode{int l,r,v;}st[maxn],bl[maxn];
struct node{int l,r,x,v;}A[maxn*30],B[maxn*30];
struct Seg{int l,r,v;}seg[2][maxn];
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
inline int dqm(int x) {return x<0?x+mod:x;}
inline int qm(int x) {return x>=mod?x-mod:x;}
inline int cmp(const node &A,const node &B){
return A.v==B.v?A.x<B.x:A.v<B.v;
}
inline int ctp(const node &A,const node &B) {
return A.v==B.v?A.x>B.x:A.v<B.v;
}
int n,a[maxn],top,sa,sb,lp,sz[2],ans,pre[maxn];
int l[maxn*3],r[maxn*3],tag[maxn*3],d[maxn*3];
inline void pushup(int i) {d[i]=qm(d[i<<1]+d[i<<1|1]);}
inline void pushr(int i,int v) {
tag[i]=v;d[i]=1ll*(r[i]-l[i]+1)*v%mod;
}
inline void pushdown(int i) {
if(tag[i]==-1) return;pushr(i<<1,tag[i]);
pushr(i<<1|1,tag[i]);tag[i]=-1;
}
void bud(int x,int y,int i) {
l[i]=x,r[i]=y,tag[i]=-1;if(x==y) return;
int mid=x+y>>1;bud(x,mid,i<<1),bud(mid+1,y,i<<1|1);
}
void chg(int x,int y,int v,int i) {
if(x<=l[i]&&y>=r[i]) {pushr(i,v);return;}
int mid=l[i]+r[i]>>1;pushdown(i);
if(x<=mid) chg(x,y,v,i<<1);
if(y>mid) chg(x,y,v,i<<1|1);pushup(i);
}
int qry(int x,int y,int i) {
if(x<=l[i]&&y>=r[i]) return d[i];
int mid=l[i]+r[i]>>1;pushdown(i);
return qm((x<=mid?qry(x,y,i<<1):0)+(y>mid?qry(x,y,i<<1|1):0));
}
inline void ins(int l,int r,int v,int o) {
if(r>n)r=n;if(l<1)l=1;if(l>r) return;
seg[o][++sz[o]]=(Seg){l,r,v};
}
inline void calc(int l,int r,int v) {
pre[l]=qm(pre[l]+v),pre[r+1]=dqm(pre[r+1]-v);
}
inline void solve(int L,int R) {
int lst=0,v=0;sz[0]=sz[1]=0;
for(int i=L;i<=R;++i) {
chg(lst,A[i].x-1,v,1);
ins(lst+1,A[i].x,qm(v+1),0);
lst=A[i].x;
v=qm(v+qry(A[i].l-1,A[i].r-1,1));
v=qm(v+A[i].r-A[i].l+1);
}
chg(lst,n,v,1);
ins(lst+1,n+1,qm(v+1),0);
lst=n+1,v=0;int rp=lp;
while(lp<=sb&&B[lp].v==A[L].v) ++lp;
for(int i=rp;i<lp;++i) {
chg(B[i].x+1,lst,v,1);
ins(B[i].x,lst-1,qm(v+1),1);
lst=B[i].x;
v=qm(v+qry(B[i].l+1,B[i].r+1,1));
v=qm(v+B[i].r-B[i].l+1);
}
chg(1,lst,v,1);ans=qm(ans+v);
ins(0,lst-1,qm(v+1),1);
std::reverse(seg[1],seg[1]+sz[1]+1);
int x,y;x=0,y=0;
while(x<=sz[0]&&y<=sz[1]) {
calc(max(seg[0][x].l,seg[1][y].l),min(seg[0][x].r,seg[1][y].r),dqm(1ll*seg[0][x].v*seg[1][y].v%mod-1));
if(seg[0][x].r<seg[1][y].r) ++x;
else if(seg[0][x].r>seg[1][y].r) ++y;
else if(seg[0][x].r==seg[1][y].r) ++y,++x;
}
}
int main() {
freopen("selection.in", "r", stdin);
freopen("selection.out", "w", stdout);
n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) {
for(int j=1;j<=top;++j)
st[j].v=gcd(st[j].v,a[i]);
st[++top]=(sode){i,i,a[i]};
int tot=0,x=i,y=i;
for(int j=top-1;j>=0;--j) {
if(st[j].v!=st[j+1].v) {
bl[++tot].l=x,bl[tot].r=y;
bl[tot].v=st[j+1].v;
x=st[j].l,y=st[j].r;
}else x=st[j].l;
}
top=0;
while(tot) st[++top]=bl[tot--];
for(int j=1;j<=top;++j)
A[++sa]=(node){st[j].l,st[j].r,i,st[j].v};
}
top=0;
for(int i=n;i;i--) {
for(int j=1;j<=top;++j)
st[j].v=gcd(st[j].v,a[i]);
st[++top]=(sode){i,i,a[i]};
int tot=0,x=i,y=i;
for(int j=top-1;j>=0;--j)
if(st[j].v!=st[j+1].v) {
bl[++tot].l=x,bl[tot].r=y;
bl[tot].v=st[j+1].v;
x=st[j].l,y=st[j].r;
} else y=st[j].r;
top=0;
while(tot) st[++top]=bl[tot--];
for(int j=1;j<=top;++j)
B[++sb]=(node){st[j].l,st[j].r,i,st[j].v};
}
std::sort(A+1,A+sa+1,cmp);std::sort(B+1,B+sb+1,ctp);
int L=1;lp=1;
bud(0,n+1,1);
for(int i=2;i<=sa+1;++i)
if(A[i].v!=A[i-1].v)
solve(L,i-1),L=i;
for(int i=1;i<=n;i++)pre[i]=qm(pre[i-1]+pre[i]);
for(int i=1;i<=n;i++)printf("%d ",dqm(ans-pre[i]));
return 0;
}
- 状态
- 已结束
- 规则
- OI
- 题目
- 4
- 开始于
- 2026-7-11 14:30
- 结束于
- 2026-7-11 17:30
- 持续时间
- 3 小时
- 主持人
- 参赛人数
- 46