社区讨论

评测机波动能波动出 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 条回复,欢迎继续交流。

正在加载回复...