QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#685593#9528. New Energy Vehicleucup-team3294#WA 0ms3540kbC++232.8kb2024-10-28 20:21:222024-10-28 20:21:22

Judging History

This is the latest submission verdict.

  • [2024-10-28 20:21:22]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3540kb
  • [2024-10-28 20:21:22]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define PII pair<int,int>
#define x first
#define y second
#define endl '\n'
const int N=2e5+10;
struct node
{
	int l,r,sum;
}tr[N<<2];
void pushup(int u)
{
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void build(int u,int l,int r)
{
	tr[u].l=l;
	tr[u].r=r;
	if(l==r)
	{
		tr[u].sum=0;
	}
	else
	{
		int mid=l+r>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
}
void modify(int u,int pos,int x)
{
	if(tr[u].l==tr[u].r)
	{
		tr[u].sum=x;
	}
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(pos<=mid) modify(u<<1,pos,x);
		else modify(u<<1|1,pos,x);
		pushup(u);
	}
}
void modify1(int u,int pos,int x)
{
	if(tr[u].l==tr[u].r)
	{
		tr[u].sum+=x;
	}
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(pos<=mid) modify1(u<<1,pos,x);
		else modify1(u<<1|1,pos,x);
		pushup(u);
	}
}
int query(int u,int pos)
{
	if(tr[u].l==tr[u].r)
	{
		return tr[u].sum;
	}
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(pos<=mid) return query(u<<1,pos);
		else return query(u<<1|1,pos);
	}
}
int findr(int u,int l,int r)
{
	if(l<=tr[u].l&&tr[u].r<=r)
	{
		if(tr[u].sum==0) return -1;
		if(tr[u].l==tr[u].r) return tr[u].l;
	}
	int mid=tr[u].l+tr[u].r>>1;
	int ans=-1;
	if(l<=mid)
	{
		ans=findr(u<<1,l,r);
		if(ans!=-1) return ans;
	}
	if(r>mid) return findr(u<<1|1,l,r);
	return ans;
}
void solve(){
    int n,m;
    cin>>n>>m;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
	}
	vector<pair<int,int>> point(m+10);
	for(int i=1;i<=m;i++)
	{
		cin>>point[i].first>>point[i].second;
	}
	map<int,int> ma;
	vector<int> nex(m+10,m+1);
	for(int i=1;i<=m;i++)
	{
		int pos=point[i].first;
		int name=point[i].second;
		if(ma.count(name)==0)
		{
			ma[name]=i;
		}
		else
		{
			nex[ma[name]]=i;
			ma[name]=i;
		}
	}
	build(1,1,m+1);
	set<int> se;
	for(int i=1;i<=m;i++)
	{
		int name=point[i].second;
		if(se.count(name)==0)
		{
			se.insert(name);
			modify(1,i,a[name]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(se.count(i)==0) 
		{
			modify1(1,m+1,a[i]);
		}
	}
//	for(int i=1;i<=m+1;i++)
//	{
//		cout<<query(1,i)<<"aa"<<endl;
//	}
	int ans=0;
	int nowpos=0;
	for(int i=1;i<=m;i++)
	{
		int dis=point[i].first-nowpos;
		while(dis>0)
		{
			int t=findr(1,1,m+1);
			if(t==-1)
			{
				cout<<ans<<endl;
				return ;
			}
			int res=query(1,t);
			if(res<dis)
			{
				dis-=res;
				ans+=res;
				modify(1,t,0);
			}
			else
			{
				modify(1,t,res-dis);
				ans+=dis;
				dis=0;
			}
		}
		nowpos=point[i].first;
		int name=point[i].second;
		modify(1,i,0);
		modify1(1,nex[name],a[name]);
	}
	ans+=query(1,m+1);
	cout<<ans<<endl;
	
	
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3540kb

input:

2
3 1
3 3 3
8 1
2 2
5 2
1 2
2 1

output:

12
9

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3516kb

input:

6
3 2
2 2 2
6 1
7 1
2 2
3 3
2 1
6 2
2 3
2 2
5 1
7 2
9 1
2 2
3 3
2 1
6 2
1 1
999999999
1000000000 1
1 1
1000000000
1000000000 1

output:

7
11
4
11
999999999
2000000000

result:

wrong answer 1st lines differ - expected: '9', found: '7'