AT 骆驼题 WA5 求调
查看原帖
AT 骆驼题 WA5 求调
462558
ziyistudy楼主2024/7/27 12:24

WA ON:small_01/02/09/10/18

(提交)[https://atcoder.jp/contests/arc105/submissions/55987948]

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll MOD=998244353;
// head
const int N=10,M=1e5+5,INF=1e18;
struct node{int l,v;}brg[M];bool cmp(node p,node q){return p.v<q.v;}
int a[N];
int le[M],v[M];
int sum[N];
int ls(int x) {return x<<1;}
int rs(int x) {return x<<1|1;}
struct Seg
{
	int ans[M<<2];
	void push_up(int dir)
	{
		ans[dir]=max(ans[ls(dir)],ans[rs(dir)]);
	}
	void build_tree(int dir,int l,int r)
	{
		if(l==r) {ans[dir]=le[l];return ;}
		int mid=(l+r)>>1;
		build_tree(ls(dir),l,mid);
		build_tree(rs(dir),mid+1,r);
		push_up(dir);
	}
	int query(int qx,int qy,int x,int y,int dir)
	{
		int sum=0;
		if(qx<=x&&y<=qy) return ans[dir];
		int mid=(x+y)>>1;
		if(qx<=mid) sum=query(qx,qy,x,mid,ls(dir));
		if(qy>mid) sum=max(sum,query(qx,qy,mid+1,y,rs(dir)));
		return sum;
	}
}tree;
signed main() 
{
	cin.tie(nullptr);
	ios::sync_with_stdio(false);

	int n,m;cin>>n>>m;
	int maxn=0;
	for(int i=1;i<=n;i++) {cin>>a[i];maxn=max(maxn,a[i]);}
	for(int i=1;i<=m;i++) cin>>brg[i].l>>brg[i].v;
	sort(brg+1,brg+1+m,cmp);
	for(int i=1;i<=m;i++) le[i]=brg[i].l,v[i]=brg[i].v;
	tree.build_tree(1,1,m);
	if(maxn>v[1]) {cout<<-1<<endl;return 0;}
	vector<int> pos;for(int i=1;i<=n;i++) pos.pb(i);
	int ans=INF;
	do
	{
		for(int i=1;i<=n;i++) sum[i]=0;
		for(int i=2;i<=n;i++){
			for(int j=i;j<=n;j++){
				int cnt=0,cnt1=0;
				for(int k=j-i+1;k<j;k++) cnt+=sum[k];
				for(int k=j-i+1;k<=j;k++) cnt1+=a[pos[k-1]];
				int dir=lower_bound(v+1,v+1+m,cnt1)-v-1;
				if(dir==0) continue;
				int tmpp=tree.query(1,dir,1,m,1);
				if(tmpp>cnt) sum[j-1]+=tmpp-cnt;
			}
		}
		int cnt=0;
		for(int i=1;i<n;i++) cnt+=sum[i];
		ans=min(ans,cnt);
	}while(next_permutation(all(pos)));
	cout<<ans<<endl;
}
2024/7/27 12:24
加载中...