제출 #1144109

#제출 시각아이디문제언어결과실행 시간메모리
1144109dpsaveslivesCake (CEOI14_cake)C++20
0 / 100
319 ms10096 KiB
#include<bits/stdc++.h> using namespace std; const int Len = 2.5e5 + 5; struct node { int val,idx; }d[Len]; bool cmp(node x,node y){return x.val > y.val;} int Id[Len],n,a,q,ans[Len << 2][2],rk[Len]; int ls(int x){return x << 1;} int rs(int x){return x << 1 | 1;} void push_up(int x,int t){ans[x][t] = min(ans[ls(x)][t] , ans[rs(x)][t]);} void build(int p,int l,int r,int t) { if(l == r) { ans[p][t] = d[l].val; return; } int mid = (l + r) >> 1; build(ls(p) , l , mid , t); build(rs(p) , mid + 1 , r , t); push_up(p , t); } void update(int p,int l,int r,int idx,int w,int t) { if(l == r) { ans[p][t] = w; return; } int mid = (l + r) >> 1; if(idx <= mid) update(ls(p) , l , mid , idx , w , t); else update(rs(p) , mid + 1 , r , idx , w , t); push_up(p , t); } int query(int p,int l,int r,int nl,int nr,int t) { if(nl <= l && nr >= r) return ans[p][t]; int mid = (l + r) >> 1 , res = 1e9; if(nl <= mid) res = min(res , query(ls(p) , l , mid , nl , nr , t)); if(nr > mid) res = min(res , query(rs(p) , mid + 1 , r , nl , nr , t)); return res; } int find_l(int p,int l,int r,int fd) { if(ans[p][0] > fd) return l - 1;//找不到 if(l == r) return l; int mid = (l + r) >> 1; if(ans[rs(p)][0] < fd) return find_l(rs(p) , mid + 1 , r , fd); else return find_l(ls(p) , l , mid , fd); } int find_r(int p,int l,int r,int fd) { if(ans[p][1] > fd) return r + 1; if(l == r) return l; int mid = (l + r) >> 1; if(ans[ls(p)][1] < fd) return find_r(ls(p) , l , mid , fd); else return find_r(rs(p) , mid + 1 , r , fd); } char s[5]; int main() { scanf("%d %d",&n,&a); for(int i = 1 ; i <= n ; i ++) { scanf("%d",&d[i].val); d[i].val = n - d[i].val + 1; d[i].idx = i; } if(a != 1) build(1 , 1 , a - 1 , 0); if(a != n) build(1 , a + 1 , n , 1); sort(d + 1 , d + 1 + n , cmp); for(int i = 1 ; i <= n ; i ++) rk[i] = d[i].idx , Id[d[i].idx] = i; scanf("%d",&q); int nowminrk = 1; while(q --) { scanf("%s",s + 1); if(s[1] == 'F') { int x;scanf("%d",&x); if(x == a) printf("0\n"); else if(x > a) { if(a == 1){printf("%d\n",x - 1);continue;} int Minn = query(1 , a + 1 , n , a + 1 , x , 1) , Pos = a - 1 - find_l(1 , 1 , a - 1 , Minn); printf("%d\n",Pos + x - a); } else { if(a == n){printf("%d\n",a - x);continue;} int Minn = query(1 , 1 , a - 1 , x , a - 1 , 0) , Pos = find_r(1 , a + 1 , n , Minn) - a - 1; printf("%d\n",Pos + a - x); } } else { int x,y,nowp = min(n , 10);scanf("%d %d",&x,&y); for(int i = 1 ; i <= min(n , 10) ; i ++) if(rk[i] == x) nowp = i; for(int i = nowp - 1 ; i >= y ; i --) rk[i + 1] = rk[i]; rk[y] = x; for(int i = y ; i >= 1 ; i --) { nowminrk --; if(rk[i] > a) update(1 , a + 1 , n , rk[i] , nowminrk , 1); else if(rk[i] < a) update(1 , 1 , a - 1 , rk[i] , nowminrk , 0); } } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

cake.cpp: In function 'int main()':
cake.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |         scanf("%d %d",&n,&a);
      |         ~~~~~^~~~~~~~~~~~~~~
cake.cpp:67:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |                 scanf("%d",&d[i].val);
      |                 ~~~~~^~~~~~~~~~~~~~~~
cake.cpp:75:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |         scanf("%d",&q);
      |         ~~~~~^~~~~~~~~
cake.cpp:79:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |                 scanf("%s",s + 1);
      |                 ~~~~~^~~~~~~~~~~~
cake.cpp:82:36: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |                         int x;scanf("%d",&x);
      |                               ~~~~~^~~~~~~~~
cake.cpp:101:57: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  101 |                         int x,y,nowp = min(n , 10);scanf("%d %d",&x,&y);
      |                                                    ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...