layout: post
title: Codeforces Round 542 (Div. 2)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
- 并查集
---ios
传送门c++
有n个车站,按照环前进,有m条要求从x送到y,每次从x最多能拿一个糖,输出在第i个车站出发最少须要多少时间完成全部要求 (注意车的容量无穷)post
因此咱们直接枚举每一个点就好了啊。。。找到一个花费最多的点 把他送完答案就出来了 固然在送他的时候顺便把其它的都送了因此贪心的策略就是最后送少的。spa
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; const int maxn=5e4+50; const ll inf=0x3f3f3f3f3f3f3f3fLL; ll num[maxn],len[maxn]; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); ll n,m; cin>>n>>m; fill(len,len+maxn,inf); while(m--){ ll a,b; cin>>a>>b; num[a]++; if(a<b)len[a]=min(len[a],b-a); else len[a]=min(len[a],n-a+b); } for(int i=1;i<=n;i++){ if(num[i]==0)len[i]=0; } for(int i=1;i<=n;i++){ ll ans=0; for(int j=1;j<=n;j++){ ll dis=(j>=i)?j-i:n-i+j; dis+=(num[j]-1ll)*n+len[j]; ans=max(ans,dis); } cout<<ans<<" "; } return 0; }
构造题,这里有一段代码:它只会记录和为非负数的一段数乘以其区间长度的最大值,但咱们如今要求的是sum{ai}*(r-l+1),l<=i<=r,很明显这段代码是有错误的。code
而后会输入一个k,你构造一组数据,使得正解和这段代码给出的答案相差k。最后输出你给出的数据。ci
假设前面1998个a[i]的值为0,倒二的值为-p,最后一个的值为d+p;而后正解的答案是2000*d
题目的答案的d+p 相差为2000d-(d+p)=K;
1999d=k+p;
d=(k+p)/1999
令d=1999-k%19;get
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+50; int main() { int k; cin>>k; int p=1999-k%1999;; cout<<2000<<endl; for(int i=1;i<=1998;i++)cout<<0<<" "; cout<<-p<<" "<<((k+p)/1999+p)<<endl; return 0; }