Hopping Rabbit
#include<bits/stdc++.h>
using namespace std;
const int N=500010;
int ql,qr;
struct node{
int l,r,x;
};
vector<node> v[N];
struct p{
int s,len;
}q[N];
void add(int x1,int x2,int y1,int y2){
v[x1].push_back({y1,y2,1});
v[x2+1].push_back({y1,y2,-1});
}
void pushup(int i,int l,int r){
if(q[i].s){
q[i].len=r-l+1;
}else if(l==r){
q[i].len=0;
}else{
q[i].len=q[i<<1].len+q[i<<1|1].len;
}
}
void change(int p,int l,int r,int xx){
if(ql<=l&&qr>=r){
q[p].s+=xx;
pushup(p,l,r);
return;
}
int mid=(l+r)>>1;
if(ql<=mid){
change(p<<1,l,mid,xx);
}
if(qr>mid){
change(p<<1|1,mid+1,r,xx);
}
pushup(p,l,r);
}
void get(int p,int l,int r){
if(q[p].len==0){
printf("%d\n",l);
return;
}
int mid=(l+r)>>1;
if(q[p<<1].len<mid-l+1){
get(p<<1,l,mid);
}
else{
get(p<<1|1,mid+1,r);
}
}
int main(){
int n,d;
scanf("%d %d",&n,&d);
for(int i=1;i<=n;i++){
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
x2--,y2--;
if(x2-x1+1>=d){
x1=0,x2=d-1;
}
if(y2-y1+1>=d){
y1=0,y2=d-1;
}
x1=(x1%d+d)%d;
x2=(x2%d+d)%d;
y1=(y1%d+d)%d;
y2=(y2%d+d)%d;
if(x1<=x2){
if(y1>y2){
add(x1,x2,y1,d-1);
add(x1,x2,0,y2);
}else{
add(x1,x2,y1,y2);
}
}else{
if(y1>y2){
add(x1,d-1,y1,d-1);
add(x1,d-1,0,y2);
add(0,x2,y1,d-1);
add(0,x2,0,y2);
}else{
add(x1,d-1,y1,y2);
add(0,x2,y1,y2);
}
}
}
for(int i=0;i<d;i++){
for(int j=0;j<v[i].size();j++){
ql=v[i][j].l;
qr=v[i][j].r;
change(1,0,d-1,v[i][j].x);
}
if(q[1].len<d){
printf("YES\n%d ",i);
get(1,0,d-1);
return 0;
}
}
puts("NO");
return 0;
}
Hamburger Steak
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll t;
int idx;
}Node[100010];
bool cmp(node a,node b){
return a.t<b.t;
}
struct pan{
ll k,l,r;
}Pan;
vector<pan> res[100010];
ll tt[100010];
int main(){
ll n,m;
scanf("%lld %lld",&n,&m);
ll mx=0;
ll sum=0;
for(int i=1;i<=n;i++){
scanf("%lld",&Node[i].t);
mx=max(mx,Node[i].t);
sum+=Node[i].t;
Node[i].idx=i;
}
ll ave=sum/m;
if(sum%m) ave++;
ll ans=max(ave,mx);
sort(Node+1,Node+1+n,cmp);
ll now=1;
for(int i=1;i<=n;i++){
// cout<<"now:"<<now<<endl;
if(Node[i].t+tt[now]<=ans){
Pan={now,tt[now],tt[now]+Node[i].t};
res[Node[i].idx].push_back(Pan);
tt[now]+=Node[i].t;
if(tt[now]==ans) now++;
continue;
}
if(Node[i].t+tt[now]>ans){
Pan={now,tt[now],ans};
res[Node[i].idx].push_back(Pan);
ll tmp=Node[i].t+tt[now]-ans;
now++;
Pan={now,0,tmp};
tt[now]=tmp;
res[Node[i].idx].push_back(Pan);
}
}
for(int i=1;i<=n;i++){
printf("%d ",res[i].size());
if(res[i].size()==1){
printf("%lld %lld %lld\n",res[i][0].k,res[i][0].l,res[i][0].r);
}else{
printf("%lld %lld %lld %lld %lld %lld\n",res[i][1].k,res[i][1].l,res[i][1].r,
res[i][0].k,res[i][0].l,res[i][0].r);
}
}
return 0;
}