답안 #945851

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
945851 2024-03-14T08:12:06 Z teacup Fancy Fence (CEOI20_fancyfence) C++17
0 / 100
1000 ms 2396 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
typedef vector<int> vi;
#define iii tuple<int,int,int>
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef map<int,int> mii;

#ifndef debug
	#define cerr if (0) cerr
#endif
int N,H[10005],W[10005];
int pref[10005], last_mins[10005];
const int mod=1e9+7;
int nc2(int n){
	return ((n*(n-1))/2)%mod;
}
int rect(int h, int w){
	return (nc2(h+1)*nc2(w+1))%mod;
}
struct node{
	int s,e,mn,mx,sum,add_val,set_val;
	bool lset;
	node *l, *r;
	node (int _s, int _e, int A[]=NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL){
		if (A==NULL) return;
		if (s==e) mn=mx=sum=A[s];
		else{
			l=new node(s, (s+e)>>1,A), r=new node((s+e+2)>>1,e,A);
			combine();
		}
	}
	void create_children(){
		if (s==e) return;
		if (l!=NULL) return;
		int m=(s+e)>>1;
		l=new node(s,m);
		r=new node(m+1,e);
	}
	void self_set(int v){
		lset=1;
		mn=mx=set_val=v;
		sum=v*(e-s+1);
		add_val=0;
	}
	void self_add(int v){
		if (lset) {self_set(v+set_val); return;}
		mn+=v, mx+=v, add_val+=v;
		sum+=v*(e-s+1);
	}
	void lazy(){
		if (s==e) return;
		if (lset){
			l->self_set(set_val), r->self_set(set_val);
			set_val=0; lset=0;
		}
		if (add_val!=0){
			l->self_add(add_val), r->self_add(add_val);
			add_val=0;
		}
	}
	void combine(){
		if (l==NULL) return;
		sum=l->sum +r->sum;
		mn=min(l->mn,r->mn);
		mx=max(l->mx,r->mx);
	}
	#define UPDATE(name)\
	void name(int x, int y, int v){\
		if (s==x&&e==y) {self_##name(v); return;}\
		int m=(s+e)>>1; \
		create_children(); lazy();\
		if (x<=m) l->name(x,min(y,m),v);\
		if (y>m) r->name(max(x,m+1),y,v);\
		combine();\
	}
	UPDATE(add)
	UPDATE(set)
	#define QUERY(name,fn,var,lazyfn)\
	int range_##name(int x, int y){\
		if (s==x&&e==y) return var;\
		if (l==NULL||lset) return lazyfn(var);\
		int m=(s+e)>>1; lazy();\
		if (y<=m) return l->range_##name(x,y);\
		if (x>m) return r->range_##name(x,y);\
		return fn(l->range_##name(x,m), r->range_##name(m+1,y));\
	}
	#define SAME(var) (var)
	#define PART(var) ((var)/(e-s+1)*(y-x+1))
	#define SUM(a,b) ((a)+(b))
	QUERY(min,min,mn,SAME)
	QUERY(max,max,mx,SAME)
	QUERY(sum,SUM,sum,PART)
	~node(){
		if (l!=NULL) delete l;
		if (r!=NULL) delete r;
	}
}*root;

int32_t main(){
	cin>>N;
	int last_min = -1;
	for (int i=0; i<N; i++)cin>>H[i];
	for (int i=0; i<N; i++){
		cin>>W[i];
		if (i==0) pref[i]=W[i];
		else pref[i]=W[i]+pref[i-1];
		
		last_mins[i]=last_min;
		if (i>0 && H[i-1]>H[i]){
			last_min = i;
		}
	}
	
	root = new node(0,N-1,H);
	
	int ans=0, sum=0;
	for (int i=0; i<N; i++){
		ans += rect(H[i],W[i]);
		ans %= mod;
		int curr_last=last_mins[i];
		for (int j=i-1; j>curr_last; j--){
			ans += nc2(root->range_min(j,i)+1)*((W[j]*W[i])%mod);
			ans %= mod;
		}
		if (curr_last!=-1){
			ans += ((pref[curr_last]*nc2(H[curr_last]+1))%mod) * W[i];
			ans%=mod;
		}
	}
	cout<<ans;
}

Compilation message

fancyfence.cpp: In constructor 'node::node(long long int, long long int, long long int*)':
fancyfence.cpp:25:7: warning: 'node::lset' will be initialized after [-Wreorder]
   25 |  bool lset;
      |       ^~~~
fancyfence.cpp:24:20: warning:   'long long int node::add_val' [-Wreorder]
   24 |  int s,e,mn,mx,sum,add_val,set_val;
      |                    ^~~~~~~
fancyfence.cpp:27:2: warning:   when initialized here [-Wreorder]
   27 |  node (int _s, int _e, int A[]=NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL){
      |  ^~~~
fancyfence.cpp: In function 'int32_t main()':
fancyfence.cpp:119:13: warning: unused variable 'sum' [-Wunused-variable]
  119 |  int ans=0, sum=0;
      |             ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 500 KB Output is correct
2 Incorrect 1 ms 604 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Incorrect 2 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 45 ms 636 KB Output is correct
2 Execution timed out 1049 ms 2396 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 45 ms 444 KB Output is correct
3 Execution timed out 1048 ms 2396 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 1 ms 600 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 500 KB Output is correct
2 Incorrect 1 ms 604 KB Output isn't correct
3 Halted 0 ms 0 KB -