ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MET-Meteors

2020-02-28 13:39:20  阅读:271  来源: 互联网

标签:二分 ch Meteors int tr long MET need


题目链接:MET-Meteors


显然这个东西具有二分性。

但是一个一个二分太慢了,我们观察可以发现 可以整体二分,于是整体二分一下即可,不过比较卡常。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
typedef long long LL;
const int N=3e5+10,M=N<<1;
int n,m,k,cl[N],cr[N],ca[N],res[N];	LL d[M];
struct node{int id,need;}t[N],st[M];	vector<int> v[N];
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){
    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;
}
inline void insert(int x,int v){for(;x<=2*m;x+=x&(-x)) d[x]+=v;}
inline LL ask(int x){LL s=0; for(;x;x-=x&(-x)) s+=d[x]; return s;}
void solve(int l,int r,int x,int y){
	if(l==r){for(int i=x;i<=y;i++)	res[t[i].id]=l; return ;}
	int mid=l+r>>1;	int tl=0,tr=n;
	for(int i=l;i<=mid;i++)	insert(cl[i],ca[i]),insert(cr[i]+1,-ca[i]);
	for(int i=x;i<=y;i++){
		LL s=0;
		for(auto to:v[t[i].id]){
			s+=ask(to)+ask(to+m);	if(s>=t[i].need)	break;
		}
		if(s>=t[i].need)	st[++tl]=t[i];
		else	st[++tr]=t[i],st[tr].need-=s;
	}
	for(int i=l;i<=mid;i++)	insert(cl[i],-ca[i]),insert(cr[i]+1,ca[i]);
	for(int i=1;i<=tl;i++)	t[x+i-1]=st[i];
	for(int i=n+1;i<=tr;i++)	t[x+tl+i-n-1]=st[i];
	solve(l,mid,x,x+tl-1),solve(mid+1,r,x+tl,y);
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=m;i++)	v[read()].push_back(i);
	for(int i=1;i<=n;i++)	t[i].need=read(),t[i].id=i;
	k=read();
	for(int i=1;i<=k;i++)	cl[i]=read(),cr[i]=read(),ca[i]=read();
	for(int i=1;i<=k;i++)	if(cr[i]<cl[i])	cr[i]+=m;
	solve(1,k+1,1,n);
	for(int i=1;i<=n;i++)
		if(res[i]==k+1)	puts("NIE");
		else	printf("%d\n",res[i]);
	return 0;
}
青烟绕指柔! 发布了649 篇原创文章 · 获赞 242 · 访问量 4万+ 私信 关注

标签:二分,ch,Meteors,int,tr,long,MET,need
来源: https://blog.csdn.net/weixin_43826249/article/details/104554700

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有