社区讨论
评测机波动能波动出 RE???
P4690[Ynoi Easy Round 2016] 镜中的昆虫参与者 5已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mhjoggo7
- 此快照首次捕获于
- 2025/11/04 05:54 4 个月前
- 此快照最后确认于
- 2025/11/04 05:54 4 个月前
提交了很多发,然后随机几个点 RE,有一发很幸运地没有 RE。
这是代码和提交记录,希望得到大佬的解释awa。
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
#define itnode set<node>::iterator
vector<signed> res,rea;
const int maxn=2e5+10;
struct node{
signed l,r,da;
node (signed _l=0,signed _r=0,signed _da=0){
l=_l,r=_r,da=_da;
}
bool operator<(const node &a)const{
return l<a.l;
}
};
set<node> s;
set<node> da[maxn];
int n,m;
itnode split(int x){
itnode it=s.lower_bound(node(x,0,0));
if(it==s.begin()||it->l==x) return it;
it--;
node k=*it;
s.erase(k),s.insert(node(k.l,x-1,k.da));
da[k.da].erase(k),
da[k.da].insert(node(k.l,x-1,k.da)),da[k.da].insert(node(x,k.r,k.da));
return s.insert(node(x,k.r,k.da)).first;
}
struct Que{
signed id,x,y,da,ti;
Que(signed _id=0,signed _x=0,signed _y=0,signed _da=0,signed _ti=0){
id=_id,x=_x,y=_y,da=_da,ti=_ti;
}
}que[maxn<<3];
signed pre[maxn];
int cnt_m;
int get_count(int data,node x){
itnode it=da[data].lower_bound(x);
if(it==da[data].begin()) return 0;
else return (--it)->r;
}
void insert_q(int l,int da,int ti){
que[++cnt_m]=Que(1,l,pre[l],-1,ti);
pre[l]=da;
que[++cnt_m]=Que(1,l,da,1,ti);
}
void insert(int l,int r,int data,int ti){
itnode it2=split(r+1),it1=split(l);
for(itnode it=it1;it!=it2;it++){
da[it->da].erase(*it);
if(it->l!=l) insert_q(it->l,(it->l)-1,ti);
itnode res_it=da[it->da].upper_bound(*it);
if(res_it!=da[it->da].end()) insert_q(res_it->l,get_count(it->da,*it),ti);
}
s.erase(it1,it2);
insert_q(l,get_count(data,l),ti);
itnode res_it=da[data].upper_bound(node(l,r,data));
da[data].insert(node(l,r,data));
s.insert(node(l,r,data));
if(res_it!=da[data].end()) insert_q(res_it->l,get_count(data,*res_it),ti);
}
bool cmpti(Que a,Que b){
return a.ti==b.ti?a.id<b.id:a.ti<b.ti;
}
bool cmpx(Que a,Que b){
return a.x<b.x;
}
signed tree[maxn],ans[maxn];
#define lowbit(x) (x&-x)
void insert(int x,int da){
while(x<=maxn/2){
tree[x]+=da,x+=lowbit(x);
}
}
int find(int x){
int sum=0;
while(x>0) sum+=tree[x],x-=lowbit(x);
return sum;
}
void solve(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
// printf("%lld %lld\n",l,r);
sort(que+l,que+mid+1,cmpx),sort(que+mid+1,que+r+1,cmpx);
int i=l,j=mid+1;
while(i<=mid||j<=r){
if(i>mid||(j<=r&&que[j].x<que[i].x)){
if(que[j].id==2){
ans[que[j].ti]+=find(que[j].y+1)*que[j].da;
}
j++;
}else{
if(que[i].id==1){
insert(que[i].y+1,que[i].da);
}
i++;
}
}
for(int p=l;p<=mid;p++) if(que[p].id==1) insert(que[p].y+1,-que[p].da);
}
int cnt_rea=0;
int rd(){
return rea[cnt_rea++];
}
signed main(){
scanf("%lld%lld",&n,&m);
int id,a,b,c;
for(int i=1;i<=n;i++){
scanf("%lld",&a);
res.push_back(a),rea.push_back(a);
}
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&id,&a,&b);
rea.push_back(id),rea.push_back(a),rea.push_back(b);
if(id==1) scanf("%lld",&c),rea.push_back(c),res.push_back(c);
}
sort(res.begin(),res.end());
res.resize(unique(res.begin(),res.end())-res.begin(),0);
for(int i=1;i<=n;i++){
a=rd(),a=lower_bound(res.begin(),res.end(),a)-res.begin()+1;
s.insert(node(i,i,a));
pre[i]=get_count(a,node(i,i,a));
que[++cnt_m]=Que(1,i,pre[i],1,0);
da[a].insert(node(i,i,a));
}
// printf("qwq\n");
for(int i=1;i<=m;i++){
id=rd(),a=rd(),b=rd();
if(id==1){
c=rd(),c=lower_bound(res.begin(),res.end(),c)-res.begin()+1;
insert(a,b,c,i);
ans[i]=-1;
// for(int j=1;j<=n;j++) printf("%lld ",pre[j]);
// printf("\n");
}else{
que[++cnt_m]=Que(2,a-1,a-1,-1,i);
que[++cnt_m]=Que(2,b,a-1,1,i);
}
}
// for(int i=1;i<=cnt_m;i++){
// printf("%lld %lld %lld %lld %lld\n",que[i].id,que[i].x,que[i].y,que[i].da,que[i].ti);
// }
sort(que+1,que+1+cnt_m,cmpti);
// printf("qwq\n");
solve(1,cnt_m);
for(int i=1;i<=m;i++){
if(~ans[i]) printf("%d\n",ans[i]);
}
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...