Submission #1176819

#TimeUsernameProblemLanguageResultExecution timeMemory
1176819sleepntsheepFood Court (JOI21_foodcourt)C++20
0 / 100
195 ms31124 KiB
#include <vector>
#include <algorithm>
#include <set>
#include <deque>
#include <utility>
#include <stdio.h>

using namespace std;
template<typename T>
using ve=std::vector<T>;
using pii=std::pair<int,int>;

int n, m, q, sub3, sub4;
struct Q{
    int t,a,b,c,d;
    long long k;
}qq[250000];

int main() {
    scanf("%d%d%d", &n, &m, &q);

    sub3 = 1;
    sub4 = m == 1;

    sub4=1;
    for (int i = 0; i < q; ++i) {
	scanf("%d", &qq[i].t);
	if (qq[i].t == 1) {
	    scanf("%d%d%d%d", &qq[i].a, &qq[i].b, &qq[i].c, &qq[i].d);
	    sub3 &= (qq[i].b - qq[i].a <= 10 && qq[i].d == 1);
	}
	else if (qq[i].t == 2)
	    scanf("%d%d%d", &qq[i].a, &qq[i].b, &qq[i].c);
	else
	    scanf("%d%lld", &qq[i].a, &qq[i].k);
    }

    if(0&&n<=2000&&q<=2000){
	ve<deque<pii>>x(2001);
	for(int i=0;i<q;++i){
	    auto[t,a,b,c,d,k]=qq[i];
	    if(t==1){
		for(int j=a;j<=b;++j)x[j].emplace_back(d,c);
	    }else if(t==2){
		for(int j=a;j<=b;++j){
		    int k2=c;
		    while(x[j].size()&&k2){
			if(x[j][0].first<=k2){
			    k2-=x[j][0].first;
			    x[j].pop_front();
			}else{
			    x[j][0].first-=k2;
			    k2=0;
			}
		    }
		}
	    }else{
		long long j=0,k2=k;
		for(;j<=x[a].size()&&k2;++j){
		    if(j==x[a].size()){
			puts("0");
			break;
		    } else if(k2<=x[a][j].first){
			printf("%d\n",x[a][j].second);
			k2=0;
			break;
		    }else{
			k2-=x[a][j].first;
		    }
		}
	    }
	}
    }
    else if(0&&sub3){
	set<int>s;
	ve<deque<int>>x(n+1);
	for(int i=0;i<q;++i){
	    auto[t,a,b,c,d,k]=qq[i];
	    if(t==1){
		for(int j=a;j<=b;++j){
		    if(x[j].empty())s.insert(j);
		    x[j].push_back(c);
		}
	    }else if(t==2){
		auto it=s.lower_bound(a);
		for(;it!=s.end()&&*it<=b;){
		    int k2=c;
		    while(x[*it].size()&&k2--){
			x[*it].pop_front();
		    }
		    if(x[*it].empty())it=s.erase(it);
		    else ++it;
		}
	    }else{
		if(k<=x[a].size())printf("%d\n",x[a][k-1]);
		else puts("0");
	    }
	}
    } else if (sub4){
	struct{
	    int sent=0;
	    ve<long long>tt,lza,lzb;

	    void x(){
		tt.assign(999999,0);
		lza.assign(999999,sent);
		lzb.assign(999999,0);
	    }

	    void pus(int v,int l,int r){
		if(lzb[v]){
		    if(l!=r){
			lzb[v*2+1]=lzb[v];
			lzb[v*2+2]=lzb[v];
		    }else{
			tt[v]=std::max(tt[v],0ll);
		    }
		    lzb[v]=0;
		}
		if(lza[v]-sent){
		    if(l!=r){
			lza[v*2+1]+=lza[v];
			lza[v*2+2]+=lza[v];
		    }else{
			tt[v]+=lza[v];
		    }
		    lza[v]=sent;
		}
	    }
	    void add(int v,int l,int r,int x,int y,int k){
		pus(v,l,r);
		if(r<x||y<l)return;
		if(x<=l&&r<=y){
		    lza[v]=k;
		    pus(v,l,r);
		    return;
		}
		add(v*2+1,l,(l+r)/2,x,y,k);
		add(v*2+2,(l+r)/2+1,r,x,y,k);
	    }
	    void chmax(int v,int l,int r,int x,int y){
		pus(v,l,r);
		if(r<x||y<l)return;
		if(x<=l&&r<=y){
		    lzb[v]=1;
		    pus(v,l,r);
		    return;
		}
		chmax(v*2+1,l,(l+r)/2,x,y);
		chmax(v*2+2,(l+r)/2+1,r,x,y);
	    }
	    long long pt(int v,int l,int r,int p){
		pus(v,l,r);
		if(l==r)return tt[v];
		if(p<=(l+r)/2)return pt(v*2+1,l,(l+r)/2,p);
		else return pt(v*2+2,(l+r)/2+1,r,p);
	    }
	}s;
	s.x();

	for(int i=0;i<q;++i){
	    auto[t,a,b,c,d,k]=qq[i];
	    if(t==1){
		s.add(0,0,n,a,b,d);
	    }else if(t==2){
		s.add(0,0,n,a,b,-c);
		s.chmax(0,0,n,a,b);
	    }else{
		long long k2=s.pt(0,0,n,a);
		printf("%d\n",k2>=k?1:0);
	    }
	}

    }



    return 0;
}

Compilation message (stderr)

foodcourt.cpp: In function 'int main()':
foodcourt.cpp:20:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |     scanf("%d%d%d", &n, &m, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:27:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |         scanf("%d", &qq[i].t);
      |         ~~~~~^~~~~~~~~~~~~~~~
foodcourt.cpp:29:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   29 |             scanf("%d%d%d%d", &qq[i].a, &qq[i].b, &qq[i].c, &qq[i].d);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:33:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   33 |             scanf("%d%d%d", &qq[i].a, &qq[i].b, &qq[i].c);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:35:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |             scanf("%d%lld", &qq[i].a, &qq[i].k);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...