1200~1499
void problem_solver() {
int n; cin>>n;
vector<vector<int>>g(n+1);
vector<int>p(n);
for(int i=0;i<n;i++) cin>>p[i];
for(int i=0;i<n;i++){
int w; cin>>w;
g[p[i]].push_back(w);
}
vector<int>ans(n+1);
for(int i=1;i<=n;i++){
sort(g[i].begin(),g[i].end());
int siz=g[i].size();
vector<int>pre(siz+1);
for(int j=0;j<siz;j++) pre[j+1]=pre[j]+g[i][j];
for(int j=1;j<=siz;j++){
ans[j]+=pre[siz]-pre[siz%j];
}
}
for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[i==n];
}
void problem_solver() {
int n,m,x; cin>>n>>m>>x;
vector<int>ans(n);
set<pii>s;
for(int i=0;i<m;i++) s.insert({0,i});
for(int i=0;i<n;i++){
int h; cin>>h;
auto[H,id]=*s.begin();
s.erase(s.begin());
s.insert({H+h,id});
ans[i]=id+1;
}
cout<<"YES"<<'\n';
for(auto i:ans) cout<<i<<" "; cout<<'\n';
}
1500~1799
void problem_solver() {
int n; cin>>n;
vector<int>l(n),r(n),lsh;
for(int i=0;i<n;i++) cin>>l[i]>>r[i],r[i]++,lsh.push_back(l[i]),lsh.push_back(r[i]);
sort(lsh.begin(),lsh.end());
lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
auto id=[&](int x){
return lower_bound(lsh.begin(),lsh.end(),x)-lsh.begin()+1;
};
int siz=lsh.size();
vector<int>ans(n+1),d(siz+2);
for(int i=0;i<n;i++){
int L=id(l[i]),R=id(r[i]);
d[L]++,d[R]--;
}
lsh.push_back(lsh[siz-1]+1);
for(int i=1,now=0;i<=siz;i++){
now+=d[i];
ans[now]+=lsh[i]-lsh[i-1];
}
for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[i==n];
}
void problem_solver() {
int n; cin>>n;
vector<int>mx(n+1,-1),ls(n+1,-1);
for(int i=0;i<n;i++){
int x; cin>>x;
mx[x]=max(mx[x],i-ls[x]);
ls[x]=i;
}
for(int i=1;i<=n;i++) mx[i]=max(mx[i],n-ls[i]);
vector<int>ans(n+2,INF);
for(int i=1;i<=n;i++) if(mx[i]!=-1) ans[mx[i]]=min(ans[mx[i]],i);
int res=INF;
for(int i=1;i<=n;i++){
res=min(res,ans[i]);
if(res==INF) cout<<-1<<" ";
else cout<<res<<" ";
}
cout<<'\n';
}
struct BIT{
int n;
vector<int>a;
BIT(int n):n(n),a(n+1){}
void add(int x,int val){
for(int i=x;i<=n;i+=lowbit(i)) a[i]+=val;
}
int sum(int x){
int ans=0;
for(int i=x;i>0;i-=lowbit(i)) ans+=a[i];
return ans;
}
int rangeSum(int l,int r){
return sum(r)-sum(l-1);
}
};
void problem_solver() {
int n; cin>>n;
vector<int>a(n),lsh;
for(int i=0;i<n;i++) cin>>a[i],lsh.push_back(a[i]);
sort(lsh.begin(),lsh.end());
lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
int siz=lsh.size();
BIT bit(siz);
int ans=0;
for(int i=0;i<n;i++){
int p=lower_bound(lsh.begin(),lsh.end(),a[i])-lsh.begin()+1;
int l=bit.rangeSum(1,p-1),r=bit.rangeSum(p+1,siz);
ans+=min(l,r);
bit.add(p,1);
}
cout<<ans<<'\n';
}
1800~2099
void problem_solver() {
int n; cin>>n;
vector<int>l(n),d(n);
vector<int>cnt(201);
vector<vector<int>>g(100001);
for(int&i:l) cin>>i; for(int&i:d) cin>>i;
vector<int>suf(100002);
for(int i=0;i<n;i++) suf[l[i]]+=d[i],g[l[i]].push_back(d[i]);
for(int i=100000;i>=1;i--) suf[i]+=suf[i+1];
int ans=INF;
for(int i=1,tot=0;i<=100000;i++){
int num=g[i].size(),res=suf[i+1];;
tot+=num;
int del;
if(tot/2+1<=num) del=0;
else del=tot-num*2+1;
for(int j=1,add=0;j<=200;j++){
if(add+cnt[j]<=del){
add+=cnt[j],res+=cnt[j]*j;
}
else{
res+=(del-add)*j;
break;
}
}
ans=min(ans,res);
for(auto w:g[i]) cnt[w]++;
}
cout<<ans<<'\n';
}
void problem_solver() {
int n,m; cin>>n>>m;
if(n>=m) cout<<"YES"<<'\n';
else{
vector<int>a(n);
for(int i=0;i<n;i++) cin>>a[i],a[i]%=m;
vector<int>dp(m);
dp[0]=1;
for(int i=0;i<n;i++){
vector ndp=dp;
for(int j=0;j<m;j++){
if(!dp[j]) continue;
ndp[(j+a[i])%m]++;
}
dp=ndp;
}
if(dp[0]>1) cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
}
void problem_solver() {
int n; cin>>n;
vector<pii>a(n);
for(int i=0;i<n;i++) a[i].se=i;
vector<int>del(n),l(n);
vector<vector<int>>g(n);
for(int i=0;i<n;i++){
int id,w; cin>>id>>w; id--;
a[id].fi=w;
g[id].push_back(w);
}
sort(a.begin(),a.end());
int q; cin>>q;
while(q--){
int k; cin>>k;
for(int i=0;i<k;i++) cin>>l[i],l[i]--,del[l[i]]=1;
int p1=-1,p2=-1;
for(int i=n-1;i>=0;i--){
if(del[a[i].se]) continue;
if(!a[i].fi) break;
if(p1==-1) p1=a[i].se;
else if(p2==-1) p2=a[i].se;
else break;
}
if(p1==-1) cout<<"0 0"<<'\n';
else if(p2==-1) cout<<p1+1<<" "<<*g[p1].begin()<<'\n';
else cout<<p1+1<<" "<<*lower_bound(g[p1].begin(),g[p1].end(),g[p2].back())<<'\n';
for(int i=0;i<k;i++) del[l[i]]=0;
}
}
2100~2399
void problem_solver() {
int n; cin>>n;
string s,t; cin>>s>>t;
if(count(s.begin(),s.end(),'0')!=count(t.begin(),t.end(),'0')) return void(cout<<-1<<'\n');
int ans=0;
for(int i=0,now=0,ma=0,mi=0;i<n;i++){
if(s[i]!=t[i]){
if(s[i]=='0') now++;
else now--;
}
ma=max(ma,now),mi=min(mi,now);
ans=max(ans,ma-mi);
}
cout<<ans<<'\n';
}
343D (2100)
struct SGT{
#define mid ((l+r)>>1)
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int n;
vector<int>w,tag;
SGT(int n):n(n),w(n*4),tag(n*4,-1){}
void pushdown(int u){
if(tag[u]!=-1){
tag[ls(u)]=tag[rs(u)]=tag[u];
w[ls(u)]=w[rs(u)]=tag[u];
tag[u]=-1;
}
}
void update(int u,int l,int r,int ql,int qr,int val){
if(ql<=l&&r<=qr){
tag[u]=val,w[u]=val;
return;
}
pushdown(u);
if(ql<=mid) update(ls(u),l,mid,ql,qr,val);
if(qr>mid) update(rs(u),mid+1,r,ql,qr,val);
}
int query(int u,int l,int r,int p){
if(l==r) return w[u];
pushdown(u);
if(p<=mid) return query(ls(u),l,mid,p);
else return query(rs(u),mid+1,r,p);
}
void update(int l,int r,int val){update(1,1,n,l,r,val);}
int query(int p){return query(1,1,n,p);}
};
void problem_solver()
{
int n; cin>>n;
SGT sgt(n);
vector<vector<int>>e(n+1);
for(int i=1;i<n;i++){
int u,v; cin>>u>>v;
e[u].push_back(v),e[v].push_back(u);
}
vector<int>dep,son,sz,f,top,dfn;
int tim=0;
dep=son=sz=f=top=dfn=vector<int>(n+1);
function<void(int,int)>dfs1=[&](int u,int fa){
sz[u]=1,f[u]=fa,dep[u]=dep[fa]+1;
for(auto v:e[u]){
if(v==fa) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[son[u]]<sz[v]) son[u]=v;
}
};
function<void(int,int)>dfs2=[&](int u,int topf){
dfn[u]=++tim,top[u]=topf;
if(son[u]) dfs2(son[u],topf);
for(auto v:e[u]){
if(v==f[u]||v==son[u]) continue;
dfs2(v,v);
}
};
function<void(int)>add=[&](int x){
while(x!=0){
sgt.update(dfn[top[x]],dfn[x],0);
x=f[top[x]];
}
};
dfs1(1,0); dfs2(1,1);
int q; cin>>q;
while(q--){
int op,u; cin>>op>>u;
if(op==1) sgt.update(dfn[u],dfn[u]+sz[u]-1,1);
if(op==2) add(u);
if(op==3) cout<<sgt.query(dfn[u])<<'\n';
}
}
struct SGT{
#define mid ((l+r)>>1)
#define ls (u<<1)
#define rs (u<<1|1)
int n;
vector<int>w,sum;
SGT(int n):n(n),w(4*n),sum(n*4){}
void pushdown(int u){
if(w[u]) w[ls]=w[rs]=sum[ls]=sum[rs]=w[u],w[u]=0;
}
void pushup(int u){
sum[u]=sum[ls]|sum[rs];
}
void update(int u,int l,int r,int ql,int qr,int val){
if(ql<=l&&r<=qr){
w[u]=sum[u]=val;
return;
}
pushdown(u);
if(ql<=mid) update(ls,l,mid,ql,qr,val);
if(qr>mid) update(rs,mid+1,r,ql,qr,val);
pushup(u);
}
int query(int u,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return sum[u];
pushdown(u);
int ans=0;
if(ql<=mid) ans|=query(ls,l,mid,ql,qr);
if(qr>mid) ans|=query(rs,mid+1,r,ql,qr);
return ans;
}
void update(int l,int r,int val){update(1,1,n,l,r,val);}
int query(int l,int r){return query(1,1,n,l,r);}
};
void problem_solver()
{
int n,q; cin>>n>>q;
vector<vector<int>>g(n+1);
vector<int>a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++){
int u,v; cin>>u>>v;
g[u].push_back(v),g[v].push_back(u);
}
vector<int>dfn(n+1),sz(n+1,1); int tim=0;
function<void(int)>dfs=[&](int u){
dfn[u]=++tim;
for(auto v:g[u]){
if(dfn[v]) continue;
dfs(v);
sz[u]+=sz[v];
}
};
dfs(1);
SGT sgt(n);
for(int i=1;i<=n;i++) sgt.update(dfn[i],dfn[i],(1ll<<a[i]));
while(q--){
int op,u,x; cin>>op>>u;
if(op==1) cin>>x,sgt.update(dfn[u],dfn[u]+sz[u]-1,(1ll<<x));
else{
int ans=sgt.query(dfn[u],dfn[u]+sz[u]-1);
int cnt=0;
while(ans) ans-=lowbit(ans),cnt++;
cout<<cnt<<'\n';
}
}
}
struct SGT{
#define mid ((l+r)>>1)
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int n;
vector<int>w,mx;
SGT(int n):n(n),w(n*4),mx(n*4){}
void pushup(int u){
w[u]=w[ls(u)]+w[rs(u)];
mx[u]=max(mx[ls(u)],mx[rs(u)]);
}
void build(int u,int l,int r){
if(l==r){
cin>>w[u]; mx[u]=w[u];
return;
}
build(ls(u),l,mid),build(rs(u),mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int p,int val){
if(l==r){
w[u]=mx[u]=val;
return;
}
if(p<=mid) update(ls(u),l,mid,p,val);
else update(rs(u),mid+1,r,p,val);
pushup(u);
}
void updateMod(int u,int l,int r,int ql,int qr,int c){
if(mx[u]<c) return;
if(l==r){
w[u]%=c,mx[u]%=c;
return;
}
if(ql<=mid) updateMod(ls(u),l,mid,ql,qr,c);
if(qr>mid) updateMod(rs(u),mid+1,r,ql,qr,c);
pushup(u);
}
int query(int u,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return w[u];
int ans=0;
if(ql<=mid) ans+=query(ls(u),l,mid,ql,qr);
if(qr>mid) ans+=query(rs(u),mid+1,r,ql,qr);
return ans;
}
void build(){build(1,1,n);}
void updateMod(int l,int r,int c){updateMod(1,1,n,l,r,c);}
void update(int p,int x){update(1,1,n,p,x);}
int query(int l,int r){return query(1,1,n,l,r);}
};
void problem_solver()
{
int n,m; cin>>n>>m;
SGT sgt(n);
sgt.build();
while(m--){
int op,x,y,z; cin>>op>>x>>y;
if(op==1) cout<<sgt.query(x,y)<<'\n';
if(op==2) cin>>z,sgt.updateMod(x,y,z);
if(op==3) sgt.update(x,y);
}
}
struct SGT{
#define mid ((l+r)>>1)
int n,use=0,root=0;
vector<int>w,tag,ls,rs;
SGT(int n):n(n),w(N),tag(N,-1),ls(N),rs(N){}
void pushup(int u){
w[u]=w[ls[u]]+w[rs[u]];
}
void pushdown(int u,int l,int r){
if(tag[u]!=-1){
if(!ls[u]) ls[u]=++use;
if(!rs[u]) rs[u]=++use;
tag[ls[u]]=tag[rs[u]]=tag[u];
w[ls[u]]=tag[u]*(mid-l+1),w[rs[u]]=(r-mid)*tag[u];
tag[u]=-1;
}
}
void update(int &u,int l,int r,int ql,int qr,int val){
if(!u) u=++use;
if(ql<=l&&r<=qr){
tag[u]=val,w[u]=(r-l+1)*val;
return;
}
pushdown(u,l,r);
if(ql<=mid) update(ls[u],l,mid,ql,qr,val);
if(qr>mid) update(rs[u],mid+1,r,ql,qr,val);
pushup(u);
}
void update(int l,int r,int val){update(root,1,n,l,r,val);}
};
void problem_solver()
{
int n; cin>>n;
SGT sgt(n);
int q; cin>>q;
while(q--){
int l,r,op; cin>>l>>r>>op;
if(op==1) sgt.update(l,r,1);
else sgt.update(l,r,0);
cout<<n-sgt.w[1]<<'\n';
}
}
2400~2699
struct BIT{
const int n;
vector<int>c1,c2;
BIT(int n):n(n),c1(n+1),c2(n+1){}
void add(int x,int val){
for(int i=x;i<=n;i+=i&(-i)){
c1[i]+=val,c2[i]+=(x-1)*val;
}
}
void rangeAdd(int l,int r,int val){
add(l,val),add(r+1,-val);
}
int sum(int x){
int ans=0;
for(int i=x;i>0;i-=i&(-i)){
ans+=x*c1[i]-c2[i];
}
return ans;
}
int rangeSum(int l,int r){
return sum(r)-sum(l-1);
}
};
struct ODT{
const int n;
map<int,int>mp,w;
BIT bit;
ODT(int n):n(n),bit(n){mp[0]=1;}
void split(int x){
auto it=prev(mp.upper_bound(x));
mp[x]=it->second;
}
void assign(int l,int r,int val){
split(l),split(r);
auto it=mp.find(l);
while(it->first!=r){
it=mp.erase(it);
}
mp[l]=val;
}
void update(int l,int r,int c){
split(l),split(r);
auto it=mp.find(l);
while(it->first!=r){
bit.rangeAdd(it->first,next(it)->first-1,w[it->second]-w[c]);
it=next(it);
}
}
void add(int c,int val){
w[c]+=val;
}
int query(int x){
split(x);
return bit.rangeSum(x,x)+w[mp[x]];
}
};
void problem_solver() {
int n,q; cin>>n>>q;
ODT odt(n);
while(q--){
string op; int x,y,z; cin>>op>>x;
if(op=="Color"){
cin>>y>>z;
odt.update(x,y+1,z);
odt.assign(x,y+1,z);
}
if(op=="Add"){
cin>>y;
odt.add(x,y);
}
if(op=="Query"){
cout<<odt.query(x)<<'\n';
}
}
}
2700~2999
void problem_solver()
{
int n,a,b,c; cin>>n>>a>>b>>c;
string s; cin>>s;
int cnt[2]={0,0};
for(int i=1;i<n;i++){
if(s[i]==s[i-1]) cnt[s[i]-'0']++;
}
vector<int>B;
for(int i=0;i<n;){
int j=i;
while(j<n&&s[i]==s[j]) j++;
if(s[i]=='0'&&j!=n&&i!=0) B.push_back(j-i);
i=j;
}
sort(B.begin(),B.end());
int add=B.size();
vector<int>nd1(add+1);
for(int i=0;i<add;i++) nd1[i+1]=nd1[i]+B[i];
int cnt0=count(s.begin(),s.end(),'0');
int ans=0;
for(int u2=0;u2<=cnt[1]+add;u2++){
if(cnt0>=u2){//奇==偶
int u3=max({0ll,u2-cnt[0],u2-cnt[1]});
if(u2>=nd1[max(0ll,u2-cnt[1])])
ans=max(ans,(u2-u3)*a+u2*b-u3*c);
}
if(cnt0>=u2+1){//奇-偶-奇
int u3=max({0ll,u2-cnt[0]+1,u2-cnt[1]});
if(u2>=nd1[max(0ll,u2-cnt[1])])
ans=max(ans,(u2-u3+1)*a+u2*b-u3*c);
}
if(cnt>0&&cnt0>=u2-1){//偶-奇-偶
int u3=max({0ll,u2-cnt[0]-1,u2-cnt[1]});
if(u2>=nd1[max(0ll,u2-cnt[1])])
ans=max(ans,(u2-u3-1)*a+u2*b-u3*c);
}
}
cout<<ans<<'\n';
}